資料介紹
描述
在本文中,讓我們學習如何克服 NodeMCU 重置后數(shù)據(jù)被破壞的問題。這個問題在 Arduino 中也存在。為了在 Arduino 中解決這個問題,我們使用 EEPROM [電可擦可編程只讀存儲器]。它是寫入數(shù)據(jù)的非易失性存儲器。這里,非易失性意味著一旦斷電,數(shù)據(jù)就不會丟失。因此,數(shù)據(jù)是永久寫入的,除非用戶決定,否則它不會改變。作為一個很好的類比,可以將 EEPROM 視為計算機上的硬盤驅(qū)動器。
但是像 NodeMCU 這樣的板具有比 EEPROM 更先進的閃存。在 EEPROM 中,數(shù)據(jù)以字節(jié)形式存儲,因此存儲大量數(shù)據(jù)會很復雜,并且讀寫次數(shù)有限。而在閃存中,它就像一個拇指驅(qū)動器,具有比 EEPROM 更多的讀寫操作。除此之外,通過使用文件系統(tǒng),我們可以創(chuàng)建文件、文件夾,并且用戶可以控制重命名或刪除他們創(chuàng)建的任何內(nèi)容。即使文件系統(tǒng)與程序存儲在同一個閃存芯片上,當一個新的草圖被編程時,它也不會修改文件系統(tǒng)的內(nèi)容。在 ESP8266 上使用板載閃存有兩個文件系統(tǒng)。一個是SPIFFS ,另一個是LittleFS. SPIFFS 目前已棄用,可能會在 ESP 核心的未來版本中刪除,所以讓我們只關(guān)注 LittleFS。
ESP8266 的 LittleFS 主要類似于計算機中的常規(guī)文件系統(tǒng),可以在其中導航、創(chuàng)建、重命名、刪除或修改文件。
(注:本文最初發(fā)表于CircuitDigest ,與合著者Lavanya R一起發(fā)表。您可以在此處找到原始文章。)
補給品
這些是可以幫助您輕松完成此項目的產(chǎn)品列表
(附屬鏈接)
- 16x2 液晶顯示器:
- I2C 模塊(PC8574T):
- 面包板:
- 節(jié)點MCU:
- WeMos D1 mini(替代):
- 跳線(公對母):
第 1 步:連接 16x2 LCD 顯示器:
LCD代表Liquid Crystal Display;是一種顯示微控制器/開發(fā)板文本輸出的經(jīng)濟高效的方式。16x2 LCD 顯示器每行可顯示 16 個字符,并且有 2 行這樣的行。如果有更多信息需要顯示,信息可以滾動顯示在 LCD 屏幕上。現(xiàn)在,當涉及到顯示多于“開或關(guān)”的信息時,LED 和七段顯示器會受到限制,因為它們可以分別顯示“開或關(guān)”狀態(tài)和字母數(shù)字字符。使用 LCD 可以輕松繞過此限制,但它們占用了微控制器或 NodeMCU 的大部分引腳。為避免這種情況,我們使用 I2C 模塊;通過使用 I2C 模塊,只需 4 個引腳即可實現(xiàn)與 LCD 的接口。
![poYBAGNxioqAETSUABWO03llRfw273.jpg](https://file.elecfans.com/web2/M00/7A/43/poYBAGNxioqAETSUABWO03llRfw273.jpg)
首先,將 I2C 模塊連接到 LCD 顯示器。將母頭引腳焊接到 LCD 顯示器并連接 I2C 模塊,使 I2C 的四個引腳(GND、VCC、SDA、SCL)指向外部。
現(xiàn)在給電路供電,將 I2C 模塊的 GND 引腳連接到 ESP8266 的 GND 引腳,并將 I2C 模塊的 VCC 連接到 ESP8266 的 Vin 引腳。(這兩個引腳為液晶屏供電)
將 I2C 模塊的 SDA 連接到 ESP8266 的 D2 引腳 將 I2C 模塊的 SCL 連接到 ESP8266 的 D1 引腳
第 2 步:16x2 LCD 代碼:
![pYYBAGNxipGAe-GwABQQCzLqDzs215.jpg](https://file.elecfans.com/web2/M00/7A/D2/pYYBAGNxipGAe-GwABQQCzLqDzs215.jpg)
對于想了解基礎(chǔ)知識的人可以從這里開始,如果沒有,您可以跳到一步 - 從 LittleFS 開始
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int lcdColumns = 16;int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup(){
lcd.init(); lcd.backlight();
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print("Hello World!");delay(1000);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Hello World!");
delay(1000);
lcd.clear();
}
#include <LiquidCrystal_I2C.h>
該庫包含在使用 I2C 模塊的接口中。
int lcdColumns = 16;int lcdRows = 2;
這兩行用來設(shè)置LCD的列數(shù)和行數(shù);在我們的例子中,它是 16 列和 2 行。
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
這是設(shè)置 LCD 地址、列數(shù)和行數(shù)。(如果您不知道您的顯示地址,請運行 I2C 掃描儀草圖)
void setup()
{
lcd.init();
lcd.backlight();
}
void setup 函數(shù)只運行一次,所以在這里,初始化和聲明完成。“l(fā)cd.init();” 用于初始化 LCD 和“l(fā)cd.backlight();” 用于打開 LCD 顯示器的背光。
lcd.setCursor(0, 0);
在 void 循環(huán)中,“.setCursor”函數(shù)用于將光標設(shè)置到所需位置。因為我們要顯示消息“Hello World!” 在第一列第一行,我們給出位置“(0, 0)”
lcd.print("Hello World!");
delay(1000);
lcd.print” 函數(shù)將打印給出的任何信息。在這里,讓我們顯示“Hello World!” 并會產(chǎn)生 1 秒的延遲。這確保顯示的消息將保持足夠長的時間讓我們正確看到它。
lcd.clear();
此功能將清除顯示以打印新信息。
lcd.setCursor(0,1);
現(xiàn)在,要創(chuàng)建一個小動畫,讓我們將光標設(shè)置到第一列,第二行,以便在第一行顯示消息一秒鐘后,它將轉(zhuǎn)移到第二行。
lcd.print("Hello World!");
delay(1000);
設(shè)置為第二行后,打印相同的消息以顯示,延遲將確保消息在第二行也保持 1 秒。
lcd.clear();
這將清除屏幕,以便下次打印消息時很方便。這不是絕對必需的,但以這種方式編寫程序是一種很好的做法。
第 3 步:LittleFs 帶 16x2 LCD 顯示屏和 ESP8266 [代碼]
使用 LittleFs 對 flash 存儲器進行寫入、讀取和刪除文件的電路與上一步相同,顯示“Hello World”
#include
#include
#include
// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
// set LCD address, number of columns and rows
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
//function prototypes
void readData();
void writeData(String data);
void deleteData();
void setup() {
//Start the serial monitor
Serial.begin(115200);
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
// set cursor to first column, first row
lcd.setCursor(0, 0);
lcd.print("Little FS Demo");
delay(1000);
//Start LittleFS
if(!LittleFS.begin()){
Serial.println("An Error has occurred while mounting LittleFS");
//Print the error on display
lcd.clear();
lcd.print("Mounting Error");
delay(1000);
return;
}
//Read the saved data
readData();
}
void loop() {
//Take input from user on serial monitor
if(Serial.available())
{
String data = Serial.readString();
Serial.println(data);
if(data == "D") // To delete the file
{
deleteData();
Serial.println("File deleted!");
return;
}
else if(data == "R") // To read the file
{
readData();
return;
}
Serial.println("Writing Data...");
writeData(data);
Serial.println("done Writing Data!");
}
}
void readData()
{
//Open the file
File file = LittleFS.open("/SavedFile.txt", "r");
//Check if the file exists
if(!file){
//Read the file data and display it on LCD
Serial.println("No Saved Data!");
lcd.clear();
lcd.print("No Saved Data!");
return;
}
lcd.clear();
lcd.print("Saved Data :");
// set cursor to first column, second row
lcd.setCursor(0,1);
//Display on the LCD
while(file.available()){
lcd.write(file.read());
}
//reset cursor poisition
lcd.setCursor(0,0);
//Close the file
file.close();
}
void writeData(String data)
{
//Open the file
File file = LittleFS.open("/SavedFile.txt", "w");
//Write to the file
file.print(data);
delay(1);
//Close the file
file.close();
Serial.println("Write successful");
lcd.clear();
lcd.print("Data Saved :");
// set cursor to first column, second row
lcd.setCursor(0,1);
// print the data on the LCD
lcd.print(data);
// reset cursor position
lcd.setCursor(0,0);
}
void deleteData()
{
//Remove the file
LittleFS.remove("/SavedFile.txt");
lcd.clear();
lcd.print("Data Deleted");
}
需要以下這些庫才能與 LCD 顯示器、I2C 和 LittleFs 一起使用。
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <LittleFS.h>
int lcdColumns = 16;
int lcdRows = 2;
這是設(shè)置 LCD 的列數(shù)和行數(shù)。在我們的例子中,16x2 表示 16 列和 2 行。
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
該函數(shù)用于設(shè)置 LCD 地址、列數(shù)和行數(shù)。
void readData();
void writeData(String data);
void deleteData();
這些是函數(shù)原型。要將數(shù)據(jù)讀取到閃存,請使用自定義函數(shù)“readData()”。同樣,“writeData”和“deleteData”是自定義函數(shù),分別用于寫入數(shù)據(jù)和從LittleFs中刪除數(shù)據(jù)。
Serial.begin(115200);
啟動串行監(jiān)視器并將波特率設(shè)置為 115200。
lcd.init();
lcd.backlight();
“l(fā)cd.init”函數(shù)將初始化LCD,.backlight函數(shù)將打開LCD背光
lcd.setCursor(0, 0);
lcd.print("Little FS Demo");
delay(1000);
像以前一樣,這會將光標設(shè)置到第一列第一行并打印消息“Little FS Demo”并等待一秒鐘。
if(!LittleFS.begin())
{
Serial.println("An Error has occurred while mounting LittleFS");
lcd.clear();
lcd.print("Mounting Error");
delay(1000);
return;
}
在這里,使用這部分程序是因為如果 Little Fs 無法啟動,則應(yīng)顯示錯誤消息以通知用戶 Little Fs 無法啟動。
檢查文件是否已正確打開,如果未正確打開,將打印錯誤消息并結(jié)束函數(shù)。或者它將打印之前寫入的數(shù)據(jù)。LCD 顯示屏上將顯示“安裝錯誤”信息。
readData();
這行代碼用于讀取保存的數(shù)據(jù)。
void loop()
{
if(Serial.available())
{
String data = Serial.readString();
Serial.println(data);
if(data == "D")
{
deleteData();
Serial.println("File deleted!");
return;
}
else if(data == "R")
{
readData();
Return;
}
Serial.println("Writing Data...");
writeData(data);
Serial.println("done Writing Data!");}
}
當串行從串行監(jiān)視器接收到一些數(shù)據(jù)時,使用“serial.readString()”讀取數(shù)據(jù)并存儲在字符串“data”中。然后它會檢查用戶輸入了什么命令,并根據(jù)它執(zhí)行刪除/讀/寫。
void readData()
{
File file = LittleFS.open("/SavedFile.txt", "r");
if(!file)
{
Serial.println("No Saved Data!");
lcd.clear();
lcd.print("No Saved Data!"); return;
}
lcd.clear();
lcd.print("Saved Data :");
lcd.setCursor(0,1);
while(file.available())
{
lcd.write(file.read());
}lcd.setCursor(0,0);
file.close();
}
此功能將打開 LittleFs 文件和保存的文本文件,并將其顯示在串行監(jiān)視器和 LCD 屏幕上。
void writeData(String data)
{
//Open the file
File file = LittleFS.open("/SavedFile.txt", "w");
//Write to the file
file.print(data);
delay(1);
//Close the file
file.close();
Serial.println("Write successful");
lcd.clear();
lcd.print("Data Saved :");
// set cursor to first column, second row
lcd.setCursor(0,1);
// print the data on the LCD
lcd.print(data);
// reset cursor position
lcd.setCursor(0,0);
}
該函數(shù)將打開 LittleFs 文件并寫入用戶數(shù)據(jù)并將其顯示在串行監(jiān)視器和 LCD 屏幕上。
void deleteData()
{
//Remove the file
LittleFS.remove("/SavedFile.txt");
lcd.clear();
//update the display
lcd.print("Data Deleted");
}
該函數(shù)將刪除 LittleFs 文件并寫入用戶數(shù)據(jù)并顯示在串行監(jiān)視器和 LCD 屏幕上。
第 4 步:小 FS 工作
![poYBAGNxipSAVKeuAACEYh0Fyl8822.png](https://file.elecfans.com/web2/M00/7A/43/poYBAGNxipSAVKeuAACEYh0Fyl8822.png)
這是將數(shù)據(jù)寫入閃存。這很簡單。代碼的編寫方式允許用戶非常輕松地鍵入數(shù)據(jù)。只需打開串行監(jiān)視器并鍵入數(shù)據(jù)并按“輸入”(確保波特率 = 115200并且未選擇行尾)。輸入的任何內(nèi)容都將作為數(shù)據(jù)保存到 LittleFs 文件系統(tǒng)中。LittleFs 文件系統(tǒng)安裝在 ESP8266 的閃存上。除了在 LittleFs 文件系統(tǒng)中寫入之外,還可以完成另外兩項任務(wù)。那些正在閱讀和刪除。為此,代碼以這樣一種方式編寫,即它接受用戶的輸入并執(zhí)行用戶請求的功能。
![pYYBAGNxipaAXWTlAAC7Avyb7-A576.png](https://file.elecfans.com/web2/M00/7A/D2/pYYBAGNxipaAXWTlAAC7Avyb7-A576.png)
當用戶輸入“D”時,文件被刪除,“R”讀取文件。
(注意:它區(qū)分大小寫,并且像“DD”或“dD”而不是“D”之類的任何錯誤都將被視為輸入數(shù)據(jù),這將被覆蓋在現(xiàn)有數(shù)據(jù)上?!癛”讀取文件)
第 5 步:最后的想法
![pYYBAGNxip2AWYZEAA_hzDAXhPI295.jpg](https://file.elecfans.com/web2/M00/7A/D2/pYYBAGNxip2AWYZEAA_hzDAXhPI295.jpg)
這只是對 LittleFS類型文檔的介紹。您可以更進一步,從傳感器獲取輸入并嘗試將收集的數(shù)據(jù)存儲在 LittleFS 中(盡管這不是一個可行的項目,因為可用的閃存較少且無法有效存儲數(shù)據(jù))。
如果您對該項目有任何疑問,請隨時在下面發(fā)表評論,對于項目,請查看我的hackster 個人資料。
重要的提示
要安裝請按照此步驟
Go to Arduino IDE ---> Sketch - --> Include Library ---> Add .ZIP Library ---> select this zip file
如果您想查看原始文章,請單擊此處。
- 如何使用Arduino IDE編程ESP8266-12E
- 使用Arduino編程ESP8266 ESP 01
- 使用Arduino IDE創(chuàng)建ESP8266網(wǎng)絡(luò)服務(wù)器
- 使用Arduino IDE的ESP8266溫度濕度監(jiān)控網(wǎng)絡(luò)應(yīng)用程序
- ESP8266 Arduino通訊
- 使用Arduino配置ESP8266
- 解決 用arduino ide 開發(fā)nodemcu 加載ESP8266庫的問題
- 配置esp8266開發(fā)板的Arduino開發(fā)環(huán)境
- esp8266 nodeMCU arduino開發(fā)環(huán)境
- 天貓精靈 python_利用天貓精靈控制ESP8266(NodeMCU開發(fā)板)arduino ide開發(fā)
- Esp8266閃存文件系統(tǒng)LIttleFS
- esp筆記(2)使用Arduino IDE 開發(fā) esp8266
- 利用天貓精靈控制ESP8266(NodeMCU開發(fā)板)arduino ide開發(fā)
- 如何建立一個帶Arduino IDE的ESP8266 Web服務(wù)器 2次下載
- 如何使用Arduino ESP8266開發(fā)板配置標準的Arduino開發(fā)環(huán)境 48次下載
- ESP8266紅外信號收發(fā)實驗 2013次閱讀
- ESP8266硬件 4865次閱讀
- ESP8266/ESP32自動下載原理 4741次閱讀
- 如何使用ESP8266制作可配置的Web服務(wù)器 1.3w次閱讀
- 如何利用ESP8266制作一個簡單的四軸飛行器 5117次閱讀
- ESP8266上運行代碼如何實現(xiàn) 3039次閱讀
- 如何利用ESP8266實現(xiàn)智能手表的設(shè)計 3369次閱讀
- STM32系列設(shè)計,ESP8266聯(lián)網(wǎng)授時時鐘 8097次閱讀
- 從5方面描述STM32F407+ESP8266連接機智云過程 1.1w次閱讀
- esp8266中文資料匯總(esp8266引腳圖_與單片機連接_串口wifi實例) 22.5w次閱讀
- esp8266固件如何升級_ESP8266WIFI模塊固件升級 4.2w次閱讀
- ESP8266 Wi-Fi到底傳多遠_esp8266 wifi信號強度測距 5.2w次閱讀
- 遠程控制通訊--基于Arduino + ESP8266控制LED燈 4w次閱讀
- esp8266 at指令集詳解 14.3w次閱讀
- esp8266串口wifi實例 1.9w次閱讀
下載排行
本周
- 1IP6823 支持 qi 認證的無線充電發(fā)射控制 SOC
- 1.01 MB | 1次下載 | 免費
- 2IP6824? 全集成QI?無線充電發(fā)射控制SOC
- 1.22 MB | 1次下載 | 免費
- 3PESD18VY1BBIF保護二極管規(guī)格書
- 4.56MB | 次下載 | 免費
- 474HC4050緩沖器規(guī)格書
- 217.58KB | 次下載 | 免費
- 574HC193;74HC7193二進制加減計數(shù)器規(guī)格書
- 327.93KB | 次下載 | 免費
- 674HC73-Q100雙JK觸發(fā)器規(guī)格書
- 220.85KB | 次下載 | 免費
- 7ASW3410 USB3.1高速數(shù)據(jù)開關(guān)切換規(guī)格書
- 1.39 MB | 次下載 | 免費
- 8多款常用電子電路分享
- 7.96 MB | 次下載 | 2 積分
本月
- 1A7159和A7139射頻芯片的資料免費下載
- 0.20 MB | 55次下載 | 5 積分
- 2零死角玩轉(zhuǎn)STM32F103—指南者
- 26.78 MB | 41次下載 | 1 積分
- 3PIC12F629/675 數(shù)據(jù)手冊免費下載
- 2.38 MB | 36次下載 | 5 積分
- 4PIC16F716 數(shù)據(jù)手冊免費下載
- 2.35 MB | 18次下載 | 5 積分
- 5dsPIC33EDV64MC205電機控制開發(fā)板用戶指南
- 5.78MB | 8次下載 | 免費
- 6STC15系列常用寄存器匯總免費下載
- 1.60 MB | 7次下載 | 5 積分
- 7AN-1267: 使用ADSP-CM408F ADC控制器的電機控制反饋采樣時序
- 1.41MB | 5次下載 | 免費
- 8模擬電路仿真實現(xiàn)
- 2.94MB | 4次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935124次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73813次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論