ESP8266恒温控制器

tech2025-03-29  14

背景知识视频教程

物联网#3:物联网(物联网)自动化与ESP8266使用NodeMcu ESP8266 Arduino IDE的物联网机器人使用NodeMCU(由ESP8266支持),MicroPython和PyCharm进行物联网

本文,我们将使用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)函数之前调用

文件对象

温度传感器

代码

详情参阅http://viadean.com/esp8266_temp.html

最新回复(0)