ESP32 和 RP2040 微控制器 MQTT 监控系统 - 温度和湿度报警
ESP32 和 RP2040 微控制器 MQTT 监控系统 - 温度和湿度报警
本项目利用 ESP32 和 RP2040 微控制器构建一个完整的 MQTT 监控系统,实现对温度、湿度和其他参数的实时监控和报警功能。系统由四个部分组成,分别是中心端、采集端 A、采集端 B 和采集端 C。
中心端 (ESP32)
中心端负责接收来自三个采集端的 MQTT 消息,判断数据是否超过阈值。如果超过阈值,则通过 OLED 屏幕闪烁显示问题采集端,并显示出问题的参数,同时使用蜂鸣器发出报警信号。如果没有超过阈值,则将接收到的数据信息显示在 OLED 上。
ESP32 代码(中心端):
import machine
import network
import time
from umqtt.simple import MQTTClient
# WiFi 配置
WIFI_SSID = 'your_wifi_ssid'
WIFI_PASSWORD = 'your_wifi_password'
# MQTT 配置
MQTT_SERVER = 'your_mqtt_server'
MQTT_PORT = 1883
MQTT_TOPIC = 'A_topic'
MQTT_SUBTOPICS = ['B_topic', 'C_topic', 'D_topic']
MQTT_CLIENT_ID = 'A_client'
# 阈值配置
THRESHOLD = 50
# GPIO 配置
BUZZER_PIN = 13
OLED_SCL_PIN = 22
OLED_SDA_PIN = 21
# MQTT 消息回调函数
def mqtt_callback(topic, msg):
try:
value = int(msg)
if value > THRESHOLD:
# 发送消息到 RP2040
uart.write(msg)
# 闪烁 OLED 屏幕
for i in range(5):
oled.fill(0)
oled.show()
time.sleep(0.5)
oled.text('Parameter: ' + str(topic), 0, 0)
oled.text('Value: ' + str(value), 0, 10)
oled.show()
time.sleep(0.5)
# 发出报警信号
buzzer.on()
time.sleep(2)
buzzer.off()
else:
# 显示接收到的数据信息
oled.fill(0)
oled.text('Parameter: ' + str(topic), 0, 0)
oled.text('Value: ' + str(value), 0, 10)
oled.show()
except ValueError:
pass
# 连接 WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
while not sta_if.isconnected():
pass
# 连接 MQTT 服务器
mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT)
mqtt_client.set_callback(mqtt_callback)
mqtt_client.connect()
for subtopic in MQTT_SUBTOPICS:
mqtt_client.subscribe(subtopic)
# 初始化串口
uart = machine.UART(1, baudrate=115200)
# 初始化 OLED 屏幕
i2c = machine.I2C(scl=machine.Pin(OLED_SCL_PIN), sda=machine.Pin(OLED_SDA_PIN))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 初始化蜂鸣器
buzzer = machine.Pin(BUZZER_PIN, machine.Pin.OUT)
# 循环接收 MQTT 消息
while True:
mqtt_client.check_msg()
time.sleep(1)
RP2040 MicroPython 代码:
import machine
import time
import ustruct
# 串口配置
UART_ID = 0
UART_BAUDRATE = 115200
UART_RX_PIN = 1
UART_TX_PIN = 0
# 阈值配置
THRESHOLD = 50
# 初始化串口
uart = machine.UART(UART_ID, baudrate=UART_BAUDRATE, rx=UART_RX_PIN, tx=UART_TX_PIN)
# 循环接收串口数据
while True:
if uart.any():
data = uart.readall()
try:
value = int(data)
if value > THRESHOLD:
# 采取相应的操作,例如发送报警信号
else:
# 采取相应的操作,例如显示数据信息
except ValueError:
pass
time.sleep(1)
采集端 A (ESP32)
采集端 A 负责检测 DHT11 温度值、湿度值和电位器电压 ADC 值,并将检测到的值通过串口发送给 ESP32,由 ESP32 发送给中心端。采集端 A 还判断检测到的值是否超过阈值。如果超过阈值,则交替闪烁红绿光的 WS2812 灯指示具体超过阈值的参数。采集端 A 还打开 DS18B20 采集温度,并将温度值和超过阈值的参数显示在屏幕上。采集端 A 最后将超过阈值的参数信息传递给采集端 B 和采集端 C。
ESP32 代码(采集端 A):
import machine
import network
import time
from umqtt.simple import MQTTClient
# WiFi 配置
WIFI_SSID = 'your_wifi_ssid'
WIFI_PASSWORD = 'your_wifi_password'
# MQTT 配置
MQTT_SERVER = 'your_mqtt_server'
MQTT_PORT = 1883
MQTT_TOPIC = 'A_topic'
MQTT_CLIENT_ID = 'B_client'
# 阈值配置
THRESHOLD = 50
# GPIO 配置
WS2812_PIN = 12
DS18B20_PIN = 14
# 初始化 WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
while not sta_if.isconnected():
pass
# 连接 MQTT 服务器
mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT)
mqtt_client.connect()
# 初始化 WS2812 灯
ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), 1)
# 初始化 DS18B20 温度传感器
ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))
roms = ds18b20.scan()
# 循环读取温度和其他参数的值
while True:
# 读取 DHT11 温度、湿度和电位器 ADC 值
temperature = dht11.temperature()
humidity = dht11.humidity()
adc_value = adc.read()
# 判断温度和湿度是否超过阈值
if temperature > THRESHOLD:
ws2812[0] = (255, 0, 0) # 红色
ws2812.write()
else:
ws2812[0] = (0, 255, 0) # 绿色
ws2812.write()
# 发送温度和湿度值到中心端
mqtt_client.publish('B_topic', str(temperature))
mqtt_client.publish('B_topic', str(humidity))
# 显示温度和湿度值以及超过阈值的参数信息
print('Temperature: ', temperature)
print('Humidity: ', humidity)
print('ADC Value: ', adc_value)
# 读取 DS18B20 温度值
ds18b20.convert_temp()
time.sleep_ms(750)
for rom in roms:
temperature = ds18b20.read_temp(rom)
print('DS18B20 Temperature: ', temperature)
time.sleep(2)
采集端 B (ESP32)
采集端 B 负责检测 DHT11 温度值、湿度值和电位器电压 ADC 值,并将检测到的值通过串口发送给 ESP32,由 ESP32 发送给中心端。采集端 B 还判断检测到的值是否超过阈值。如果超过阈值,则交替闪烁红绿光的 WS2812 灯指示具体超过阈值的参数。采集端 B 还打开 DS18B20 采集温度,并将温度值和超过阈值的参数显示在屏幕上。采集端 B 最后将超过阈值的参数信息传递给采集端 A 和采集端 C。
ESP32 代码(采集端 B):
import machine
import network
import time
from umqtt.simple import MQTTClient
# WiFi 配置
WIFI_SSID = 'your_wifi_ssid'
WIFI_PASSWORD = 'your_wifi_password'
# MQTT 配置
MQTT_SERVER = 'your_mqtt_server'
MQTT_PORT = 1883
MQTT_TOPIC = 'A_topic'
MQTT_CLIENT_ID = 'C_client'
# 阈值配置
THRESHOLD = 50
# GPIO 配置
WS2812_PIN = 12
DS18B20_PIN = 14
# 初始化 WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
while not sta_if.isconnected():
pass
# 连接 MQTT 服务器
mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT)
mqtt_client.connect()
# 初始化 WS2812 灯
ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), 1)
# 初始化 DS18B20 温度传感器
ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))
roms = ds18b20.scan()
# 循环读取温度和其他参数的值
while True:
# 读取 DHT11 温度、湿度和电位器 ADC 值
temperature = dht11.temperature()
humidity = dht11.humidity()
adc_value = adc.read()
# 判断温度和湿度是否超过阈值
if temperature > THRESHOLD:
ws2812[0] = (255, 0, 0) # 红色
ws2812.write()
else:
ws2812[0] = (0, 255, 0) # 绿色
ws2812.write()
# 发送温度和湿度值到中心端
mqtt_client.publish('C_topic', str(temperature))
mqtt_client.publish('C_topic', str(humidity))
# 显示温度和湿度值以及超过阈值的参数信息
print('Temperature: ', temperature)
print('Humidity: ', humidity)
print('ADC Value: ', adc_value)
# 读取 DS18B20 温度值
ds18b20.convert_temp()
time.sleep_ms(750)
for rom in roms:
temperature = ds18b20.read_temp(rom)
print('DS18B20 Temperature: ', temperature)
time.sleep(2)
采集端 C (ESP32)
采集端 C 负责检测 DHT11 温度值、湿度值和电位器电压 ADC 值,并将检测到的值通过串口发送给 ESP32,由 ESP32 发送给中心端。采集端 C 还判断检测到的值是否超过阈值。如果超过阈值,则交替闪烁红绿光的 WS2812 灯指示具体超过阈值的参数。采集端 C 还打开 DS18B20 采集温度,并将温度值和超过阈值的参数显示在屏幕上。采集端 C 最后将超过阈值的参数信息传递给采集端 A 和采集端 B。
ESP32 代码(采集端 C):
import machine
import network
import time
from umqtt.simple import MQTTClient
# WiFi 配置
WIFI_SSID = 'your_wifi_ssid'
WIFI_PASSWORD = 'your_wifi_password'
# MQTT 配置
MQTT_SERVER = 'your_mqtt_server'
MQTT_PORT = 1883
MQTT_TOPIC = 'A_topic'
MQTT_CLIENT_ID = 'D_client'
# 阈值配置
THRESHOLD = 50
# GPIO 配置
WS2812_PIN = 12
DS18B20_PIN = 14
# 初始化 WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
while not sta_if.isconnected():
pass
# 连接 MQTT 服务器
mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT)
mqtt_client.connect()
# 初始化 WS2812 灯
ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), 1)
# 初始化 DS18B20 温度传感器
ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))
roms = ds18b20.scan()
# 循环读取温度和其他参数的值
while True:
# 读取 DHT11 温度、湿度和电位器 ADC 值
temperature = dht11.temperature()
humidity = dht11.humidity()
adc_value = adc.read()
# 判断温度和湿度是否超过阈值
if temperature > THRESHOLD:
ws2812[0] = (255, 0, 0) # 红色
ws2812.write()
else:
ws2812[0] = (0, 255, 0) # 绿色
ws2812.write()
# 发送温度和湿度值到中心端
mqtt_client.publish('D_topic', str(temperature))
mqtt_client.publish('D_topic', str(humidity))
# 显示温度和湿度值以及超过阈值的参数信息
print('Temperature: ', temperature)
print('Humidity: ', humidity)
print('ADC Value: ', adc_value)
# 读取 DS18B20 温度值
ds18b20.convert_temp()
time.sleep_ms(750)
for rom in roms:
temperature = ds18b20.read_temp(rom)
print('DS18B20 Temperature: ', temperature)
time.sleep(2)
总结
本项目提供了一个完整的 MQTT 监控系统,可以方便地实现对温度、湿度和其他参数的实时监控和报警功能。代码示例可以作为参考,用户可以根据自己的实际硬件和网络配置进行修改和调整。
注意事项
- 以上代码示例仅供参考,可能需要根据实际硬件和网络配置进行修改和调整。
- 请确保所有设备都连接到同一个 WiFi 网络,并且 MQTT 服务器地址、端口号和主题名称正确。
- 请确保所有设备的阈值配置一致。
- 请确保所有设备的 GPIO 端口分配正确。
- 请确保所有设备的库文件都已安装。
扩展功能
- 可以添加更多参数,例如光照强度、噪音水平等。
- 可以添加更多报警方式,例如短信报警、邮件报警等。
- 可以添加更多显示方式,例如彩色 OLED 屏幕、LCD 屏幕等。
- 可以添加更多数据记录功能,例如将数据存储到 SD 卡、云平台等。
附录
- MQTT 协议简介:https://www.mqtt.org/
- ESP32 官方网站:https://www.espressif.com/
- RP2040 官方网站:https://www.raspberrypi.org/products/raspberry-pi-pico/
原文地址: https://www.cveoy.top/t/topic/pZ8n 著作权归作者所有。请勿转载和采集!