ESP32-wifi MPython dth11 activeMQ MQTT温湿度采集 嵌入式开发 物联网 边缘计算
一、介绍
本项目采用ESP32开发板,每X秒采集一次DTH11温湿度传感器数据,通过ESP32自带WIFI,经MQTT协议传送给ActiveMQ中间件,便于后续开发和使用。
二、材料介绍
ESP32 CP2102 带WIFI 22元
DTH11 4元
透明防水塑料壳 8元
MicroUSB电源线 5元
lr8rbosb.png
lr8rec9n.png
lr8req49.png三、ActiveMQ服务器配置
我这里使用docker一键部署ActiveMQ,并将MQTT端口映射到1883端口
lr8rgvxa.png四、硬件安装
将DTH11的正负连接ESP32的3.3V和GND针脚,数据连接至D13针脚
lr8ritdo.png五、代码开发
1、ESP32刷写为MPython开发环境
2、新建main.py,此脚本ESP32上电即会自动运行
main.py 主程序
import random
from machine import Pin, SPI
import time,machine
import dht11,network,mrequests
from umqtt.simple import MQTTClient
import ujson
MQTT_CLIENT_ID = f'python-mqtt-{random.randint(0, 1000)}'
MQTT_BROKER = "10.0.10.129"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "mqtt001"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
dht = dht11.DHT11(Pin(13))
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
print("Connected!")
while True:
if wlan.isconnected() == False:
print("connect WiFi")
try:
wlan.connect('WiFissid','wifipassword')
except:
print("wifi false")
#pass
else:
dht.measure()
try:
client.connect()
message = ujson.dumps({
"temp": dht.temperature(),
"humidity": dht.humidity(),
})
#print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
print("mqtt push ok")
client.disconnect()
except:
print("mqtt push not ok")
#pass
time.sleep(3)
dth11.py DTH11传感器支持库
# DHT11/DHT22 driver for MicroPython on ESP8266
# MIT license; Copyright (c) 2016 Damien P. George
try:
from esp import dht_readinto
except:
from pyb import dht_readinto
class DHTBase:
def __init__(self, pin):
self.pin = pin
self.buf = bytearray(5)
def measure(self):
buf = self.buf
dht_readinto(self.pin, buf)
if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xff != buf[4]:
raise Exception("checksum error")
class DHT11(DHTBase):
def humidity(self):
return self.buf[0]
def temperature(self):
return self.buf[2]
class DHT22(DHTBase):
def humidity(self):
return (self.buf[0] << 8 | self.buf[1]) * 0.1
def temperature(self):
t = ((self.buf[2] & 0x7f) << 8 | self.buf[3]) * 0.1
if self.buf[2] & 0x80:
t = -t
return t
mrequests.py 一个比自带的requests更好用的网络库
六、运行程序
上电直接运行,注意,代码可以去掉终端输出的print,防止ESP32内存溢出
lr8rutjz.png七、监测程序
登录ActiveMQ查看
lr8rx3m1.pngmqttserver.py 在任意电脑上订阅数据
lr8s95ma.png# python3.6
import random
import time
from paho.mqtt import client as mqtt_client
broker = '10.0.10.129'
port = 1883
topic = "mqtt001"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %dn", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic "+time.asctime())
client.subscribe(topic)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
八、小结
ESP32 MPython太强大了!

cyc333
校验提示文案
cyc333
校验提示文案