一板网电子技术论坛

风筝
发表于: 2021-5-20 17:19:19 | 显示全部楼层

对于那些熟悉使用Firebase来获取数据并将其更新到实时数据库的人来说,他们都知道这样一个令人烦恼的问题,当NodeMCU复位时,数据将被销毁。因此,在本篇文章中,我们将学习如何使用LittleFS来解决该问题。这个问题在Arduino中也存在,但是要在Arduino中解决此问题,我们使用EEPROM。它是用于写入数据的非易失性存储器。在这里,非易失性意味着一旦切断电源,数据就不会丢失。因此,数据将被永久写入,除非用户决定更改,否则数据将不会改变。


但是像NodeMCU这样的开发板具有比EEPROM更高级的闪存。在EEPROM中,数据被存储为字节,因此,存储大量数据将是复杂的,并且读写寿命受到限制。而在闪存中,其读写寿命比EEPROM多得多。与此同时,通过使用文件系统,我们可以创建文件、文件夹,并且用户可以控制重命名或删除他们创建的任何内容。即使文件系统与程序存储在同一闪存芯片上,但在编写新草图时,它也不会修改文件系统内容。 ESP8266上有两个使用板载Flash的文件系统。一个是SPIFFS,另一个是LittleFS。目前不推荐使用SPIFFS,并且在ESP的未来版本中可能会将其删除。因此,让我们了解一下LittleFS。在本文中,我们将阐述LittleFS的基础知识及其工作方式。


了解如何将数据保存到NodeMCU的闪存(写入LittleFS)

在本节中,我们将讨论在小型FS文件系统中读取和写入数据的过程。它将为您提供有关整个系统如何工作的基本概念。


将数据写入NodeMCU的闪存(将数据写入LittleFS):

将数据写入LittleFS文件系统非常容易,要在LittleFS文件系统中写入数据,我们有非常简单的代码,我们将在后面讨论。代码的编写方式使用户可以在串口监视器上键入数据,从而可以轻松存储数据。写入所需的数据后,我们需要按Enter键。输入的任何内容都将作为数据,并将其保存到LittleFS文件系统中。 LittleFS文件系统安装在ESP8266的Flash存储器中。除了将数据写入LittleFS文件系统之外,它还可以用于读取和删除数据。为此,编写代码的方式是要从用户那里获取输入并执行用户要求的功能。当用户输入“ D”时,文件被删除。。要读取数据,我们需要按“ R”以读取文件。


从NodeMCU的闪存中读取数据(从LittleFS中读取):

试图读取数据而不先写入任何内容时,LCD会显示一条错误消息,提示“No saved data”。从NodeMCU的闪存读取数据一点也不复杂。 readData()函数用于读取数据和lcd.write(file.read())函数用于在LCD显示屏上打印数据。


从NodeMCU的闪存中删除数据(从LittleFS删除):

要从LittleFS删除数据,可以使用LittleFS.remove()函数删除文件的内容,该文件的路径应由用户指定。


使用ESP8266搭建LittleFS测试电路所需的组件

●    LCD显示屏1602

●    I2C模块(PC8574T)

●    面包板

●    跳线


LCD显示模块1602:

首先,让我们从1602 LCD显示屏的基本知识开始,并在LCD上显示一条简单的消息。LCD是一种显示微控制器/开发板文本输出的经济有效方式。一个1602的LCD可以在每行显示16个字符,并具有2条这样的行。如果需要显示更多行信息,则消息可以在LCD屏幕上滚动。现在,当显示超过“ ON”或“ OFF”的信息时,LED和“七段式显示器”存在局限性,因为它们可以分别显示“ ON”或“ OFF”状态和字母数字字符。通过使用LCD可以轻松克服此限制,但它们占用了微控制器或NodeMCU的大部分引脚。为了避免这种情况,我们使用I2C模块。通过使用I2C模块,仅4个引脚即可实现LCD的连接。

LCD-Display-Module.jpg

16X2-LCD-Display-Module.png


将LCD与ESP8266相连。使用该项目我们可以从LittleFS读取数据。正如我们在引脚图中看到的那样,需要将LCD的8个数据引脚连接到NodeMCU,这不会为其他应用留下NodeMCU的引脚。因此,我们使用I2C模块,如下图所示。

I2C-LCD-Driver-Module.png


下面的图片显示了连接到LCD背面的I2C LCD驱动程序模块。

LittleFs-with-ESP8266.jpg


LittleFS测试电路的原理图

使用ESP8266、I2C LCD的LittleFS测试电路的完整原理图如下所示。

LittleFS-With-ESP8288-and-I2C-Display.png


首先,将I2C模块连接到LCD。焊接排母到LCD然后连接I2C模块,使I2C的四个引脚(GND、VCC、SDA、SCL)朝外。现在,要为电路供电,请将I2C模块的GND引脚连接到ESP8266的GND,然后将I2C模块的VCC连接到ESP8266的Vin引脚。将I2C模块的SDA连接至ESP8266的D2引脚,并将I2C模块的SCL连接至ESP8266的D1引脚。

跳转到指定楼层
风筝
发表于: 2021-5-20 17:59:25 | 显示全部楼层

在ESP8266上将数据写入LittleFS的Arduino代码

首先我们需要在Arduino IDE上包括所有必需的库。当我们使用I2C LCD和LittleFS时,我们需要下载并安装以下两个库。下载链接如下。

●    位于GitHub的Arduino-LiquidCrystal-I2C

●    位于GitHub的LittleFS


在LCD显示屏和ESP8266上实现LittleF读写和删除操作

电路连接与上图一致。

  1. #include <LiquidCrystal_I2C.h>
  2. #include <Wire.h>
  3. #include "LittleFS.h"
复制代码

需要上述库才能与LCD、I2C和LittleFS一起使用。

  1. int lcdColumns = 16;
  2. int lcdRows = 2;
复制代码

这是用来设置LCD的列数和行数。在本文中,16x2表示16列2行。

  1. LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
复制代码

此函数用于设置LCD地址,列数和行数。

  1. void readData();
  2. void writeData(String data);
  3. void deleteData();
复制代码

这些是功能原型。要将数据读取到闪存,请使用自定义函数readData()。同样,“ writeData”和“ deleteData”是分别从LittleFS写入和删除数据的自定义函数。


  1. void setup() {
  2.             Serial.begin(115200);
  3.             lcd.init();
  4. lcd.backlight();
复制代码

接下来,我们介绍setup函数。在该函数中,我们启动串口监视器并将波特率设置为115200。lcd.init()函数将初始化LCD,.backlight函数将打开LCD背光。

  1. lcd.setCursor(0, 0);
  2. lcd.print("Little FS Demo");
  3.             delay(1000);
复制代码

像前文一样,这会将光标设置到第一列第一行,并显示消息“ Little FS Demo”,然后等待第二秒钟。延迟用于稳定系统。

  1. if(!LittleFS.begin()){
  2.             Serial.println("An Error has occurred while mounting LittleFS");
复制代码

之所以使用该程序的这一部分,是因为如果Little Fs无法启动,则应该显示一条错误消息,以通知用户Little FS无法启动。

  1.             lcd.clear();
  2.             lcd.print("Mounting Error");
  3.             delay(1000);
  4.             return;
  5. }
  6. readData();
  7. }
复制代码

如果成功安装并初始化了LittleFS,我们将使用该代码片段读取已保存的数据


  1. void loop() {
  2.     if(Serial.available())
  3.     {
  4.          String data = Serial.readString();
  5.          Serial.println(data);
复制代码

接下来,我们介绍loop函数。在该函数中,我们声明“ if语句”,当从串口监视器窗口接收到某些数据时触发。然后,读取数据并将其存储在“ data”字符串中,并且要读取该字符串,我们将使用“serial.readString function()。显示屏中打印的数据将被写入nodeMCU的闪存中。 “ Serial.available”函数将在串口监视器上接收用户的输入,并将其存储在“ data”字符串中。然后,它将检查用户输入了什么命令。

  1.          if(data == "D")
  2.          {
  3.             deleteData();
  4.             Serial.println("File deleted!");
  5.             return;
  6.          }
复制代码

如果用户输入了“ D”,它将调用“ deleteData”函数来删除文件然后在LCD显示信息“File deleted!”。。

  1.          else if(data == "R")
  2.          {
  3.             readData();
  4.             Return;
  5.          }
复制代码

同样,如果用户输入了“ R”,它将调用函数“ readData”从闪存中读取文件

  1.          Serial.println("Writing Data...");
  2.          writeData(data);
  3.          Serial.println("done Writing Data!");
  4.     }
  5. }
  6. void readData()
  7. {
  8.    File file = LittleFS.open("/SavedFile.txt", "r");
复制代码

创建另一个名为readData()的函数。创建一个文件对象,并传递文件路径和字母“ r”以表示正在读取文件。要读取数据,首先必须访问文件,这就是使用它的原因。这将打开LittleFS文件,并在该保存的文本文件中。

  1.    if(!file){
  2.     Serial.println("No Saved Data!");
  3.     lcd.clear();
  4.     lcd.print("No Saved Data!");
  5.     return;
  6.    }
复制代码

现在,我们需要检查文件是否打开。如果是这样,我们将使用“ while循环”和“ file.available()”检查文件中的数据,因为“ file.read()”函数一次输出一个字符。因此,请使用“ serial.write”函数一次打印一个字符。如果条件为“ if”,则将检查文件是否存在。如果没有,它将打印一条消息,提示“No saved data”。在串口监视器上,它将清除LCD并显示相同的消息。

  1. lcd.clear();
  2. lcd.print("Saved Data :");
  3. lcd.setCursor(0,1);
  4. while(file.available()){
  5. lcd.write(file.read());
  6. }
  7. lcd.setCursor(0,0);
  8. file.close();
  9. }
复制代码

如果找到该文件,则“ lcd.clear”函数将清空LCD并显示消息“ Saved Data:”。为了表明它将要从闪存和第二行读取数据,它将开始显示该消息。因此,将光标设置在第一列,第二行位置,然后从闪存中读取文件,并将其写入LCD。显示后,它将重置光标位置,并且file.close()函数将关闭文件。

  1. void writeData(String data)
  2. {
  3.   //Open the file
  4.   File file = LittleFS.open("/SavedFile.txt", "w");
  5.   //Write to the file
  6.   file.print(data);
  7. delay(1);
  8.   //Close the file
  9.   file.close();
复制代码

writeData()函数中,我们首先创建一个要在其中保存数据的文件。为此,请在其中使用“ File file = LittleFS.open()”,以放置应保存的路径。本文使用的是“ /SavedFile.txt”。如果文件已经存在,它将重写文件中的数据;如果文件不存在,它将创建一个名为SavedFile.txt的新文件。此函数的第二个参数是“ w”,表示正在写入文件。调用“ writeFunction”函数以使用LittleFs写入闪存。打开“ LittleFs”以访问保存的文本文件。然后使用“ file.print”写入数据。,“ file.close”用于在写入后关闭文件。

  1.   Serial.println("Write successful");
  2.   lcd.clear();
  3.   lcd.print("Data Saved :");
  4.   // set cursor to first column, second row
  5.   lcd.setCursor(0,1);
  6.   // print the data on the LCD
  7.   lcd.print(data);
  8.   // reset cursor position
  9.   lcd.setCursor(0,0);
  10. }
复制代码

在串口监视器上,显示“Write successful”消息。然后清空LCD以打印“Data Save:”,然后将光标设置在(0,1)位置以在LCD上打印写入的数据。然后将光标位置重新设置为(0,0)。

  1. void deleteData()
  2. {
  3.    //Remove the file
  4.    LittleFS.remove("/SavedFile.txt");
  5.    lcd.clear();
  6.    lcd.print("Data Deleted");
  7. }
复制代码

创建另一个名为deleteData()的自定义函数。在这里,使用代码片段“ LittleFS.remove(“/SavedFile.txt”);”其中“ /SavedFile.txt”是必须删除的文件的路径。 “ deleteData”函数是删除文件。因此,首先,访问已保存的文本文件,然后将其删除。然后在LCD上打印一条消息“Data Deleted”。


LittleFS文件系统的测试

在第一次使用时,由于没有任何数据可显示,因此LCD屏幕将显示消息“No data Saved”


通过串口监视器输入数据后,可以在串口监视器中键入“ R”来读取数据或通过键入“ D”来删除数据。

NodeMCU-Serial-Monitor.png


上图显示了从串口监视器向Little Fs写入新数据。我们在此处输入的新数据是“new data 123”,但是您可以使用任何数据。它可以是字母数字字符的组合。

ESP8266-Serial-Monitor.png

同样,我们可以使用“ R”和“ D”读取和删除数据。在上图中,我们使用D删除了数据,然后当我们再次尝试读取数据时,它显示“No saved Data”。


如上图所示,我们还将LCD连接到nodemcu以显示已保存的数据,LCD显示存储在nodemcu闪存中的数据状态。

Integrate-LittleFS-with-ESP8266.jpg


当NodeMCU断开电源并重新连接时,它将从NodeMCU的闪存中读取。现在,从PC断开NodeMCU的连接,然后再次重新连接。这应该直接调用读取函数并显示存储在闪存中的数据。如您所见,我们可以在显示屏上看到“No saved data”。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 574 | 回复: 1152



手机版|

GMT+8, 2021-9-26 15:05 , Processed in 0.029815 second(s), 9 queries , MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2021 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表