本文,我们将使用ESP8266构建家用恒温器。 温控器将具有以下功能:
- 它将从DHT22温度传感器读取温度
- 它将温度与所需温度进行比较。 如果高于它,它将触发继电器关闭;如果低于它,它将触发继电器打开
在此之前,首先了解下ESP8266如何保持温度和提取温度。
SPIFFS介绍
SPI Flash文件系统(SPIFFS)是为小型嵌入式系统创建的文件系统。 SPIFFS具有许多优点,因为它允许您创建文件和模拟目录:
- 专为微控制器上的低RAM使用而设计
- 使用静态大小的RAM缓冲区
- 类似于Posix的api:打开,关闭,读取,写入,查找,统计等
- 它可以在任何NOR闪存上运行,而不仅限于SPI闪存。 多个SPIFFS配置可以在同一目标上运行,甚至可以在同一SPI闪存设备上运行
- 实现静态磨损均衡
- 内置文件系统一致性检查
- 高度可配置,可适应多种闪存类型
我强烈建议您在设计中使用SPIFFS将数据存储在NOR闪存中,因为它非常容易读写数据,就像一个* nix文件系统。
文件系统的大小取决于闪存芯片的大小。 根据在IDE中选择的板,可以为SPIFFS选择不同的大小。 例如,如果您选择了NodeMcu v1.0作为Board类型,则SPIFFS有两个维度,如以下屏幕截图所示,为1M和3M之一:
即使文件系统与应用程序存储在同一闪存芯片上,刷新新Sketch也不会修改文件系统内容。 这使我们可以使用文件系统来存储Web服务器的数据,配置文件或内容。
现在,让我们看看哪些函数可用于操作文件。 首先,他们可以访问SPIFFS函数,并且FS.h文件需要包含在Sketch中:
#include "FS.h"
加入之后,我们可以访问三个对象:SPIFFS,File和Dir。
SPIFFS对象
- begin:挂载文件系统。 需要先调用,然后返回true表示成功,否则返回false:
if(SPIFFS.begin())
{
Serial.println(F("File systestem mounted.")); //use F function to
store the string in flash and not in RAM memory. This save a lot of
RAM memory
}
else
{
Serial.println(F("Mounting file system failed."));
}
- info:返回有关整个文件系统的信息,该信息存储在FSInfo结构中。 FSInfo结构具有以下成员:
struct FSInfo {
size_t totalBytes;
size_t usedBytes;
size_t blockSize;
size_t pageSize;
size_t maxOpenFiles;
size_t maxPathLength;
};
声明fs_info并使用info函数填充它,将使我们能够访问有关文件系统的信息:
FSInfo fs_info;
SPIFFS.info(fs_info);
Serial.print("Used bytes: ");
Serial.println(fs_info.usedBytes);
- exists::如果文件系统中存在指定的路径(文件),则SPIFFS.exists(path)返回true或false:
if(SPIFFS.exist("/config.json"))
Serial.println(F("File config.json exists."));
注意:该路径必须是绝对路径,并以斜杠开头。
- format:格式化整个文件系统并返回true或false。 格式可以在begin函数之前或之后调用,根据文件系统的大小,它可能需要数十秒才能完成:
SPIFFS.format();
- open:此函数返回一个File对象,并以文件的绝对路径和打开文件的模式为参数。 成功则返回true,否则返回false:
SPIFFS.open(path, mode);
File config_file = SPIFFS.open("/config.json", "w");
if (!config_file) {
Serial.println(F("failed opening config.json file."));
}
在前面的代码中,用于打开文件的选定模式为w(写)。 可以使用与ANSI C函数fopen相同的模式:
r 打开文本文件进行读取。 流位于文件的开头。
r+ 打开读取和写入,流位于文件的开头。
w 将文件截断为零长度或创建一个文本文件进行写入,流位于文件的开头
w+ 打开读取和写入。 如果文件不存在,则创建该文件; 否则将被截断。 流位于文件的开头
a 打开以进行追加(在文件末尾写入)。 如果文件不存在,则创建该文件。 流位于文件的末尾。
a+ 打开以进行读取和追加(在文件末尾写入)。 如果文件不存在,则创建该文件。 读取的初始文件位置在文件的开头,但输出始终附加在文件的末尾。
-
remove:从文件系统中删除文件。 它以绝对路径作为参数,如果成功则返回true,否则返回false:
if(SPIFFS.remove(“/config.json”))
Serial.println(F(“File config.json was removed”));
* rename:重命名文件。 采用两个参数,当前名称和新名称的绝对路径。 如果成功则返回true,否则返回false:
```
If( SPIFFS.rename("/old_file_name.json","/new_file_name.json")
Serial.println(F("File renamed."));
目录对象
如果需要遍历目录中的所有文件,则可以使用Dir(目录)对象。 有三种方法可用于迭代next(),获取下一个文件文件Name()的名称以及打开目录openDir(mode):
注意:SPIFFS不支持目录。 实际上,它产生了平坦的结构。 创建路径为/data/log.txt的文件将在目录数据下创建一个名为/data/log.txt的文件,而不是log.txt。
Dir dir = SPIFFS.openDir("/data");
while (dir.next()) {
Serial.print(dir.fileName());
File f = dir.openFile("r");
Serial.println(f.size());
}
从以上可以看出:
- openDir中的mode可以具有与SPIFFS对象中的open函数相同的值
- 如果数据目录中有文件,则dir.next()返回true,并且必须在fileName()和openFile(mode)函数之前调用
文件对象
温度传感器
代码
详情参阅 - 亚图跨际