|
9| 0
|
[ESP8266/ESP32] ESP32-C5 和人教信息科技数字资源MQTT实验探究 |
|
本项目基于ESP32-C5开发板,通过MQTT协议连接人教信息科技数字资源平台,实现温湿度监测、四位数码管显示控制和RGB彩灯控制功能。 一、硬件组件清单
二、引脚连接表
![]() 三、软件环境配置 1.Arduino IDE环境搭建 2.安装Arduino IDE(2.3.6版本) 3.添加ESP32开发板支持: 文件 → 首选项 → 附加开发板管理器网址 4.工具 → 开发板 → 开发板管理器 → 搜索"ESP32" → 安装 5.选择开发板:ESP32-C5 6.安装所需库文件 在Arduino IDE中安装以下库: PubSubClient(MQTT通信) DHT sensor library(温湿度传感器) TM1637数码管显示) Adafruit NeoPixelRGB彩灯) 四、MQTT平台配置 1.人教信息科技数字资源平台参数 ![]() // MQTT服务器配置 服务器地址: mqtt.mypep.cn 端口: 1883 用户名: nyCT5OOa 密码: 1725T4D480 // 主题配置 传感器数据主题: 9F1V7D5MH8 数码管控制主题: A8GM156F5j RGB彩灯控制主题: o67095E0Fw ![]() 功能说明 1. 温湿度监测 自动每10秒读取DHT11传感器数据 通过MQTT发布JSON格式数据到平台 数据格式:`{"温度":25.5,"湿度":60.2}` ![]() 2. 数码管显示控制 通过MQTT接收显示指令 支持显示0-9999的数字 发送数字到主题 `A8GM156F5j` 即可控制显示 ![]() 3. RGB彩灯控制 通过MQTT接收颜色指令 支持0-255的数值控制,对应不同颜色和效果: - 0: 关闭 - 1: 红色 - 2: 绿色 - 3: 蓝色 - 4: 黄色 - 5: 紫色 - 6: 青色 - 7: 白色 - 8: 暖白色 - 9: 粉色 - 10: 橙色 - 11: 呼吸灯效果 - 12: 彩虹循环效果 - 13-255: 随机颜色 ![]() 4.使用步骤 (1)硬件连接 按照引脚连接表正确连接所有组件 (2)软件配置 打开Arduino IDE,载入提供的代码 修改WiFi配置(如果需要): const char ssid = "你的WiFi名称"; const char password = "你的WiFi密码"; (3)确认MQTT配置参数正确 5.上传程序 (1)选择正确的开发板和端口 (2)点击上传按钮编译并上传程序 6.系统启动 (1)打开串口监视器(波特率115200) (2)观察启动日志,确认连接状态 (3)系统正常启动后,将自动连接WiFi和MQTT服务器 ![]() 7.平台操作 通过MQTT客户端向相应主题发送消息: 控制数码管显示:向 `A8GM156F5j` 发送数字(0-9999) 控制RGB彩灯:向 `o67095E0Fw` 发送颜色代码(0-255) 接收传感器数据:订阅 `9F1V7D5MH8` 主题 8.具体代码 #include <WiFi.h> #include <PubSubClient.h>#include <DHT.h> #include <TM1637Display.h> // WiFi配置 const char *ssid = "Mate 60"; const char *password = "d12345678"; // MQTT配置 const char* mqtt_server = "mqtt.mypep.cn"; const char* mqtt_username = "nyCT5OOa"; const char* mqtt_password = "1725T4D480"; const char* mqtt_topic_sensor = "9F1V7D5MH8"; const char* mqtt_topic_display = "A8GM156F5j"; const char* mqtt_topic_rgb = "o67095E0Fw"; const int mqtt_port = 1883; // DHT11传感器配置 #define DHT_PIN 2 #define DHT_TYPE DHT11 // TM1637四位数码管配置 #define CLK_PIN 10 #define DIO_PIN 9 // RGB彩灯配置 - 使用PWM控制普通RGB灯(非WS2812) #define RGB_PIN 3 WiFiClient espClient; PubSubClient client(espClient); DHT dht(DHT_PIN, DHT_TYPE); TM1637Display display(CLK_PIN, DIO_PIN); unsigned long previousMillis = 0; const long interval = 10000; int displayNumber = 0; void setup() { Serial.begin(115200); delay(5000); Serial.println("===================================="); Serial.println("ESP32-C5 多功能物联网系统"); Serial.println("===================================="); // 初始化传感器 dht.begin(); Serial.println("DHT11传感器初始化完成"); // 初始化数码管 display.setBrightness(7); display.showNumberDec(0); Serial.println("四位数码管初始化完成"); // 初始化RGB引脚 pinMode(RGB_PIN, OUTPUT); digitalWrite(RGB_PIN, LOW); Serial.println("RGB彩灯初始化完成"); // 连接WiFi setupWiFi(); // 设置MQTT client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); Serial.println("系统初始化完成"); } void setupWiFi() { WiFi.begin(ssid, password); Serial.print("连接WiFi"); for(int i = 0; i < 20; i++) { if (WiFi.status() == WL_CONNECTED) break; delay(1000); Serial.print("."); } Serial.println(); if (WiFi.status() == WL_CONNECTED) { Serial.println("✅ WiFi连接成功"); } } // 简化版RGB控制(单色LED) void setRGBByNumber(int value) { switch(value) { case 0: // 关 digitalWrite(RGB_PIN, LOW); Serial.println("RGB灯关闭"); break; case 1: // 开 digitalWrite(RGB_PIN, HIGH); Serial.println("RGB灯开启"); break; case 2: // 闪烁慢 for(int i=0; i<3; i++) { digitalWrite(RGB_PIN, HIGH); delay(500); digitalWrite(RGB_PIN, LOW); delay(500); } Serial.println("RGB灯: 慢闪"); break; case 3: // 闪烁快 for(int i=0; i<6; i++) { digitalWrite(RGB_PIN, HIGH); delay(200); digitalWrite(RGB_PIN, LOW); delay(200); } Serial.println("RGB灯: 快闪"); break; case 4: // 呼吸效果 for(int i=0; i<2; i++) { for(int j=0; j<100; j++) { analogWrite(RGB_PIN, j); delay(20); } for(int j=100; j>=0; j--) { analogWrite(RGB_PIN, j); delay(20); } } digitalWrite(RGB_PIN, LOW); Serial.println("RGB灯: 呼吸效果"); break; default: // 根据数值设置亮度 analogWrite(RGB_PIN, min(value, 255)); Serial.print("RGB灯亮度: "); Serial.println(min(value, 255)); break; } } void callback(char* topic, byte* payload, unsigned int length) { String message = ""; for (int i = 0; i < length; i++) { message += (char)payload; } Serial.print("收到消息 ["); Serial.print(topic); Serial.print("]: "); Serial.println(message); if (String(topic) == mqtt_topic_display) { int number = message.toInt(); if (number >= 0 && number <= 9999) { displayNumber = number; display.showNumberDec(displayNumber); Serial.print("数码管显示: "); Serial.println(displayNumber); } } else if (String(topic) == mqtt_topic_rgb) { int value = message.toInt(); if (value >= 0 && value <= 255) { setRGBByNumber(value); } } } void reconnectMQTT() { if (!client.connected()) { Serial.print("连接MQTT..."); String clientId = "ESP32C5-" + String(random(0xffff), HEX); if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) { Serial.println("✅ 连接成功"); client.subscribe(mqtt_topic_sensor); client.subscribe(mqtt_topic_display); client.subscribe(mqtt_topic_rgb); } else { Serial.print("❌ 失败, rc="); Serial.println(client.state()); } } } void loop() { if (WiFi.status() == WL_CONNECTED) { reconnectMQTT(); client.loop(); } unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; float h = dht.readHumidity(); float t = dht.readTemperature(); if (!isnan(h) && !isnan(t)) { Serial.print("温度:"); Serial.print(t); Serial.print("°C, 湿度:"); Serial.print(h); Serial.println("%"); String data = "{\"温度\":" + String(t,1) + ",\"湿度\":" + String(h,1) + "}"; if (client.connected()) { client.publish(mqtt_topic_sensor, data.c_str()); Serial.println("数据已发送"); } } else { Serial.println("❌ 读取DHT11传感器失败!"); } } delay(1000); } |
沪公网安备31011502402448© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed