24小时联系电话:18217114652、13661815404
中文
行业资讯
带有 ESP8266 和 DS18B20 的 WIFI 温度监控器
带有 ESP8266 和 DS18B20 的 WIFI 温度监控器
今天,我们将创建一个wifi温度监控系统。对于读数,我们将使用 DS18B20 传感器。对于数据处理和网页创建,我们将使用我们已知的 ESP8266。
该项目将建设如下:
电路组装
读取 DS18B20 传感器的代码(我们将使用串行进行测试)。
创建网页(我们将使用 SPIFFS 存储在 FLASH 中)。
但首先,让我们了解一下传感器及其使用的通信模型。
DS18B20
DS18B20是一款精度好、定制性好、实用、可靠、成本低的数字温度传感器。组合好?
传感器监测范围内的温度:-55°C 至 +125°C(-67°F 至 +257°F),在 -10°C 至 +85°C 的范围内精度为 +-0.5°C (在该范围之外,这种不准确性会增加,但没什么可笑的)。
它使用三个引脚进行操作:
VDD(电源)
GND(接地)
DQ(数字通信)
VDD 以 3V 至 5.5V 的值工作,甚至可以省略。传感器具有寄生模式,仅使用 DQ 和 GND 引脚,其电源来自通信引脚。这种模式效果很好,但更容易受到噪音的影响。
数据通信使用 DQ 引脚通过 1-Wire (OneWire) 协议进行。我们稍后将讨论该协议,但现在重要的是要知道,尽管只有一根电线,但它允许双向通信。
读取是主动执行的,微控制器发送命令并接收回包含信息的数据包。
除了读取请求,传感器还可以接收报警配置和数据格式命令。DallasTemperature 库已经为我们处理了大部分。包括为我们提供一些附加功能,例如在法拉第接收读数。
市场上最常见的型号是TO-92封装(看起来像晶体管)和防水封装。由于其实际应用,这第二种更常见,1m 长的带不锈钢尖端的电缆。例如,它可用于控制水温。读取是主动执行的,微控制器发送命令并接收回包含信息的数据包。
除了读取请求,传感器还可以接收报警配置和数据格式命令。DallasTemperature 库已经为我们处理了大部分。包括为我们提供一些附加功能,例如在法拉第接收读数。
市场上最常见的型号是TO-92封装(看起来像晶体管)和防水封装。由于其实际应用,这第二种更常见,1m 长的带不锈钢尖端的电缆。例如,它可用于控制水温。
单线
OneWire(或 1-Wire)是由 Dallas Semiconductor 设计的一种通信方法,它仅使用一条线路传输数据,并带有发送谁和何时发送的信号系统。
该方法与 i2C 非常相似,但它的数据传输速度要有限得多。另一个区别是在 1-wire 的情况下,可以省略电源引脚,在寄生模式下使用数据引脚(现在,您可能已经注意到,尽管名称如此,该方法至少需要两条线:数据和地)。
通信在主从模式下完成,其中微控制器发送所有请求,其他设备仅在名义上请求时发送数据。
每个设备都有一个唯一的地址/名称。这允许我们在同一条数据线上连接多个设备。请求以广播方式发送,在其中识别自身的设备会做出响应。
电路
我们应用的电路很简单。我们将传感器的 VDD 引脚连接到 NodeMCU 的 3V3,GND 与 GND,我们将使用 D4 引脚作为传感器数据。它可以是任何其他数字引脚。
此外,必须在数据引脚和 3V3 之间放置一个 4k7 欧姆电阻以增加稳定性。
查找 DS18B20 地址
正如我们之前看到的,每个传感器都有一个唯一的地址,这个地址对于通信至关重要。我们可以将其理解为制造序列号。但是如何识别这个数字呢?
我们将创建一个帮助程序代码来查找此地址。在这种情况下,代码会扫描连接到引脚 D4 的任何设备。我们将使用串行监视器来可视化结果。
我们从导入 OneWire 和 DallasTemperature 库开始(不要忘记维护顺序)。如果出现任何导入错误,您可以将它们添加到 Arduino IDE 的库管理器中。
接下来,我们在引脚 D4 上启动一个 OneWire 对象,并使用该对象创建一个传感器。从那一刻起,“传感器”对象具有 DallasTemperature 库提供的所有属性和功能。
我们将使用两个函数 Search(),它执行 OneWire 中的设备搜索,以及 reset_search() 重新开始搜索。
我们的代码所做的是开始搜索,将结果保存在 addr 变量中,如果变量不为空,则将其写入串行中。
我们在串行监视器上找到了结果。如果有其他设备,它们也会出现在这里。留下地址,我们会需要的。
串行监视器读取传感器
现在我们知道了传感器的地址。让我们开始读取温度的主要代码。这里的目标是启动传感器并每 10 秒读取一次读数。
我们以同样的方式开始,但这次我们使用收集到的地址创建了 sensor1 变量。
在 readDs18b20() 函数中,我们将使用两个函数:
requestTemperatures() – 此函数不专门与任何传感器通信,而是与所有传感器通信。就像它说的:如果你是 ds18b20,现在运行一个新的读取并等待我的“以及传感器的作用。
getTempC(address) – 在这里,我们将信息定向到每个感兴趣的传感器,这些传感器以最后的读数响应我们
在 Setup() 函数中,我们使用 begin() 函数启动传感器,它会自动执行读数,如果您没有发出新请求,传感器仍会响应 getTemp() 函数,但会使用过时的值。
在循环中,我们有一个带有 millis() 函数的计时器,以便每 10 秒读取一次。
在串行监视器上,我们应该得到以下结果:
请注意,在第 15 行,我们向 Serial.println() 函数添加了另一个参数。有了这个,我们定义了小数位数。
创建监控页面
准备好阅读后,让我们创建一个网页以在浏览器中查看此信息。请记住,稍后我们会将这些文件放在带有 SPIFFS 的 FLASH ESP8266 中。
我们将构建以下屏幕:
为此,我们将使用两个文件:
索引.html
样式文件
页面结构不是本文的重点,但基本上,我们有 index.html 文件创建页面本身并触发一个 javascript 函数来更新阅读。
style.css 文件改进了页面的外观,但不影响其功能。
两个文件都必须在项目文件夹内的数据文件夹中,并使用 ESP8266 Sketch Data Upload 传输。
完整代码
将页面保存到 FLASH 后,我们需要创建为页面提供服务的结构。
在 wifi 上连接
创建一个网络服务器
为对此的请求创建回调
这一步对我们来说并不新鲜,但有几点值得注意。
现在 readDs18b20() 函数也更新了一个 String 类型的变量。我们这样做是因为服务器回调函数不接受整数或浮点变量。
对于服务器,我们有三个路由:
“/”将发送带有最新传感器读数的 html 文件。
“/styled.css” 将发送 css 文件
“/state”将返回要更新的温度变量。