1. 项目背景与硬件准备
温湿度监控是物联网领域最基础也最实用的场景之一。想象一下,你出差在外,突然想起家里的宠物或珍贵藏品,只需打开手机就能查看实时环境数据——这就是我们要实现的功能。这个项目特别适合刚接触物联网的开发者,因为它用到了最常见的硬件组合:STM32F103C8T6(俗称"蓝莓派")和ESP8266 WiFi模块。
我手头用的是一块20块钱的STM32最小系统板,搭配NodeMCU开发板(内置ESP8266)。选择这个组合有三个原因:一是成本极低(整套硬件不超过50元),二是社区资源丰富(遇到问题容易找到解决方案),三是机智云平台对这两个硬件有现成的支持。实际测试中,这套系统在室内环境下数据上报间隔可以稳定控制在5秒以内,完全满足日常监控需求。
硬件连接非常简单:
- STM32的PA2/PA3(USART2)接ESP8266的TXD/RXD
- 共用3.3V电源(注意ESP8266峰值电流可能达到200mA)
- DHT11温湿度传感器接STM32的PB12引脚
注意:如果使用独立ESP-01S模块,需要额外连接CH_PD引脚到3.3V,且建议在电源端并联100μF电容。
2. 机智云平台配置
在开始写代码前,我们需要在机智云开发者中心(https://dev.gizwits.com)完成三件事:
创建产品:选择"智能家居→环境监测"类别,数据点建议至少添加:
- temperature(float类型,读写属性)
- humidity(float类型,读写属性)
- alert(bool类型,用于异常报警)
下载开发资源:关键文件包括:
- Gizwits协议库(gizwits_product.c/h)
- ESP8266固件(GAgent_00ESP826_04020023_combine.bin)
- 手机APP SDK(可直接用官方"机智云"APP)
记录产品密钥:在product.h中需要填写的PRODUCT_KEY和PRODUCT_SECRET,可以在产品基本信息页找到。我遇到过因为复制时多了一个空格导致配网失败的情况,建议粘贴后仔细检查。
有个实用技巧:在"服务→虚拟设备"里可以先创建虚拟设备测试数据通信,这样不用等硬件准备好就能验证协议逻辑。我通常会先用这个功能模拟温湿度变化,确保APP端显示正常后再接真实传感器。
3. STM32标准库工程搭建
使用Keil MDK新建工程时,建议选择STM32F10x_HD宏定义(虽然C8T6是64KB Flash,但实测使用HD系列驱动更稳定)。需要特别注意标准库与机智云SDK的兼容性问题,以下是关键配置步骤:
- 时钟配置:在system_stm32f10x.c中确保系统时钟设为72MHz
#define SYSCLK_FREQ_72MHz 72000000- 串口初始化:修改usart.c以支持ESP8266通信
USART_InitStructure.USART_BaudRate = 9600; // 机智云固件默认波特率 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 必须开启接收中断- 定时器配置:TIM3用于协议心跳包
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 7199; // 1ms中断 TIM_TimeBaseStructure.TIM_Prescaler = 9; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);移植机智云SDK时最容易出错的是gizwits_product.c文件的修改。需要重点处理这几个函数:
- userHandle():数据上报入口
- gizwitsEventProcess():云端指令处理
- gizwitsTimerMs():获取系统时间戳
我建议先保留所有HAL库相关代码的注释,等基础通信建立后再逐步添加功能。遇到过最头疼的问题是协议解析失败,后来发现是串口接收缓存区大小不足,将USART_RX_BUF_LEN改为256后解决。
4. ESP8266固件烧录与配网
烧录机智云GAgent固件时,不同ESP8266模块的GPIO0连接方式容易混淆。以ESP-01S为例:
烧录模式接线:
- GPIO0 → GND
- VCC → 3.3V(必须稳定)
- RST先接GND再断开实现复位
使用Flash下载工具配置:
- 选择COM口(CH340驱动需提前安装)
- 波特率115200
- SPI MODE设为DIO
- Flash Size选8Mbit(1MB)
实测发现安信可的烧录工具比乐鑫原厂更稳定,特别是在Windows 10系统下。
配网阶段有两种模式可选,我通常推荐AirLink模式:
- 长按STM32上的配网按键(PA2)3秒进入配网模式
- 手机连接目标WiFi(2.4GHz频段)
- 打开机智云APP→添加设备→一键配置
- 输入WiFi密码后等待约30秒
常见问题排查:
- 配网超时:检查路由器是否开启了5GHz频段(ESP8266不支持)
- 频繁掉线:尝试在路由器设置静态IP绑定
- 数据延迟:修改gizwitsHandle()调用频率(建议200-500ms)
5. 手机APP开发与调试
虽然可以直接使用官方APP,但自定义界面会更实用。机智云提供了两种方案:
方案A:使用AppFramework(适合快速开发)
- 下载Android Studio模板工程
- 修改res/values/gizwits.xml中的产品信息
- 主要修改点:
<string name="product_key">你的PRODUCT_KEY</string> <array name="wifi_type"> <item>乐鑫</item> <!-- ESP8266厂商 --> </array>方案B:原生集成SDK(更灵活)关键初始化代码:
GizWifiSDK.sharedInstance().setListener(this); GizWifiSDK.sharedInstance().startWithAppID(getApplicationContext(), APP_ID, APP_SECRET);数据收发处理示例:
@Override public void didReceiveData(GizWifiDevice device, GizWifiErrorCode result, Map<String, Object> dataMap) { if(dataMap.containsKey("temperature")) { float temp = (Float)dataMap.get("temperature"); runOnUiThread(() -> tempTextView.setText(String.format("%.1f℃", temp))); } }我在实际项目中发现,APP后台运行时容易断开连接。解决方案是在AndroidManifest.xml中添加持久化服务:
<service android:name="com.gizwits.opensource.appkit.GizDeviceService" android:enabled="true" android:exported="false" />6. 系统优化与问题排查
项目基本功能实现后,还需要考虑几个实用细节:
功耗优化:
- 修改ESP8266的WiFi模式为WIFI_POWER_MODEM(省电模式)
- 设置STM32进入STOP模式,通过RTC定时唤醒
- 数据上报间隔动态调整(如:温湿度变化小时降低频率)
数据安全:
- 在product.h中开启加密传输
#define P0_ENCRYPTION_ENABLE 1 #define P0_ENCRYPTION_KEY "自定义16位密钥"常见故障处理:
数据上报但APP不显示:
- 检查数据点定义是否一致
- 用串口调试助手查看原始协议数据
ESP8266频繁重启:
- 测量供电电压(工作时不得低于3.0V)
- 检查天线连接(特别是PCB天线版本)
配网成功后无法通信:
- 尝试ping设备IP确认网络连通性
- 重启路由器(有些家用路由器会限制新设备)
这个项目最让我意外的是STM32F103的资源占用情况:在添加了温湿度采集、LED状态指示、按键处理等功能后,Flash占用仅45KB(约70%),RAM剩余3KB左右,证明这个十年前的芯片依然能胜任多数物联网终端应用。