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

前言
此篇为番外篇,是 ESP8266 入门的其他功能教程,包括但不限于
- DHT11 驱动
- TCP 通信
- Thingsboard 平台的接入
- 阿里云物联网云平台接入
- 华为云平台接入
1. 小节目标
使用 Lua 驱动 DHT11 传感器,获取温湿度的值
2. 进入主题
NodeMCU 基于 LUA 相关资料
官方文档:dht - NodeMCU Documentation
包括 dht 的固件:📎nodemcv_dht.zip
如果使用的是以下这一款硬件,就直接使用引脚4

2.1. 单独驱动温湿度传感器
dht11Pin = 4tmr.create():alarm(3000,tmr.ALARM_AUTO ,function()if conn_flag==1 thenstatus, 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)endendend)
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_KO<safety edit>sXwbgtWCboCal"
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=0function 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=1end)end,function(client, reason)print('connection failed', reason)end)m=mqtt_client
endiot_test:on("offline", function(client)print("client offline")conn_flag=0get_broker(iot_test)
end)
iot_test:on("message", function(client, topic, data)--print("MQTT msg received on '" .. topic .. "':")if data ~= nil thenprint(data)if data == "1"thengpio.write(pin, gpio.HIGH)print("1111")endif data == "2"thengpio.write(pin,gpio.LOW)print("222")endend
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
endwifi_connect_event = function(T)print("Connection to AP(" .. T.SSID .. ") established!")print("Waiting for IP address...")if disconnect_ct ~= nil thendisconnect_ct = nilend
endwifi_got_ip_event = function(T)tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
endwifi.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 = 4tmr.create():alarm(3000,tmr.ALARM_AUTO ,function()if conn_flag==1 thenstatus, 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)endendend)
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_KO<safety edit>sXwbgtWCboCal" -- 设置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=1end)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=0get_broker(iot_test)
end)-- MQTT客户端接收到消息时的回调函数
iot_test:on("message", function(client, topic, data)if data ~= nil thenprint(data)if data == "1" thengpio.write(pin, gpio.HIGH)print("1111")endif data == "2" thengpio.write(pin,gpio.LOW)print("222")endend
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 thendisconnect_ct = nilend
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 thenstatus, temp, humi, temp_dec, humi_dec = dht.read(dht11Pin)if status == dht.OK thenm: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)endendend)
4. 结语
本小节完成了以下功能:
- 配置Wi-Fi连接参数,使设备能够连接到指定的Wi-Fi网络。
- 配置MQTT连接参数,使设备能够使用MQTT协议与远程服务器通信。
- 设置GPIO引脚的模式和状态,以便设备可以控制外部设备。
- 连接到MQTT服务器并订阅特定主题,以便实时接收来自服务器的消息。
- 当设备收到MQTT消息时,根据消息内容执行相应的操作,例如控制GPIO引脚的状态。
- 在设备启动时执行初始化操作,包括连接到Wi-Fi网络和MQTT服务器。
- 注册Wi-Fi事件监听器,以处理Wi-Fi连接状态变化事件。
- 通过DHT11传感器定时读取环境温湿度数据,并将数据发布到指定的MQTT主题上。

