[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)
Posted 电子芯吧客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)相关的知识,希望对你有一定的参考价值。
DHT11温湿度模块
模块概述
DHT11数字温湿度传感器是一款温湿度复合传感器。每个DHT11传感器都在极为精确的湿度校验室中进行校准,校准系数储存在OTP内存中,传感器在检测信号时会调用这些校准系数。采用单总线接口使系统集成变得简易快捷,信号传输距离可达20米以上。
从DHT11的规格书可以看到,模块的温、湿度分辨率都是1,所以DHT11获取数值的小数部分都为0(规格书上说当前小数部分用于以后扩展,现读出为零)。据说新版本DHT11温度分辨率是0.1度,有小数部分。笔者购买的DHT11模块是没有小数部分的。
笔者使用的DHT11模块:
数据通信格式
模块的DATA引脚用于和微控制器通信,通过单总线协议,每次通讯时间4ms左右,具体数据格式如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据+ 8bit校验和
注: 规格书指出:当前小数部分用于以后扩展,现读出为零。
若想了解单总线通信过程中信号的电平状态,详见DHT11规格书,这里就不再叙述了,网上也有很多讲解单总线协议的文章。
注:在编程时,采样周期间隔不得低于1秒钟。
模块编程示例
DHT模块接口介绍
先让NodeMCU固件开启对DHT模块的支持,具体操作见
#define LUA_USE_MODULES_DHT // 启用DHT模块
启用该模块后,我们就可以直接使用DHT的相关接口调用,完成对模块的操作。
查看NodeMCU的官方文档,找到DHT模块部分,如下图:
dht.read() 读取各种DHT传感器,包括DHT11、21、22、33、44湿度温度传感器。
dht.read11() 读取DHT11湿度温度传感器。
dht.readxx() 读取除DHT11之外的所有DHT传感器。
这里笔者使用dht.read11()
来获取DHT11模块的数据。
dht.read11() 接口详解
语法:dht.read11(pin)
参数:DHT11传感器的引脚号(不能为0),类型为数字。
返回:
status
返回操作的状态信息temp
温度humi
湿度temp_dec
温度小数部分humi_dec
湿度小数部分
注: 如果使用浮点固件,则temp和humi是浮点数。若果使用的是整数固件,则最终值必须从temp和temp_dec / humi和hum_dec连接在一起。
程序示例
如何获取DHT温湿度数据
将以下代码保存为dht11.lua
文件(文件名也可以是其他,后缀一定要是.lua)。
--[[
-------------------------------------
NodeMCU | ESP8266 | NodeMCU | ESP8266
Pin | Pin | Pin | Pin
-------------------------------------
D0 | GPIO16 | D7 | GPIO13
D1 | GPIO5 | D8 | GPIO15
D2 | GPIO4 | D9 | GPIO3
D3 | GPIO0 | D10 | GPIO1
D4 | GPIO2 | D11 | GPIO9
D5 | GPIO14 | D12 | GPIO10
D6 | GPIO12 | |
-------------------------------------
--]]
-- 定义DHT11模块通信引脚为D4,对应ESP8266的GPIO2
pin = 4
-- 函数:DHT11模块获取数据
function mydht11()
-- 获取DHT数据
status, temp, humi, temp_dec, humi_dec = dht.read11(pin)
-- 判断状态
if status == dht.OK then
-- 整型固件示例
print(string.format("FW:Integer, DHT Temperature:%d.%03d; Humidity:%d.%03d",
math.floor(temp),
temp_dec,
math.floor(humi),
humi_dec
))
-- 浮点型固件示例
print("FW:Float, DHT Temperature:"..temp.."; ".."Humidity:"..humi.." ")
-- checksum错误
elseif status == dht.ERROR_CHECKSUM then
print( "DHT Checksum error." )
-- 数据读取超时错误
elseif status == dht.ERROR_TIMEOUT then
print( "DHT timed out." )
end -- if()
end -- mydht11()
-- 主函数
function main()
-- 每2秒获取一次数据。V3.0.x版本和V0.5.x版本在定时器使用上有差异。
local dht_timer = tmr.create()
dht_timer:alarm(2000, tmr.ALARM_AUTO, function() mydht11() end)
end -- main()
-- 执行主函数
main()
打开ESPlorer工具,连接ESP8266模块(或者NodeMCU开发板),上传dht11.lua
文件,点击reload
按钮,刷新一下,就可以看到dht11.lua
文件已经上传到ESP8266里了,点击dht11.lua
,效果如下图。
可以看到,不论是使用整型还是浮点型,最终结果小数部分始终为0。
实物接线图如下:
在WEB页面上显示温湿度信息
要想在web页面上显示温湿度信息,首先我们的ESP8266必须得连上网络。
1) ESP8266模块联网
将一下代码保存为 connect_wifi.lua
文件,其中的wifi名 WIFI_NAME
和密码 WIFI_PASSWD
,改为自己的wifi名和密码。
-- 连接到指定的wifi (这里不将配置保存到flash)
print("Connecting WIFI...")
wifi.setmode(wifi.STATION) -- 设置wifi模式为客户端模式
station_cfg={}
station_cfg.ssid = "WIFI_NAME" -- 设置wifi名
station_cfg.pwd = "WIFI_PASSWD" -- 设置wifi密码
station_cfg.save = false -- 不将配置保存到flash
wifi.sta.config(station_cfg) -- 开始配置wifi
wifi.sta.connect() -- 连接wifi
mytimer = tmr.create() -- 创建一个定时器,检测连接wifi是否成功
mytimer:alarm(1000, tmr.ALARM_AUTO, function()
if wifi.sta.getip() == nil then -- 没有获取到IP,连接失败,1s后继续检测
print("IP unavaiable, Waiting...")
else
mytimer:stop() -- 连接成功,停止定时器
print("Config done, IP is "..wifi.sta.getip()) -- 打印IP地址
end
end)
将 connect_wifi.lua
文件上传到ESP8266中,刷新文件,点击 connect_wifi.lua
开始连接wifi,如下图。
2)实现web界面显示的代码
将一下代码到存到 dht-web.lua
文件,并上传到esp8266中。
-- 定义DHT11通信引脚。
pin = 4
-- 实现一个简单地 HTTP服务器
srv = net.createServer(net.TCP)
-- 监听80端口
srv:listen(80, function(conn)
conn:on("receive", function(sck, payload)
print(payload)
-- 获取温湿度信息
local status, temp, humi, temp_dec, humi_dec = dht.read11(pin)
-- 创建一个buf,用于存放web端的代码
local buf = "";
-- 让页面每3秒自动刷新一次
buf = buf.."<meta http-equiv=""refresh"" content=""3"">";
-- 设置页面编码,防止中文乱码
buf = buf.."<meta charset=""utf-8"">";
buf = buf.."<h2>HELLO DHT11</h2>";
buf = buf.."<p>当前温度: "..temp.."."..temp_dec.."'C</p>";
buf = buf.."<p>当前湿度: "..humi.."."..humi_dec.."%</p>";
sck:send(buf)
end)
conn:on("sent", function(sck) sck:close() end)
end)
注: 新建文本是utf-8,代码中的编码就改为utf-8,保持编码一致性,否则中文显示会乱码。
上传 dht-web.lua
文件后,点击刷新,再点击 dht-web.lua
,执行脚本...
点“阅读原文”,查看完整内容!
#往期推荐#
#
#
#
#
以上是关于[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)的主要内容,如果未能解决你的问题,请参考以下文章
物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据
物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据
物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据