ESP32-wifi MPython dth11 activeMQ MQTT温湿度采集 嵌入式开发 物联网 边缘计算

2024-01-14 19:18:07 2点赞 10收藏 3评论

一、介绍
本项目采用ESP32开发板,每X秒采集一次DTH11温湿度传感器数据,通过ESP32自带WIFI,经MQTT协议传送给ActiveMQ中间件,便于后续开发和使用。

二、材料介绍
ESP32 CP2102 带WIFI 22元
DTH11 4元
透明防水塑料壳 8元
MicroUSB电源线 5元

lr8rbosb.pnglr8rbosb.pnglr8rec9n.pnglr8rec9n.pnglr8req49.pnglr8req49.png

三、ActiveMQ服务器配置
我这里使用docker一键部署ActiveMQ,并将MQTT端口映射到1883端口

lr8rgvxa.pnglr8rgvxa.png

四、硬件安装
将DTH11的正负连接ESP32的3.3V和GND针脚,数据连接至D13针脚

lr8ritdo.pnglr8ritdo.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.pnglr8rutjz.png

七、监测程序
登录ActiveMQ查看

lr8rx3m1.pnglr8rx3m1.png

mqttserver.py 在任意电脑上订阅数据

lr8s95ma.pnglr8s95ma.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太强大了!

展开 收起
3评论

  • 精彩
  • 最新
  • MQ端口映射那个图的IP是192.168.120.10后面都是10.0.10.129这个是自动识别还是根据实际修改?我想弄个水质丅DS的传感器订阅,应该同理吧 [邪恶]

    校验提示文案

    提交
    192是容器的ip,10是服务器的ip,容器端口映射在服务器上

    校验提示文案

    提交
    好吧,我的群晖不支持docker,正在搞套件里的mqtt

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
10
扫一下,分享更方便,购买更轻松