柴头物联网出品
相关文章:
《ESP8266通信指南》番外-(附完整代码)ESP8266获取DHT11接入(基于Lua)
前言 此篇为番外篇,是 ESP8266 入门的其他功能教程,包括但不限于 DHT11 驱动TCP 通信Thingsboard 平台的接入阿里云物联网云平台接入华为云平台接入 1. 小节目标 使用 Lua 驱动 DHT11 传感器,获取温湿度的值 2. 进入主题 NodeMCU 基于 LUA 相关资料 官方文档:…...
[IMX6ULL驱动开发]-Linux对中断的处理(一)
目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断,我们可以进行如下抽象。把CPU看做一个母亲,当它正在执行任务的时候,可以看为是一个母…...
PHP基础学习笔记(面向对象OOP)
类和对象 <?php //声明一个名为 Fruit 的类,它包含两个属性($name 和 $color)以及两个用于设置和获取 $name 属性的方法 set_name() 和 get_name(): class Fruit {// Propertiespublic $name;public $color;// Methodsfuncti…...
Mysql超详细安装配置教程(保姆级图文)
MySQL是一种流行的开源关系型数据库管理系统,它广泛用于网站和服务的数据存储和管理。MySQL以其高性能、可靠性和易用性而闻名,是许多Web应用程序的首选数据库解决方案之一。 一、下载安装包 (1)从网盘下载安装文件 点击此处直…...
HR招聘测评,如何判断候选人的团队协作能力?
什么是团队协作能力? 团队协作能力,说的是在集体环境中,能同他人协同工作,为追求共同的目标而努力,其中包括沟通,表达,协调,尊重,信任,责任共担等一系列综合…...
[STM32-HAL库]Flash库-HAL库-复杂数据读写-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C6T6
目录 一、前言 二、实现步骤 1.STM32CUBEMX配置 2.导入Flash库 3.分析地址范围 4.找到可用的地址 5.写入读取普通数据 6.写入读取字符串 6.1 存储相关信息 6.2 存取多个参数 三、总结及源码 一、前言 在面对需要持久化存储的数据时,除了挂载TF卡,我们…...
windows 下访问 csdn 异常问题
windows下访问csdn可能会出现什么 确认是真人 或着直接连接不上的情况, 需要在 C:\Windows\System32\drivers\etc 路径下 hosts文件中添加如下内容 1.180.18.85 blog.csdn.net 如果目录下没有hosts文件就自己建一个...
vue3结合element-plus之如何优雅的使用表格
背景 表格组件的使用在后台管理系统中是非常常见的,但是如果每次使用表格我们都去一次一次地从 element-plus 官网去 复制、粘贴和修改成自己想要的表格。 这样一来也说得过去,但是如果我们静下来细想不难发现,表格的使用都是大同小异的,每次都去复制粘贴,对于有很多表格…...
网络协议——Modbus-RTU
目录 1、简介 2、消息格式 3、Modbus寄存器种类说明 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-RTU(Remote Terminal Unit)是一种串行通信协议࿰…...
【Qt】如何优雅的进行界面布局
文章目录 1 :peach:写在前面:peach:2 :peach:垂直布局:peach:3 :peach:水平布局:peach:4 :peach:网格布局:peach:5 :peach:表单布局:peach: 1 🍑写在前面🍑 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的。也就是每个控件所在…...
【八股系列】分别说一下nodeJS和浏览器的事件循环机制?
文章目录 1. NodeJS1.1 Node.js 事件循环概念1.2 Node.js 事件循环工作流程1.3 Node.js 事件循环示例 2. 浏览器2.1 浏览器事件循环概念2.2 浏览器事件循环工作流程2.3 浏览器事件循环示例 1. NodeJS 1.1 Node.js 事件循环概念 在 Node.js 中,事件循环由 libuv 库…...
关于基础的流量分析(1)
1.对于流量分析基本认识 1)简介:网络流量分析是指捕捉网络中流动的数据包,并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 2)在我们平时的考核和CTF比赛中,基本每次都有…...
数据结构---树,二叉树的简单概念介绍、堆和堆排序
树 树的概念和结构 结构 在我们将堆之前,我们先来了解一下我们的树。 我们的堆是属于树里面的一种, 树是一种非线性结构,是一种一对多的一种结构,也就是我们的一个节点可能有多个后继节点,当然也可以只有一个或者没…...
MySQL聚合函数(多行函数)
聚合函数(多行函数) 聚合函数作用于一组数据,并对一组数据返回一个值。 常见聚合函数 AVG和SUM函数 只作用于数值类型数据,不包含NULL 求工资平均值和总和 MIN和MAX函数 可以作用于任何数据类型(如字符串,…...
智慧教室课堂-专注度及考试作弊系统、课堂动态点名,情绪识别、表情识别和人脸识别结合
课堂专注度分析: 课堂专注度表情识别 作弊检测: 关键点计算方法 转头(probe)低头(peep)传递物品(passing) 侧面的传递物品识别 逻辑回归关键点 使用: 运行setup.py安装必要内容 python setup.py build develop 运行demo_inference.py 将…...
单例模式简要介绍
学习目标: 单例模式 学习内容: 单例模式(Singleton Pattern)是一种设计模式,其主要目的是确保一个类只有一个实例,并且提供一个全局的访问点。它常用于需要全局唯一对象的场景,例如日志记录器、…...
深度学习面试问题总结(21)| 模型优化
本文给大家带来的百面算法工程师是深度学习模型优化面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习面试问题,并提供参考的回答及其理论基础&a…...
4月手机行业线上市场销售数据分析
政府对智能手机行业的支持政策,如5G推广,以及相关的产业政策,都在一定程度上推动了智能手机市场的发展,再加上AI应用的推广和全球科技迅猛发展,中国手机市场在2024年迎来了恢复性增长。 据鲸参谋数据统计,…...
首都师范大学聘请旅美经济学家向凌云为客座教授
2024年4月17日,首都师范大学客座教授聘任仪式在首都师范大学资源环境与旅游学院举行。首都师范大学资源环境与旅游学院院长吕拉昌主持了仪式,并为旅美经济学家向凌云教授颁发了聘书。 吕拉昌院长指出,要贯彻教育部产学研一体化战略࿰…...
多电脑共享鼠标键盘
由于要在两个电脑之间共用一套鼠标键盘,所以在此记录一下。 mouse without borders Mouse without Borders 是一款免费的 Windows 工具,允许你在多台电脑之间共享鼠标和键盘。 安装与配置步骤 下载和安装: 前往 Mouse without Borders 官…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
