当前位置: 首页 > news >正文

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


前言

此篇为番外篇,是 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 = 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. 结语


本小节完成了以下功能:

  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)

前言 此篇为番外篇,是 ESP8266 入门的其他功能教程,包括但不限于 DHT11 驱动TCP 通信Thingsboard 平台的接入阿里云物联网云平台接入华为云平台接入 1. 小节目标 使用 Lua 驱动 DHT11 传感器,获取温湿度的值 2. 进入主题 NodeMCU 基于 LUA 相关资料 官方文档&#xff1a;…...

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断&#xff0c;我们可以进行如下抽象。把CPU看做一个母亲&#xff0c;当它正在执行任务的时候&#xff0c;可以看为是一个母…...

PHP基础学习笔记(面向对象OOP)

类和对象 <?php //声明一个名为 Fruit 的类&#xff0c;它包含两个属性&#xff08;$name 和 $color&#xff09;以及两个用于设置和获取 $name 属性的方法 set_name() 和 get_name()&#xff1a; class Fruit {// Propertiespublic $name;public $color;// Methodsfuncti…...

Mysql超详细安装配置教程(保姆级图文)

MySQL是一种流行的开源关系型数据库管理系统&#xff0c;它广泛用于网站和服务的数据存储和管理。MySQL以其高性能、可靠性和易用性而闻名&#xff0c;是许多Web应用程序的首选数据库解决方案之一。 一、下载安装包 &#xff08;1&#xff09;从网盘下载安装文件 点击此处直…...

HR招聘测评,如何判断候选人的团队协作能力?

什么是团队协作能力&#xff1f; 团队协作能力&#xff0c;说的是在集体环境中&#xff0c;能同他人协同工作&#xff0c;为追求共同的目标而努力&#xff0c;其中包括沟通&#xff0c;表达&#xff0c;协调&#xff0c;尊重&#xff0c;信任&#xff0c;责任共担等一系列综合…...

[STM32-HAL库]Flash库-HAL库-复杂数据读写-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C6T6

目录 一、前言 二、实现步骤 1.STM32CUBEMX配置 2.导入Flash库 3.分析地址范围 4.找到可用的地址 5.写入读取普通数据 6.写入读取字符串 6.1 存储相关信息 6.2 存取多个参数 三、总结及源码 一、前言 在面对需要持久化存储的数据时&#xff0c;除了挂载TF卡&#xff0c;我们…...

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&#xff08;Remote Terminal Unit&#xff09;是一种串行通信协议&#xff0…...

【Qt】如何优雅的进行界面布局

文章目录 1 :peach:写在前面:peach:2 :peach:垂直布局:peach:3 :peach:水平布局:peach:4 :peach:网格布局:peach:5 :peach:表单布局:peach: 1 &#x1f351;写在前面&#x1f351; 之前使⽤ 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 中&#xff0c;事件循环由 libuv 库…...

关于基础的流量分析(1)

1.对于流量分析基本认识 1&#xff09;简介&#xff1a;网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 2&#xff09;在我们平时的考核和CTF比赛中&#xff0c;基本每次都有…...

数据结构---树,二叉树的简单概念介绍、堆和堆排序

树 树的概念和结构 结构 在我们将堆之前&#xff0c;我们先来了解一下我们的树。 我们的堆是属于树里面的一种&#xff0c; 树是一种非线性结构&#xff0c;是一种一对多的一种结构&#xff0c;也就是我们的一个节点可能有多个后继节点&#xff0c;当然也可以只有一个或者没…...

MySQL聚合函数(多行函数)

聚合函数&#xff08;多行函数&#xff09; 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见聚合函数 AVG和SUM函数 只作用于数值类型数据&#xff0c;不包含NULL 求工资平均值和总和 MIN和MAX函数 可以作用于任何数据类型&#xff08;如字符串&#xff0c…...

智慧教室课堂-专注度及考试作弊系统、课堂动态点名,情绪识别、表情识别和人脸识别结合

课堂专注度分析&#xff1a; 课堂专注度表情识别 作弊检测&#xff1a; 关键点计算方法 转头(probe)低头(peep)传递物品(passing) 侧面的传递物品识别 逻辑回归关键点 使用&#xff1a; 运行setup.py安装必要内容 python setup.py build develop 运行demo_inference.py 将…...

单例模式简要介绍

学习目标&#xff1a; 单例模式 学习内容&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并且提供一个全局的访问点。它常用于需要全局唯一对象的场景&#xff0c;例如日志记录器、…...

深度学习面试问题总结(21)| 模型优化

本文给大家带来的百面算法工程师是深度学习模型优化面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&a…...

4月手机行业线上市场销售数据分析

政府对智能手机行业的支持政策&#xff0c;如5G推广&#xff0c;以及相关的产业政策&#xff0c;都在一定程度上推动了智能手机市场的发展&#xff0c;再加上AI应用的推广和全球科技迅猛发展&#xff0c;中国手机市场在2024年迎来了恢复性增长。 据鲸参谋数据统计&#xff0c;…...

首都师范大学聘请旅美经济学家向凌云为客座教授

2024年4月17日&#xff0c;首都师范大学客座教授聘任仪式在首都师范大学资源环境与旅游学院举行。首都师范大学资源环境与旅游学院院长吕拉昌主持了仪式&#xff0c;并为旅美经济学家向凌云教授颁发了聘书。 吕拉昌院长指出&#xff0c;要贯彻教育部产学研一体化战略&#xff0…...

多电脑共享鼠标键盘

由于要在两个电脑之间共用一套鼠标键盘&#xff0c;所以在此记录一下。 mouse without borders Mouse without Borders 是一款免费的 Windows 工具&#xff0c;允许你在多台电脑之间共享鼠标和键盘。 安装与配置步骤 下载和安装&#xff1a; 前往 Mouse without Borders 官…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...