STM32F103RCT6+ESP8266极简MQTT实战:5分钟实现云端温湿度监控与LED控制

在创客比赛和毕业设计中,快速验证物联网原型的能力往往决定项目成败。今天分享的这套方案,能让初学者在5分钟内完成从传感器数据采集到云端可视化的全流程。我们选用STM32F103RCT6作为主控,搭配ESP8266实现WiFi连接,通过MQTT协议与OneNET平台交互,最终实现温湿度数据上传和LED远程控制的双向通信。

1. 硬件准备与极简接线

1.1 硬件选型清单

  • 主控芯片:STM32F103RCT6(正点原子Mini板)
  • WiFi模块:ESP8266-01S(注意选择支持AT指令的固件版本)
  • 传感器:DHT11温湿度模块(性价比首选)
  • 执行器:普通LED灯(建议加220Ω限流电阻)

提示:ESP8266-01S有多个版本,确认模块背面印有"AI-Thinker"字样,这是兼容性最好的版本。

1.2 5线速接法

按照下表连接,可避免90%的硬件故障:

模块引脚 STM32连接点 注意事项
ESP8266 TX PA3 (USART2_RX) 交叉连接
ESP8266 RX PA2 (USART2_TX) 需电平转换
ESP8266 RST PA4 可接普通IO
ESP8266 VCC 3.3V 绝对禁止接5V
ESP8266 GND GND 共地必要
DHT11 DATA PA6 上拉4.7K电阻
DHT11 VCC 3.3V
DHT11 GND GND
LED阳极 PD2 串联电阻
LED阴极 GND
// 硬件初始化关键代码(STM32CubeMX生成)
void HAL_UART_MspInit(UART_HandleTypeDef* huart) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance == USART2) { // ESP8266通信串口
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

2. OneNET平台闪电配置

2.1 三分钟创建MQTT设备

  1. 登录OneNET控制台,进入多协议接入MQTT旧版
  2. 点击添加产品,产品类别选择"智能家居"
  3. 创建设备时记录三个关键参数:
    • PRODUCT_ID(产品ID)
    • DEVICE_ID(设备ID)
    • AUTH_INFO(鉴权信息)

2.2 数据可视化配置

应用管理中创建新应用,添加两个组件:

  1. 折线图组件
    • 数据流名称:temperaturehumidity
    • 刷新间隔:10秒
  2. 开关组件
    • 数据流名称:led_ctrl
    • 开指令:LED_ON
    • 关指令:LED_OFF

注意:平台地区选择"南京"时,服务器地址应为183.230.40.39,端口6002

3. 代码魔改要点

3.1 必须修改的三大文件

wifi.h中配置热点信息:

#define SSID "Your_WiFi_SSID"  // 2.4GHz网络
#define PASS "Your_Password"   // 避免特殊字符

mqtt.h中填写平台凭证:

#define PRODUCTID "你的产品ID" 
#define DEVICEID "你的设备ID"  
#define AUTHENTICATION "你的鉴权码"

mqtt.c中确认服务器地址:

sprintf(ServerIP,"%s","183.230.40.39"); 
ServerPort = 6002;  // 南京节点端口

3.2 数据上传逻辑优化

修改timer2.c中的定时器中断,精简数据上传格式:

void TIM2_IRQHandler(void) {
  if(DHT11_Read_Data(&temperature, &humidity) == SUCCESS) {
    char payload[128];
    sprintf(payload, "{\"temperature\":%.1f,\"humidity\":%.1f}", 
            temperature, humidity);
    MQTT_Publish("$dp", payload); // OneNET特定主题
  }
}

4. 故障闪电排查指南

4.1 WiFi连接失败

  • 现象:串口打印WIFI DISCONNECT
  • 解决方案
    1. 确认wifi.h中的SSID不含中文
    2. 检查路由器是否开启MAC过滤
    3. 尝试将ESP8266靠近路由器

4.2 MQTT服务器连接超时

  • 现象:持续输出MQTT Connect Timeout
  • 处理步骤
    1. 用PC端MQTT客户端测试相同服务器地址
    2. 检查设备时间戳(NTP对时)
    3. 确认产品ID/设备ID无空格

4.3 数据上传但平台不显示

  • 典型原因:数据流名称不匹配
  • 快速验证
# Linux下用mosquitto测试
mosquitto_pub -h 183.230.40.39 -p 6002 -t "$dp" -m "{\"temperature\":25.5}" -u "产品ID" -P "鉴权码" -i "设备ID"

最后分享一个实战技巧:在control.c中添加LED状态反馈机制,当收到云平台指令时,不仅控制LED,同时上报当前状态:

void LED_Control(uint8_t state) {
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, state);
  char ack[64];
  sprintf(ack, "{\"led_status\":\"%s\"}", state?"ON":"OFF");
  MQTT_Publish("$dp", ack); 
}
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