《ESP8266通信指南》番外-(附完整代码)ESP8266获取DHT11接入(基于Lua)

《ESP8266通信指南》番外-(附完整代码)ESP8266获取DHT11接入(基于Lua)

码农世界 2024-05-23 前端 56 次浏览 0个评论


前言

此篇为番外篇,是 ESP8266 入门的其他功能教程,包括但不限于

  1. DHT11 驱动
  2. TCP 通信
  3. Thingsboard 平台的接入
  4. 阿里云物联网云平台接入
  5. 华为云平台接入

1. 小节目标

使用 Lua 驱动 DHT11 传感器,获取温湿度的值

2. 进入主题

NodeMCU 基于 LUA 相关资料

官方文档:dht - NodeMCU Documentation

包括 dht 的固件:📎nodemcv_dht.zip

如果使用的是以下这一款硬件,就直接使用引脚4

2.1. 单独驱动温湿度传感器

dht11Pin = 4
tmr.create():alarm(3000,tmr.ALARM_AUTO ,function()
    if conn_flag==1 then
        status, 
        temp, 
        humi, 
        temp_dec,
        humi_dec = dht.read(dht11Pin)
        if status == dht.OK then  --根据返回的状态
          dht11data=string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n")
          -- 打印
          print(dht11data)
          -- 在这里直接发送到MQTT上
        else 
        print("dht11 error")
        -- 下面这一行是上报到物联网云平台的,如果不想上报直接打印即可
        -- m:publish(pub_topic,"[dht11 error",0, 0, function(client) print("sent") end)
        end
    end
 end)

2.2. 完整代码

station_cfg = {}
station_cfg.ssid = "wifi_ssid"
station_cfg.pwd  = "wifi_pwd"
station_cfg.auto = false
station_cfg.save = false
-- MQTT配置
mqtt_cfg = {}
mqtt_cfg.host      = "broker.emqx.io"
mqtt_cfg.port      = 1883
mqtt_cfg.clientid  = "alro12345940"
mqtt_cfg.keepalive = 120
mqtt_cfg.username  = "AlvaRocha"
mqtt_cfg.password  = "aio_KOsXwbgtWCboCal"
sub_topic="/topic/ctiot/dht11/topic/c"
pub_topic="/topic/ctiot/dht11/topic/m"
m=nil
iot_test = mqtt.Client(mqtt_cfg.clientid, mqtt_cfg.keepalive, mqtt_cfg.username, mqtt_cfg.password)
-- wifi配置
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)
-- gpio 配置
pin=3
gpio.mode(pin, gpio.OUTPUT)
conn_flag=0
function get_broker(mqtt_client)
  mqtt_client:connect(mqtt_cfg.host, mqtt_cfg.port, false,
    function(client)
      client:subscribe(sub_topic, 0, function(client)
        print("subscribe success ",  sub_topic)
        
      end)
         m:publish(pub_topic, "success", 0, 0, function(client)
         print("init success")
         conn_flag=1
      end)
    end,
    function(client, reason)
      print('connection failed', reason)
    end)
    m=mqtt_client
end
iot_test:on("offline", function(client)
  print("client offline")
  conn_flag=0
  get_broker(iot_test)
end)
iot_test:on("message", function(client, topic, data)
  --print("MQTT msg received on '" .. topic .. "':")
  if data ~= nil 
  then
    print(data)
    if data == "1"
    then
      gpio.write(pin, gpio.HIGH)
      print("1111")
    end
    if data == "2"
    then
      gpio.write(pin,gpio.LOW)
      print("222")
    end
  end
end)
function startup()
  if file.open("init.lua") == nil then
    --print("init.lua deleted or renamed")
  else
    --print("Running")
    file.close("init.lua")
    get_broker(iot_test)
  end
end
wifi_connect_event = function(T)
  print("Connection to AP(" .. T.SSID .. ") established!")
  print("Waiting for IP address...")
  if disconnect_ct ~= nil then
    disconnect_ct = nil
  end
end
wifi_got_ip_event = function(T)
  tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
end
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, wifi_connect_event)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
  wifi.sta.connect()
end)
wifi.sta.connect()
dht11Pin = 4
tmr.create():alarm(3000,tmr.ALARM_AUTO ,function()
    if conn_flag==1 then
        status, 
        temp, 
        humi, 
        temp_dec,
        humi_dec = dht.read(dht11Pin)
        if status == dht.OK then  --根据返回的状态
           m:publish(pub_topic, string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
          math.floor(temp),
          temp_dec,
          math.floor(humi),
          humi_dec
    ),
           0, 0, function(client) print("sent") end)
        else 
        print("dht11 error")
        m:publish(pub_topic,"[dht11 error",0, 0, function(client) print("sent") end)
        end
    end
 end)

3. 完整的代码注释

为了方便各位读者学习,特地将代码加上注释,如下

