9浏览
查看: 9|回复: 0

[ESP8266/ESP32] ESP32-C5 和人教信息科技数字资源MQTT实验探究

[复制链接]

本项目基于ESP32-C5开发板,通过MQTT协议连接人教信息科技数字资源平台,实现温湿度监测、四位数码管显示控制和RGB彩灯控制功能。
一、硬件组件清单
ESP32-C5开发板
1
主控制器
DHT11温湿度传感器
1
温湿度检测
TM1637四位数码管
1
数字显示
WS2812 RGB彩灯
1
彩色灯光效果
杜邦线
若干
线路连接
二、引脚连接表
组件
ESP32-C5引脚
说明
DHT11传感器
GPIO 2
温湿度数据引脚
TM1637 CLK
GPIO 10
数码管时钟线
TM1637 DIO
GPIO 9
数码管数据线
WS2812 RGB
GPIO 3
RGB彩灯数据线
DHT11 VCC
3.3V
电源正极
DHT11 GND
GND
电源负极
TM1637 VCC
3.3V
电源正极
TM1637 GND
GND
电源负极
WS2812 VCC
3.3V
电源正极
WS2812 GND
GND
电源负极
ESP32-C5 和人教信息科技数字资源MQTT实验探究图2
三、软件环境配置
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.人教信息科技数字资源平台参数
ESP32-C5 和人教信息科技数字资源MQTT实验探究图1
// MQTT服务器配置
服务器地址: mqtt.mypep.cn
端口: 1883
用户名: nyCT5OOa
密码: 1725T4D480
// 主题配置
传感器数据主题: 9F1V7D5MH8
数码管控制主题: A8GM156F5j
RGB彩灯控制主题: o67095E0Fw
ESP32-C5 和人教信息科技数字资源MQTT实验探究图3
功能说明
1. 温湿度监测
自动每10秒读取DHT11传感器数据
通过MQTT发布JSON格式数据到平台
数据格式:`{"温度":25.5,"湿度":60.2}`
ESP32-C5 和人教信息科技数字资源MQTT实验探究图4
2. 数码管显示控制
通过MQTT接收显示指令
支持显示0-9999的数字
发送数字到主题 `A8GM156F5j` 即可控制显示
ESP32-C5 和人教信息科技数字资源MQTT实验探究图5
3. RGB彩灯控制
通过MQTT接收颜色指令
支持0-255的数值控制,对应不同颜色和效果:
  - 0: 关闭
  - 1: 红色
  - 2: 绿色
  - 3: 蓝色
  - 4: 黄色
  - 5: 紫色
  - 6: 青色
  - 7: 白色
  - 8: 暖白色
  - 9: 粉色
  - 10: 橙色
  - 11: 呼吸灯效果
  - 12: 彩虹循环效果
  - 13-255: 随机颜色
ESP32-C5 和人教信息科技数字资源MQTT实验探究图6
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服务器
ESP32-C5 和人教信息科技数字资源MQTT实验探究图7
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);
}


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail