ESP32-C5 和人教信息科技数字资源MQTT实验探究
本项目基于ESP32-C5开发板,通过MQTT协议连接人教信息科技数字资源平台,实现温湿度监测、四位数码管显示控制和RGB彩灯控制功能。 一、硬件组件清单
ESP32-C5开发板1主控制器
DHT11温湿度传感器1温湿度检测
TM1637四位数码管1数字显示
WS2812 RGB彩灯1彩色灯光效果
杜邦线若干线路连接
二、引脚连接表
组件ESP32-C5引脚说明
DHT11传感器GPIO 2温湿度数据引脚
TM1637 CLKGPIO 10数码管时钟线
TM1637 DIOGPIO 9数码管数据线
WS2812 RGBGPIO 3RGB彩灯数据线
DHT11 VCC3.3V电源正极
DHT11 GNDGND电源负极
TM1637 VCC3.3V电源正极
TM1637 GNDGND电源负极
WS2812 VCC3.3V电源正极
WS2812 GNDGND电源负极
三、软件环境配置1.Arduino IDE环境搭建2.安装Arduino IDE(2.3.6版本)3.添加ESP32开发板支持: 文件 → 首选项 → 附加开发板管理器网址 4.工具 → 开发板 → 开发板管理器 → 搜索"ESP32" → 安装5.选择开发板:ESP32-C56.安装所需库文件在Arduino IDE中安装以下库:PubSubClient(MQTT通信)DHT sensor library(温湿度传感器)TM1637数码管显示)Adafruit NeoPixelRGB彩灯)四、MQTT平台配置1.人教信息科技数字资源平台参数// MQTT服务器配置服务器地址: mqtt.mypep.cn端口: 1883用户名: nyCT5OOa密码: 1725T4D480// 主题配置传感器数据主题: 9F1V7D5MH8数码管控制主题: A8GM156F5jRGB彩灯控制主题: 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);
}
		页: 
[1]