资料介绍
描述
在本文中,让我们学习如何克服 NodeMCU 重置后数据被破坏的问题。这个问题在 Arduino 中也存在。为了在 Arduino 中解决这个问题,我们使用 EEPROM [电可擦可编程只读存储器]。它是写入数据的非易失性存储器。这里,非易失性意味着一旦断电,数据就不会丢失。因此,数据是永久写入的,除非用户决定,否则它不会改变。作为一个很好的类比,可以将 EEPROM 视为计算机上的硬盘驱动器。
但是像 NodeMCU 这样的板具有比 EEPROM 更先进的闪存。在 EEPROM 中,数据以字节形式存储,因此存储大量数据会很复杂,并且读写次数有限。而在闪存中,它就像一个拇指驱动器,具有比 EEPROM 更多的读写操作。除此之外,通过使用文件系统,我们可以创建文件、文件夹,并且用户可以控制重命名或删除他们创建的任何内容。即使文件系统与程序存储在同一个闪存芯片上,当一个新的草图被编程时,它也不会修改文件系统的内容。在 ESP8266 上使用板载闪存有两个文件系统。一个是SPIFFS ,另一个是LittleFS. SPIFFS 目前已弃用,可能会在 ESP 核心的未来版本中删除,所以让我们只关注 LittleFS。
ESP8266 的 LittleFS 主要类似于计算机中的常规文件系统,可以在其中导航、创建、重命名、删除或修改文件。
(注:本文最初发表于CircuitDigest ,与合著者Lavanya R一起发表。您可以在此处找到原始文章。)
补给品
这些是可以帮助您轻松完成此项目的产品列表
(附属链接)
- 16x2 液晶显示器:
- I2C 模块(PC8574T):
- 面包板:
- 节点MCU:
- WeMos D1 mini(替代):
- 跳线(公对母):
第 1 步:连接 16x2 LCD 显示器:
LCD代表Liquid Crystal Display;是一种显示微控制器/开发板文本输出的经济高效的方式。16x2 LCD 显示器每行可显示 16 个字符,并且有 2 行这样的行。如果有更多信息需要显示,信息可以滚动显示在 LCD 屏幕上。现在,当涉及到显示多于“开或关”的信息时,LED 和七段显示器会受到限制,因为它们可以分别显示“开或关”状态和字母数字字符。使用 LCD 可以轻松绕过此限制,但它们占用了微控制器或 NodeMCU 的大部分引脚。为避免这种情况,我们使用 I2C 模块;通过使用 I2C 模块,只需 4 个引脚即可实现与 LCD 的接口。
首先,将 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 引脚
第 2 步:16x2 LCD 代码:
对于想了解基础知识的人可以从这里开始,如果没有,您可以跳到一步 - 从 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;
这两行用来设置LCD的列数和行数;在我们的例子中,它是 16 列和 2 行。
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
这是设置 LCD 地址、列数和行数。(如果您不知道您的显示地址,请运行 I2C 扫描仪草图)
void setup()
{
lcd.init();
lcd.backlight();
}
void setup 函数只运行一次,所以在这里,初始化和声明完成。“lcd.init();” 用于初始化 LCD 和“lcd.backlight();” 用于打开 LCD 显示器的背光。
lcd.setCursor(0, 0);
在 void 循环中,“.setCursor”函数用于将光标设置到所需位置。因为我们要显示消息“Hello World!” 在第一列第一行,我们给出位置“(0, 0)”
lcd.print("Hello World!");
delay(1000);
lcd.print” 函数将打印给出的任何信息。在这里,让我们显示“Hello World!” 并会产生 1 秒的延迟。这确保显示的消息将保持足够长的时间让我们正确看到它。
lcd.clear();
此功能将清除显示以打印新信息。
lcd.setCursor(0,1);
现在,要创建一个小动画,让我们将光标设置到第一列,第二行,以便在第一行显示消息一秒钟后,它将转移到第二行。
lcd.print("Hello World!");
delay(1000);
设置为第二行后,打印相同的消息以显示,延迟将确保消息在第二行也保持 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;
这是设置 LCD 的列数和行数。在我们的例子中,16x2 表示 16 列和 2 行。
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
该函数用于设置 LCD 地址、列数和行数。
void readData();
void writeData(String data);
void deleteData();
这些是函数原型。要将数据读取到闪存,请使用自定义函数“readData()”。同样,“writeData”和“deleteData”是自定义函数,分别用于写入数据和从LittleFs中删除数据。
Serial.begin(115200);
启动串行监视器并将波特率设置为 115200。
lcd.init();
lcd.backlight();
“lcd.init”函数将初始化LCD,.backlight函数将打开LCD背光
lcd.setCursor(0, 0);
lcd.print("Little FS Demo");
delay(1000);
像以前一样,这会将光标设置到第一列第一行并打印消息“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 无法启动,则应显示错误消息以通知用户 Little Fs 无法启动。
检查文件是否已正确打开,如果未正确打开,将打印错误消息并结束函数。或者它将打印之前写入的数据。LCD 显示屏上将显示“安装错误”信息。
readData();
这行代码用于读取保存的数据。
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!");}
}
当串行从串行监视器接收到一些数据时,使用“serial.readString()”读取数据并存储在字符串“data”中。然后它会检查用户输入了什么命令,并根据它执行删除/读/写。
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 文件和保存的文本文件,并将其显示在串行监视器和 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);
}
该函数将打开 LittleFs 文件并写入用户数据并将其显示在串行监视器和 LCD 屏幕上。
void deleteData()
{
//Remove the file
LittleFS.remove("/SavedFile.txt");
lcd.clear();
//update the display
lcd.print("Data Deleted");
}
该函数将删除 LittleFs 文件并写入用户数据并显示在串行监视器和 LCD 屏幕上。
第 4 步:小 FS 工作
这是将数据写入闪存。这很简单。代码的编写方式允许用户非常轻松地键入数据。只需打开串行监视器并键入数据并按“输入”(确保波特率 = 115200并且未选择行尾)。输入的任何内容都将作为数据保存到 LittleFs 文件系统中。LittleFs 文件系统安装在 ESP8266 的闪存上。除了在 LittleFs 文件系统中写入之外,还可以完成另外两项任务。那些正在阅读和删除。为此,代码以这样一种方式编写,即它接受用户的输入并执行用户请求的功能。
当用户输入“D”时,文件被删除,“R”读取文件。
(注意:它区分大小写,并且像“DD”或“dD”而不是“D”之类的任何错误都将被视为输入数据,这将被覆盖在现有数据上。“R”读取文件)
第 5 步:最后的想法
这只是对 LittleFS类型文档的介绍。您可以更进一步,从传感器获取输入并尝试将收集的数据存储在 LittleFS 中(尽管这不是一个可行的项目,因为可用的闪存较少且无法有效存储数据)。
如果您对该项目有任何疑问,请随时在下面发表评论,对于项目,请查看我的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创建ESP8266网络服务器
- 使用Arduino IDE的ESP8266温度湿度监控网络应用程序
- ESP8266 Arduino通讯
- 使用Arduino配置ESP8266
- 解决 用arduino ide 开发nodemcu 加载ESP8266库的问题
- 配置esp8266开发板的Arduino开发环境
- esp8266 nodeMCU arduino开发环境
- 天猫精灵 python_利用天猫精灵控制ESP8266(NodeMCU开发板)arduino ide开发
- Esp8266闪存文件系统LIttleFS
- esp笔记(2)使用Arduino IDE 开发 esp8266
- 利用天猫精灵控制ESP8266(NodeMCU开发板)arduino ide开发
- 如何建立一个带Arduino IDE的ESP8266 Web服务器 2次下载
- 如何使用Arduino ESP8266开发板配置标准的Arduino开发环境 48次下载
- ESP8266红外信号收发实验 1678次阅读
- ESP8266硬件 4143次阅读
- ESP8266无线通讯模块的驱动设计与实现 2544次阅读
- ESP8266/ESP32自动下载原理 4249次阅读
- 如何使用ESP8266制作可配置的Web服务器 1.2w次阅读
- ESP8266上运行代码如何实现 2768次阅读
- 如何利用ESP8266实现智能手表的设计 2999次阅读
- STM32系列设计,ESP8266联网授时时钟 7825次阅读
- 从5方面描述STM32F407+ESP8266连接机智云过程 1.1w次阅读
- esp8266中文资料汇总(esp8266引脚图_与单片机连接_串口wifi实例) 22.4w次阅读
- esp8266固件如何升级_ESP8266WIFI模块固件升级 4.2w次阅读
- ESP8266 Wi-Fi到底传多远_esp8266 wifi信号强度测距 5.1w次阅读
- 远程控制通讯--基于Arduino + ESP8266控制LED灯 3.9w次阅读
- esp8266 at指令集详解 14.1w次阅读
- esp8266串口wifi实例 1.8w次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多