5分钟极速搭建:STM32+ESP8266物联网微信小程序控制方案
最近在帮几个学生做毕业设计时,发现很多初学者对物联网设备接入云平台存在畏难心理。其实借助现成的开发板和模块,配合国内成熟的云服务平台,完全可以在极短时间内搭建一个可用的物联网原型系统。今天我们就以最常见的STM32F103C8T6开发板(俗称"蓝莓派")和ESP8266 WiFi模块为例,手把手教你如何快速实现传感器数据上云和小程序远程控制。
这个方案特别适合需要快速验证想法的创客或参加电子竞赛的学生,所有代码和配置都已优化到最简,你只需要准备好硬件并按步骤操作即可。我们将使用中国移动的Onenet物联网平台作为数据中转站,微信小程序作为控制终端,整个流程包含硬件连接、云端配置和小程序开发三个部分。
1. 硬件准备与基础连接
首先确认你手头有以下硬件设备:
- STM32F103C8T6开发板(其他STM32F1系列也可)
- ESP8266 WiFi模块(推荐ESP-01S)
- 0.96寸OLED显示屏(SSD1306驱动)
- DHT11温湿度传感器
- 其他可选:LED、蜂鸣器、舵机等执行器件
硬件连接示意图:
| STM32引脚 | 连接模块 | 备注 |
|---|---|---|
| PA9 | ESP8266 TX | 需交叉连接 |
| PA10 | ESP8266 RX | 需交叉连接 |
| PB6 | OLED SCL | I2C时钟线 |
| PB7 | OLED SDA | I2C数据线 |
| PA0 | 电位器 | ADC输入 |
| PC13 | LED | 板载LED |
注意:ESP8266模块需要单独3.3V供电,建议使用稳压模块,避免因供电不足导致WiFi连接不稳定。
连接完成后,先测试各模块是否正常工作。可以使用以下简化的测试代码:
// OLED测试 void OLED_Test() { OLED_Init(); OLED_ShowString(0,0,"Hello World!",16); } // ESP8266测试 void ESP8266_Test() { printf("AT\r\n"); // 应返回"OK" delay(100); printf("AT+CWMODE=1\r\n"); // 设置为STA模式 delay(100); }2. Onenet平台快速配置
Onenet是中国移动推出的物联网开放平台,为开发者提供设备接入、数据存储和消息转发等服务。我们主要利用其MQTT协议实现设备与云端的双向通信。
2.1 创建产品与设备
登录Onenet控制台(https://open.iot.10086.cn/)
进入产品开发→创建产品:
- 产品名称:STM32_ESP8266_Demo
- 行业:其他
- 联网方式:WiFi
- 数据协议:MQTT旧版协议
在产品列表中进入刚创建的产品,选择设备列表→添加设备:
- 设备名称:My_Device_01
- 设备鉴权信息:自定义一个字符串(建议包含数字字母)
创建成功后记录以下关键信息:
- 产品ID:在"产品概况"页面查看
- 设备ID:在设备列表页面查看
- 鉴权信息:添加设备时设置的字符串
2.2 数据流与APIKey配置
进入设备详情页,选择数据流模板→添加数据流:
- temperature(温度)
- humidity(湿度)
- adc_value(ADC值)
进入APIKey管理→新增APIKey,权限选择"所有API权限"。
提示:APIKey只在创建时显示一次,请妥善保存。如果遗失需要重新生成。
3. STM32端代码配置
我们已经将核心代码封装成几个简单模块,你只需要修改关键配置即可使用。项目代码结构如下:
├── Core ├── Drivers ├── ESP8266 │ ├── esp8266.c // WiFi配置 │ └── esp8266.h ├── Onenet │ ├── onenet.c // 云平台配置 │ └── onenet.h └── User ├── main.c // 主程序 └── oled.c // 显示驱动3.1 关键配置修改
打开ESP8266/esp8266.c文件,修改以下参数:
// WiFi账号密码配置 const char* WIFI_SSID = "Your_WiFi_SSID"; const char* WIFI_PWD = "Your_WiFi_Password"; // Onenet MQTT服务器地址 const char* MQTT_SERVER = "183.230.40.39"; const uint16_t MQTT_PORT = 6002;打开Onenet/onenet.c文件,修改设备三元组信息:
// 设备鉴权信息 const char* PRODUCE_ID = "Your_Product_ID"; const char* DEVICE_ID = "Your_Device_ID"; const char* AUTH_INFO = "Your_Auth_Info";3.2 数据上传逻辑
主程序中已经实现了定时采集和上传数据的逻辑,你只需要关注传感器读取部分:
void Sensor_Update() { // 读取温湿度 DHT11_Read_Data(&temperature, &humidity); // 读取ADC值(0-3.3V对应0-4095) adc_value = Get_ADC_Value(ADC_CHANNEL_0); // OLED本地显示 OLED_ShowNum(0, 16, temperature, 2, 16); OLED_ShowNum(0, 32, humidity, 2, 16); OLED_ShowNum(0, 48, adc_value, 4, 16); // 上传到Onenet Onenet_Upload("temperature", temperature); Onenet_Upload("humidity", humidity); Onenet_Upload("adc_value", adc_value); }4. 微信小程序开发
微信小程序作为控制终端,主要实现数据显示和设备控制功能。我们提供了完整的小程序模板,你只需要修改几个关键配置即可使用。
4.1 开发环境准备
- 下载微信开发者工具(https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
- 注册小程序账号并获取AppID(一个邮箱只能注册一个小程序)
- 配置服务器域名:在小程序后台开发→开发管理→服务器域名中添加:
- https://api.heclouds.com
4.2 关键配置修改
- 修改
project.config.json文件中的appid:
{ "appid": "Your_AppID", "projectname": "Onenet_Control" }- 修改
pages/index/index.js中的设备信息:
// Onenet设备配置 const deviceConfig = { deviceId: 'Your_Device_ID', apiKey: 'Your_API_Key' }4.3 小程序功能解析
小程序核心功能包括:
- 实时数据显示:通过定时请求Onenet API获取最新数据
- 设备控制:发送MQTT指令到Onenet平台,再由平台转发给设备
- 报警阈值设置:当传感器数值超过阈值时触发蜂鸣器
控制LED的示例代码:
// 控制LED函数 function controlLED(status) { wx.request({ url: 'https://api.heclouds.com/cmds?device_id=' + deviceConfig.deviceId, method: 'POST', header: { 'api-key': deviceConfig.apiKey }, data: status ? 'LED_ON' : 'LED_OFF', success(res) { console.log('控制命令发送成功') } }) }5. 常见问题与调试技巧
在实际部署过程中,可能会遇到以下典型问题:
5.1 ESP8266连接不稳定
现象:WiFi经常断开或无法连接Onenet解决方案:
- 检查供电是否充足(建议单独3.3V稳压)
- 降低ESP8266的通信波特率(建议9600)
- 添加重连机制:
void WiFi_Reconnect() { if(ESP8266_Check() != 0) { ESP8266_Init(); Onenet_Connect(); } }5.2 数据上传失败
现象:Onenet平台收不到数据排查步骤:
- 使用串口调试助手查看ESP8266原始通信数据
- 检查设备三元组信息是否正确
- 确认网络时间同步(需要正确的UTC时间戳)
5.3 小程序控制无响应
现象:小程序发送指令但设备不执行解决方法:
- 检查Onenet平台是否收到指令(在"设备管理"→"下发命令记录"查看)
- 确认STM32正确解析了MQTT消息:
void Onenet_MessageHandler(char* topic, char* payload) { if(strstr(payload, "LED_ON")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); } else if(strstr(payload, "LED_OFF")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); } }完成以上所有步骤后,你应该已经拥有了一个完整的物联网监控系统。通过这个基础框架,你可以轻松扩展更多传感器和控制功能。比如添加光照传感器、继电器控制等,只需要遵循相同的MQTT通信协议即可。