[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模块部分,如下图:
[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)

  • 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 thenprint( "DHT Checksum error." ) -- 数据读取超时错误elseif status == dht.ERROR_TIMEOUT thenprint( "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,效果如下图。

[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)

可以看到,不论是使用整型还是浮点型,最终结果小数部分始终为0。

实物接线图如下:

[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)

在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...")elsemytimer:stop() -- 连接成功,停止定时器print("Config done, IP is "..wifi.sta.getip()) -- 打印IP地址endend)

connect_wifi.lua 文件上传到ESP8266中,刷新文件,点击 connect_wifi.lua 开始连接wifi,如下图。

[ESP8266系列] 玩转DHT11温湿度和DS18B20温度模块(lua编程)

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温湿度传感器数据

Arduio ESP8266获取DHT11温湿度传感器数据

Arduio ESP8266将DHT11温湿度传感器数据显示在网页上

Arduio ESP8266将DHT11温湿度传感器数据在网页上显示