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/
ESP32 和 RP2040 微控制器 MQTT 监控系统 - 温度和湿度报警

原文地址: https://www.cveoy.top/t/topic/pZ8n 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录