-- Wi-Fi连接配置
station_cfg = {}
station_cfg.ssid = "wifi_ssid"  -- 设置Wi-Fi的SSID
station_cfg.pwd  = "wifi_pwd"   -- 设置Wi-Fi的密码
station_cfg.auto = false        -- 设置Wi-Fi不自动连接
station_cfg.save = false        -- 设置不保存Wi-Fi连接信息
-- MQTT连接配置
mqtt_cfg = {}
mqtt_cfg.host      = "broker.emqx.io"           -- 设置MQTT服务器地址
mqtt_cfg.port      = 1883                        -- 设置MQTT服务器端口
mqtt_cfg.clientid  = "alro12345940"          -- 设置MQTT客户端ID
mqtt_cfg.keepalive = 120                           -- 设置MQTT保持连接时间
mqtt_cfg.username  = "AlvaRocha"            -- 设置MQTT用户名
mqtt_cfg.password  = "aio_KOsXwbgtWCboCal" -- 设置MQTT密码
sub_topic="/topic/ctiot/dht11/topic/c"      -- 设置MQTT订阅主题
pub_topic="/topic/ctiot/dht11/topic/m"      -- 设置MQTT发布主题
-- 初始化MQTT客户端
m=nil
iot_test = mqtt.Client(mqtt_cfg.clientid, mqtt_cfg.keepalive, mqtt_cfg.username, mqtt_cfg.password)
-- 设置Wi-Fi模式为Station模式并配置Wi-Fi连接参数
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)
-- 配置GPIO引脚
pin=3
gpio.mode(pin, gpio.OUTPUT)
conn_flag=0  -- 初始化连接标志为0
-- 连接到MQTT服务器并订阅主题的函数
function get_broker(mqtt_client)
  mqtt_client:connect(mqtt_cfg.host, mqtt_cfg.port, false,
    function(client)
      client:subscribe(sub_topic, 0, function(client)
        print("subscribe success ",  sub_topic)
      end)
      -- 发布初始化成功消息
      m:publish(pub_topic, "success", 0, 0, function(client)
         print("init success")
         conn_flag=1
      end)
    end,
    function(client, reason)
      print('connection failed', reason)
    end)
    m=mqtt_client
end
-- MQTT客户端离线时的回调函数
iot_test:on("offline", function(client)
  print("client offline")
  conn_flag=0
  get_broker(iot_test)
end)
-- MQTT客户端接收到消息时的回调函数
iot_test:on("message", function(client, topic, data)
  if data ~= nil then
    print(data)
    if data == "1" then
      gpio.write(pin, gpio.HIGH)
      print("1111")
    end
    if data == "2" then
      gpio.write(pin,gpio.LOW)
      print("222")
    end
  end
end)
-- 设备启动时执行的操作
function startup()
  if file.open("init.lua") == nil then
    --print("init.lua deleted or renamed")
  else
    --print("Running")
    file.close("init.lua")
    get_broker(iot_test)
  end
end
-- Wi-Fi连接成功时的事件处理函数
wifi_connect_event = function(T)
  print("Connection to AP(" .. T.SSID .. ") established!")
  print("Waiting for IP address...")
  if disconnect_ct ~= nil then
    disconnect_ct = nil
  end
end
-- 获取到IP地址时的事件处理函数
wifi_got_ip_event = function(T)
  tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
end
-- 注册Wi-Fi事件监听器
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, wifi_connect_event)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
  wifi.sta.connect()
end)
wifi.sta.connect()
-- DHT11传感器引脚配置
dht11Pin = 4
-- 定时执行DHT11传感器读取并向MQTT服务器发布数据
tmr.create():alarm(3000,tmr.ALARM_AUTO ,function()
    if conn_flag==1 then
        status, temp, humi, temp_dec, humi_dec = dht.read(dht11Pin)
        if status == dht.OK then
           m:publish(pub_topic, string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
          math.floor(temp),
          temp_dec,
          math.floor(humi),
          humi_dec
    ),
           0, 0, function(client) print("sent") end)
        else 
        print("dht11 error")
        m:publish(pub_topic,"[dht11 error",0, 0, function(client) print("sent") end)
        end
    end
 end)

4. 结语


本小节完成了以下功能:

  1. 配置Wi-Fi连接参数,使设备能够连接到指定的Wi-Fi网络。
  2. 配置MQTT连接参数,使设备能够使用MQTT协议与远程服务器通信。
  3. 设置GPIO引脚的模式和状态,以便设备可以控制外部设备。
  4. 连接到MQTT服务器并订阅特定主题,以便实时接收来自服务器的消息。
  5. 当设备收到MQTT消息时,根据消息内容执行相应的操作,例如控制GPIO引脚的状态。
  6. 在设备启动时执行初始化操作,包括连接到Wi-Fi网络和MQTT服务器。
  7. 注册Wi-Fi事件监听器,以处理Wi-Fi连接状态变化事件。
  8. 通过DHT11传感器定时读取环境温湿度数据,并将数据发布到指定的MQTT主题上。


柴头物联网出品

转载请注明来自码农世界,本文标题:《《ESP8266通信指南》番外-(附完整代码)ESP8266获取DHT11接入(基于Lua)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,56人围观)参与讨论

还没有评论,来说两句吧...

Top