{ "title": "基于ESP32和RP2040的MQTT多传感器数据采集与报警系统", "description": "本系统使用ESP32和RP2040分别作为数据采集端和数据处理端,通过MQTT协议进行通信,实现多传感器数据的采集、分析和报警功能。系统支持DHT11、DS18B20温度传感器和电位器电压采集,并可根据设定阈值触发报警,通过OLED屏幕显示报警信息和数据信息,同时使用蜂鸣器和WS2812灯发出报警信号。", "keywords": "ESP32, RP2040, MQTT, 多传感器, 数据采集, 报警, DHT11, DS18B20, 电位器, OLED, 蜂鸣器, WS2812", "content": ""A同学的ESP32代码:"\n"import machine\nimport network\nimport utime\nfrom umqtt.robust import MQTTClient\n\n# WiFi配置\nWIFI_SSID = "your_wifi_ssid"\nWIFI_PASSWORD = "your_wifi_password"\n\n# MQTT服务器配置\nMQTT_SERVER = "mqtt_server_ip"\nMQTT_PORT = 1883\nMQTT_TOPIC = ["B_topic", "C_topic", "D_topic"]\n\n# 阈值和报警值\nTHRESHOLD = 10\nALARM_THRESHOLD = 20\n\n# OLED配置\nOLED_SCL_PIN = 22\nOLED_SDA_PIN = 21\nOLED_ADDR = 0x3C\n\n# 蜂鸣器配置\nBUZZER_PIN = 17\n\n# 初始化WiFi连接\ndef connect_wifi():\n station = network.WLAN(network.STA_IF)\n station.active(True)\n station.connect(WIFI_SSID, WIFI_PASSWORD)\n while not station.isconnected():\n utime.sleep(1)\n print("WiFi connected")\n\n# 初始化MQTT连接\ndef connect_mqtt():\n client = MQTTClient(client_id="A_client", server=MQTT_SERVER, port=MQTT_PORT)\n client.connect()\n client.set_callback(on_message)\n for topic in MQTT_TOPIC:\n client.subscribe(topic)\n return client\n\n# 接收MQTT消息的回调函数\ndef on_message(topic, message):\n print("Received message: ", message)\n uart.write(message) # 将消息通过串口发送给RP2040\n\n# 初始化OLED屏幕\ndef init_oled():\n i2c = machine.I2C(scl=machine.Pin(OLED_SCL_PIN), sda=machine.Pin(OLED_SDA_PIN))\n display = ssd1306.SSD1306_I2C(128, 64, i2c, addr=OLED_ADDR)\n return display\n\n# 在OLED上显示数据信息\ndef display_data(display, data):\n display.fill(0)\n display.text("Data:", 0, 0)\n display.text(data, 0, 16)\n display.show()\n\n# 闪烁OLED屏幕\ndef blink_oled(display):\n for _ in range(5):\n display.fill(0)\n display.show()\n utime.sleep(0.5)\n display.text("Problem", 0, 0)\n display.show()\n utime.sleep(0.5)\n\n# 发出报警信号\ndef alarm():\n buzzer = machine.Pin(BUZZER_PIN, machine.Pin.OUT)\n for _ in range(10):\n buzzer.on()\n utime.sleep(0.1)\n buzzer.off()\n utime.sleep(0.1)\n\n# 主程序\ndef main():\n connect_wifi()\n mqtt_client = connect_mqtt()\n display = init_oled()\n uart = machine.UART(1, 115200) # 初始化串口\n while True:\n mqtt_client.check_msg() # 检查MQTT消息\n if uart.any():\n data = uart.read().decode().strip()\n display_data(display, data)\n if int(data) > THRESHOLD:\n blink_oled(display)\n alarm()\n utime.sleep(1)\n\nif name == "main":\n main()"\n"A同学的RP2040代码:"\n"import machine\nimport utime\n\n# 阈值和报警值\nTHRESHOLD = 10\nALARM_THRESHOLD = 20\n\n# 初始化串口\nuart = machine.UART(0, baudrate=115200, tx=machine.Pin(0), rx=machine.Pin(1))\n\n# 检测温度、湿度和电压\ndef read_sensor_values():\n dht11 = DHT11(machine.Pin(2))\n temperature = dht11.temperature()\n humidity = dht11.humidity()\n voltage = machine.ADC(26).read_u16() * 3.3 / (216)\n return temperature, humidity, voltage\n\n# 发送数据给A同学\ndef send_data_to_a(data):\n uart.write(str(data).encode())\n\n# 主程序\ndef main():\n while True:\n temperature, humidity, voltage = read_sensor_values()\n data = {\n "temperature": temperature,\n "humidity": humidity,\n "voltage": voltage\n }\n send_data_to_a(data)\n if any(value > THRESHOLD for value in data.values()):\n led = machine.Pin(25, machine.Pin.OUT)\n for _ in range(5):\n led.toggle()\n utime.sleep(0.5)\n utime.sleep(1)\n\nif name == "main":\n main()"\n"B同学的ESP32代码:"\n"import machine\nimport network\nimport utime\nfrom umqtt.robust import MQTTClient\n\n# WiFi配置\nWIFI_SSID = "your_wifi_ssid"\nWIFI_PASSWORD = "your_wifi_password"\n\n# MQTT服务器配置\nMQTT_SERVER = "mqtt_server_ip"\nMQTT_PORT = 1883\nMQTT_TOPIC = "A_topic"\n\n# 阈值和报警值\nTHRESHOLD = 10\nALARM_THRESHOLD = 20\n\n# WS2812灯配置\nWS2812_PIN = 16\nWS2812_NUM_LEDS = 1\n\n# DS18B20温度传感器配置\nDS18B20_PIN = 4\n\n# 初始化WiFi连接\ndef connect_wifi():\n station = network.WLAN(network.STA_IF)\n station.active(True)\n station.connect(WIFI_SSID, WIFI_PASSWORD)\n while not station.isconnected():\n utime.sleep(1)\n print("WiFi connected")\n\n# 初始化MQTT连接\ndef connect_mqtt():\n client = MQTTClient(client_id="B_client", server=MQTT_SERVER, port=MQTT_PORT)\n client.connect()\n return client\n\n# 检测温度、湿度和电压\ndef read_sensor_values():\n dht11 = DHT11(machine.Pin(2))\n temperature = dht11.temperature()\n humidity = dht11.humidity()\n voltage = machine.ADC(26).read_u16() * 3.3 / (216)\n return temperature, humidity, voltage\n\n# 判断是否超过阈值\ndef check_threshold(data):\n return any(value > THRESHOLD for value in data.values())\n\n# 闪烁WS2812灯\ndef blink_ws2812():\n ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), WS2812_NUM_LEDS)\n for _ in range(10):\n ws2812[0] = (255, 0, 0)\n ws2812.write()\n utime.sleep(0.5)\n ws2812[0] = (0, 255, 0)\n ws2812.write()\n utime.sleep(0.5)\n\n# 打开DS18B20采集温度\ndef read_ds18b20_temperature():\n ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))\n roms = ds18b20.scan()\n ds18b20.convert_temp()\n utime.sleep_ms(750)\n temperature = ds18b20.read_temp(roms[0])\n return temperature\n\n# 主程序\ndef main():\n connect_wifi()\n mqtt_client = connect_mqtt()\n while True:\n temperature, humidity, voltage = read_sensor_values()\n data = {\n "temperature": temperature,\n "humidity": humidity,\n "voltage": voltage\n }\n mqtt_client.publish(MQTT_TOPIC, str(data))\n if check_threshold(data):\n blink_ws2812()\n temperature = read_ds18b20_temperature()\n print("Temperature: ", temperature)\n utime.sleep(1)\n\nif name == "main":\n main()"\n"C同学的ESP32代码:"\n"import machine\nimport network\nimport utime\nfrom umqtt.robust import MQTTClient\n\n# WiFi配置\nWIFI_SSID = "your_wifi_ssid"\nWIFI_PASSWORD = "your_wifi_password"\n\n# MQTT服务器配置\nMQTT_SERVER = "mqtt_server_ip"\nMQTT_PORT = 1883\nMQTT_TOPIC = "A_topic"\n\n# 阈值和报警值\nTHRESHOLD = 10\nALARM_THRESHOLD = 20\n\n# WS2812灯配置\nWS2812_PIN = 16\nWS2812_NUM_LEDS = 1\n\n# DS18B20温度传感器配置\nDS18B20_PIN = 4\n\n# 初始化WiFi连接\ndef connect_wifi():\n station = network.WLAN(network.STA_IF)\n station.active(True)\n station.connect(WIFI_SSID, WIFI_PASSWORD)\n while not station.isconnected():\n utime.sleep(1)\n print("WiFi connected")\n\n# 初始化MQTT连接\ndef connect_mqtt():\n client = MQTTClient(client_id="C_client", server=MQTT_SERVER, port=MQTT_PORT)\n client.connect()\n return client\n\n# 检测温度、湿度和电压\ndef read_sensor_values():\n dht11 = DHT11(machine.Pin(2))\n temperature = dht11.temperature()\n humidity = dht11.humidity()\n voltage = machine.ADC(26).read_u16() * 3.3 / (216)\n return temperature, humidity, voltage\n\n# 判断是否超过阈值\ndef check_threshold(data):\n return any(value > THRESHOLD for value in data.values())\n\n# 闪烁WS2812灯\ndef blink_ws2812():\n ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), WS2812_NUM_LEDS)\n for _ in range(10):\n ws2812[0] = (255, 0, 0)\n ws2812.write()\n utime.sleep(0.5)\n ws2812[0] = (0, 255, 0)\n ws2812.write()\n utime.sleep(0.5)\n\n# 打开DS18B20采集温度\ndef read_ds18b20_temperature():\n ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))\n roms = ds18b20.scan()\n ds18b20.convert_temp()\n utime.sleep_ms(750)\n temperature = ds18b20.read_temp(roms[0])\n return temperature\n\n# 主程序\ndef main():\n connect_wifi()\n mqtt_client = connect_mqtt()\n while True:\n temperature, humidity, voltage = read_sensor_values()\n data = {\n "temperature": temperature,\n "humidity": humidity,\n "voltage": voltage\n }\n mqtt_client.publish(MQTT_TOPIC, str(data))\n if check_threshold(data):\n blink_ws2812()\n temperature = read_ds18b20_temperature()\n print("Temperature: ", temperature)\n utime.sleep(1)\n\nif name == "main":\n main()"\n"D同学的ESP32代码:"\n"import machine\nimport network\nimport utime\nfrom umqtt.robust import MQTTClient\n\n# WiFi配置\nWIFI_SSID = "your_wifi_ssid"\nWIFI_PASSWORD = "your_wifi_password"\n\n# MQTT服务器配置\nMQTT_SERVER = "mqtt_server_ip"\nMQTT_PORT = 1883\nMQTT_TOPIC = "A_topic"\n\n# 阈值和报警值\nTHRESHOLD = 10\nALARM_THRESHOLD = 20\n\n# WS2812灯配置\nWS2812_PIN = 16\nWS2812_NUM_LEDS = 1\n\n# DS18B20温度传感器配置\nDS18B20_PIN = 4\n\n# 初始化WiFi连接\ndef connect_wifi():\n station = network.WLAN(network.STA_IF)\n station.active(True)\n station.connect(WIFI_SSID, WIFI_PASSWORD)\n while not station.isconnected():\n utime.sleep(1)\n print("WiFi connected")\n\n# 初始化MQTT连接\ndef connect_mqtt():\n client = MQTTClient(client_id="D_client", server=MQTT_SERVER, port=MQTT_PORT)\n client.connect()\n return client\n\n# 检测温度、湿度和电压\ndef read_sensor_values():\n dht11 = DHT11(machine.Pin(2))\n temperature = dht11.temperature()\n humidity = dht11.humidity()\n voltage = machine.ADC(26).read_u16() * 3.3 / (216)\n return temperature, humidity, voltage\n\n# 判断是否超过阈值\ndef check_threshold(data):\n return any(value > THRESHOLD for value in data.values())\n\n# 闪烁WS2812灯\ndef blink_ws2812():\n ws2812 = neopixel.NeoPixel(machine.Pin(WS2812_PIN), WS2812_NUM_LEDS)\n for _ in range(10):\n ws2812[0] = (255, 0, 0)\n ws2812.write()\n utime.sleep(0.5)\n ws2812[0] = (0, 255, 0)\n ws2812.write()\n utime.sleep(0.5)\n\n# 打开DS18B20采集温度\ndef read_ds18b20_temperature():\n ds18b20 = ds18x20.DS18X20(machine.Pin(DS18B20_PIN))\n roms = ds18b20.scan()\n ds18b20.convert_temp()\n utime.sleep_ms(750)\n temperature = ds18b20.read_temp(roms[0])\n return temperature\n\n# 主程序\ndef main():\n connect_wifi()\n mqtt_client = connect_mqtt()\n while True:\n temperature, humidity, voltage = read_sensor_values()\n data = {\n "temperature": temperature,\n "humidity": humidity,\n "voltage": voltage\n }\n mqtt_client.publish(MQTT_TOPIC, str(data))\n if check_threshold(data):\n blink_ws2812()\n temperature = read_ds18b20_temperature()\n print("Temperature: ", temperature)\n utime.sleep(1)\n\nif name == "main":\n main()"}

基于ESP32和RP2040的MQTT多传感器数据采集与报警系统

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

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