在本教程中,我们将展示如何使用 SPIFFS(串行外设接口闪存文件系统)写入和读取 NodeMCU。我们将使用 SPIFFS 将来自 DHT11 传感器的温度数据写入闪存文件系统。然后我们将读取闪存文件系统中存储的相同数据。
带有 ESP8266 芯片或板的 NodeMCU 具有闪存芯片,其中可以存储传感器数据、html、css 等数据、用于构建 Web 服务器的 javascript 文件、配置文件、草图、固件等数据。闪存架构将闪存分为草图、OTA、文件系统、EEPROM、WiFi配置等各个部分。因此,文件系统是闪存的一部分,我们可以在其中存储传感器数据日志、HTML、CSS、Javascript 等数据。文件系统的大小取决于闪存大小,而闪存大小又取决于不同的 ESP8266 板和ESP32 开发板。
SPIFFS(Serial Peripheral Interface Flash File System)是一种允许以文件格式在闪存芯片的文件系统区域存储和访问数据的模块。SPIFFS 还将可用的文件系统内存分区为足够小的页面(默认大小为 256 字节)以缓存在 RAM 中。SPIFFS 还优化了擦除次数。
为了将 SPIFFS 与带有 Arduino IDE 的 NodeMCU(ESP8266 板)一起使用,我们需要安装一个名为 ESP8266FS 的工具。也就是说,如果Arduino IDE上安装了这个工具,Arduino IDE的工具下拉列表中会出现一个名为“ESP8266 Sketch Data Upload”的上传工具。单击该选项,我们可以将文件上传到 Arduino sketch 文件夹中的数据文件夹中。
如何在 Arduino IDE 中设置 ESP8266FS 插件工具
以下是安装 Arduino ESP8266FS 插件的步骤。
- 从以下链接下载 ESP8266FS-0.5.0.zip
https://github.com/esp8266/arduino-esp8266fs-plugin/releases/tag/0.5.0
-
在您的 Arduino Sketchbook 位置创建一个名为“tools”的新文件夹。您可以从“文件”>“首选项”中找到速写本位置,如下所示。
-
创建工具文件夹后,将步骤 1 中下载的 zip 文件放入该工具文件夹中。将压缩文件解压缩到工具文件夹中。如果正确解压,那么在 Windows 操作系统的以下位置应该有 eso8266fs jar 文件。
C:\Users\Dell\Documents\Arduino\tools\ESP8266FS\tool
如下所示。
- 关闭并重新打开 Arduino IDE。在工具菜单中,您应该会看到 ESP8266 草图数据上传工具,如下所示。
如果您看到这一点,则该工具已成功安装。
使用 SPIFFS 写入 NodeMCU 闪存
在本教程中,我们将使用 ESP8266 读取 DHT11 温度数据并将此温度日志数据写入 log.txt 文件。这个 log.txt 文件被上传到 ESP8266 的闪存中。
为此,我们在名为 data 的文件夹中创建一个 log.txt 文件。首先,我们在与草图文件夹相同的文件夹中创建一个名为 data 的文件夹。这里的草图称为 ESP8266_SPIFFS_WRITE.ino。下面显示了数据文件夹和草图。
在数据文件夹中,我们创建了一个名为 log.txt 的文本文件,如下所示。
创建日志文件后,我们使用上面安装的工具使用 SPIFFS 将其上传到文件系统。转到并单击“工具”>“ESP8266 草图数据上传”。
接下来是编写读取传感器数据并将其写入日志文件的草图。该数据随后将上传到闪存文件系统中的日志文件中。在编写草图之前,首先完成硬件连接。
DHT11 传感器连接到 ESP8266 GPIO 引脚 5(数字引脚 D1)。这与教程中的电路图相同如何通过 WiFi 从 NodeMCU 传输数据?. 原理图和面包板连接如下图所示。
程序代码
以下是将 Arduino 草图上传到 NodeMCU 板中。它从 DHT 传感器读取温度数据并将数据打开/写入 log.txt。
ESP8266_SPIFFS_WRITE.ino
#include "FS.h"
#include "DHT.h"
#define DHTPIN 5 // the ESP8266 pin where DHT sensor pin is connected to
#define DHTTYPE DHT11 // the DHT sensor type used
DHT dht(DHTPIN, DHTTYPE); // create DHT object
void setup() {
Serial.begin(115200);
dht.begin(); // intialize DHT object
// mount and check the filesystem
bool ok = SPIFFS.begin();
if (ok) {
Serial.println("SPIFFS initialized successfully");
}
else{
Serial.println("SPIFFS intialization error");
}
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
//read temperature as Celcius
float T = dht.readTemperature();
// Check if DHT reading fails to exit early
if (isnan(T)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
//open log.txt file
File file = SPIFFS.open("/log.txt", "a");
if (!file) {
Serial.println("file open failed");
}
// save temperature reading
file.print(T);
file.println("deg C");
Serial.println(T);
//close file
file.close();
delay(8000);
}
然后应将此草图上传到 NodeMCU/ESP8266 板中。
使用 SPIFFS 从 NodeMCU 闪存读取数据
为了验证温度数据是否已成功写入 log.txt 文件中的闪存,我们需要从 NodeMCU 闪存中读取它。下面的草图将读取之前保存在 NodeMCU 闪存中的 log.txt 中的温度数据。
ESP8266_SPIFFS_READ.ino
#include "FS.h"
void setup() {
Serial.begin(115200);
// mount and check the filesystem
bool ok = SPIFFS.begin();
if (ok) {
Serial.println("SPIFFS initialized successfully");
}
else{
Serial.println("SPIFFS intialization error");
}
//
File file = SPIFFS.open("/log.txt", "r");
if(!file){
Serial.println("Failed to open file for reading");
return;
}
Serial.println();
Serial.println("File Content:");
while(file.available()){
Serial.write(file.read());
}
file.close();
}
void loop() {
}
然后将该代码上传到 NodeMCU。上传后应该打开串口监视器,我们可以看到文件内容(闪存中log.txt中的内容)。