《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 官…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...