引言
物联网(IoT)技术的快速发展,让各类终端设备的数据采集与云端交互成为常态。STM32F103 作为意法半导体推出的经典 ARM Cortex-M3 内核微控制器,凭借高性价比、稳定的性能和丰富的外设,成为物联网终端开发的首选芯片之一。机智云作为一站式物联网开发平台,提供了设备接入、数据可视化、远程控制等全流程解决方案,极大降低了物联网项目的开发门槛。本文将详细讲解如何基于 STM32F103 实现温湿度数据采集,并通过串口 / ESP8266 模块将数据上传至机智云平台,从硬件选型、电路设计、软件编程到平台配置,全方位拆解实现过程,帮助开发者快速掌握物联网终端与云端的对接方法。
一、系统整体架构设计
本系统的核心目标是实现 "终端采集 - 数据传输 - 云端接收 - 可视化展示" 的全流程,整体架构分为三层:感知层、传输层和应用层。
- 感知层:以 STM32F103C8T6 最小系统板为核心控制器,搭配 DHT11 温湿度传感器完成环境温湿度数据的采集,DHT11 是一款低成本、单总线通信的数字传感器,测量范围为温度 0~50℃(精度 ±2℃)、湿度 20%~90% RH(精度 ±5% RH),满足常规环境监测需求。
- 传输层:采用 ESP8266-01S WiFi 模块作为无线通信载体,STM32F103 通过串口与 ESP8266 通信,将采集到的温湿度数据按照机智云协议封装后,由 ESP8266 发送至机智云服务器;也可选择串口转以太网模块,适用于有线网络场景,本文以 WiFi 传输为例。
- 应用层:机智云平台接收设备上传的数据,提供数据可视化面板、历史数据查询、设备在线状态监测等功能,同时支持手机 App / 小程序远程查看数据。
系统工作流程:STM32F103 定时读取 DHT11 的温湿度数据→对数据进行格式处理→按照机智云串口透传协议封装数据→通过串口发送给 ESP8266→ESP8266 连接 WiFi 并将数据上传至机智云→用户通过机智云平台查看实时温湿度数据。
二、硬件选型与电路设计
2.1 核心硬件清单
| 器件名称 | 型号 | 数量 | 用途 |
|---|---|---|---|
| 微控制器 | STM32F103C8T6 | 1 | 核心控制、数据采集与处理 |
| 温湿度传感器 | DHT11 | 1 | 采集环境温湿度 |
| WiFi 通信模块 | ESP8266-01S | 1 | 无线数据传输 |
| STM32 最小系统板 | 定制 | 1 | 提供电源、下载、串口接口 |
| 电源模块 | 5V/3.3V | 1 | 为各模块供电 |
| 杜邦线、面包板 | - | 若干 | 电路连接 |
| USB 转串口模块 | CH340 | 1 | STM32 程序下载与调试 |
2.2 关键电路设计
(1)STM32 与 DHT11 的连接
DHT11 采用单总线通信,只需一根数据线即可完成数据传输,电路设计要点:
- DHT11 的 VCC 引脚接 3.3V(或 5V,兼容两种电压),GND 接 GND;
- DHT11 的 DATA 引脚接 STM32F103 的 PA0 引脚,同时串联一个 4.7KΩ 上拉电阻(保证总线空闲时为高电平);
- 注意:DHT11 的数据传输对时序要求严格,布线时尽量缩短 DATA 线长度,避免干扰。
(2)STM32 与 ESP8266 的连接
ESP8266-01S 采用串口通信,需注意电平匹配(ESP8266 为 3.3V 电平,STM32F103 的串口引脚可兼容 3.3V):
- ESP8266 的 VCC 接 3.3V(严禁接 5V,否则烧毁模块),GND 接 GND;
- ESP8266 的 TXD 接 STM32 的 RXD(PB11),RXD 接 STM32 的 TXD(PB10);
- 为保证 ESP8266 稳定工作,建议在 3.3V 电源端并联 100μF 和 0.1μF 电容,滤除电源噪声;
- 可选:将 ESP8266 的 RST 引脚接 STM32 的 GPIO 口,便于 STM32 复位 ESP8266。
(3)电源电路设计
系统需提供稳定的 3.3V 和 5V 电源:
- 采用 USB 供电(5V),通过 AMS1117-3.3V 稳压芯片将 5V 转为 3.3V,为 STM32、DHT11、ESP8266 供电;
- AMS1117 输出端并联电容,提升电源稳定性;
- 所有模块的 GND 需共地,避免电位差导致通信异常。
三、机智云平台配置
3.1 注册与设备创建
- 登录机智云官网(https://www.gizwits.com/),完成开发者账号注册并实名认证;
- 进入 "开发者中心",点击 "创建新产品",填写产品名称(如 "温湿度监测仪")、选择产品品类("智能家居 - 环境监测")、通信方式("WiFi")、数据传输方式("透传");
- 产品创建完成后,进入 "数据点定义" 页面,添加自定义数据点:
- 温度:数据类型为 "浮点型",读写类型为 "只读",标识符 "temp",单位 "℃";
- 湿度:数据类型为 "浮点型",读写类型为 "只读",标识符 "humi",单位 "% RH";
- 保存数据点后,生成产品的 "Product Key" 和 "Product Secret",后续设备接入需用到该信息。
3.2 设备激活与密钥获取
- 进入 "设备管理" 页面,点击 "添加测试设备",生成设备的 "Device Secret" 和 "Device ID";
- 记录产品的 Product Key、Product Secret,以及测试设备的 Device ID、Device Secret,后续 STM32 程序中需配置这些参数;
- 下载机智云提供的 "串口调试助手" 和 "手机 App 调试版",用于后续调试。
3.3 协议解析
机智云串口透传协议采用固定格式封装数据,核心是将温湿度数据按照 "数据点标识符 + 数据值" 的格式封装,并添加帧头、帧尾、校验位。对于透传模式,STM32 需将采集到的温湿度数据封装为 JSON 格式(或机智云自定义二进制格式),本文采用 JSON 格式,示例:
json
{"temp":25.5,"humi":60.2}
ESP8266 连接机智云服务器后,将该 JSON 数据发送至指定端口即可。
四、STM32F103 软件编程
4.1 开发环境搭建
采用 Keil MDK-ARM V5 开发环境,配置步骤:
- 安装 STM32F103C8T6 的器件库(STM32F1xx_DFP);
- 创建新工程,选择 "STM32F103C8T6" 芯片,配置工程参数(如堆栈大小、编译器版本);
- 添加标准外设库(STM32F10x_StdPeriph_Lib),或采用 HAL 库开发,本文以标准外设库为例。
4.2 核心功能模块编程
(1)DHT11 驱动程序
DHT11 的通信时序是核心,需严格按照手册实现:
c
运行
// DHT11初始化
void DHT11_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 初始为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DHT11_DQ_HIGH; // 总线拉高
}
// 读取DHT11一个字节数据
u8 DHT11_Read_Byte(void) {
u8 i, byte = 0;
for(i=0; i<8; i++) {
while(DHT11_DQ_IN == 0); // 等待低电平结束
Delay_us(30); // 延时30us,判断高电平时长
byte <<= 1;
if(DHT11_DQ_IN == 1) byte |= 0x01;
while(DHT11_DQ_IN == 1); // 等待高电平结束
}
return byte;
}
// 读取温湿度数据
u8 DHT11_Read_Data(u8 *temp, u8 *humi) {
u8 buf[5];
u8 i;
DHT11_DQ_LOW;
Delay_ms(18); // 拉低总线18ms
DHT11_DQ_HIGH;
Delay_us(30); // 释放总线30us
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 改为输入模式
if(DHT11_DQ_IN == 0) {
while(DHT11_DQ_IN == 0); // 等待响应信号
while(DHT11_DQ_IN == 1); // 等待响应结束
for(i=0; i<5; i++) buf[i] = DHT11_Read_Byte(); // 读取40位数据
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 改为输出模式
// 校验数据
if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4]) {
*humi = buf[0];
*temp = buf[2];
return 0;
}
}
return 1;
}
注意:延时函数需精准,建议采用定时器实现 us 级延时,避免软件延时误差导致数据读取失败。
(2)串口通信配置
配置 STM32 的 USART3(PB10/TX、PB11/RX),用于与 ESP8266 通信,波特率 115200(ESP8266 默认波特率):
c
运行
void USART3_Init(u32 bound) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// TXD PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// RXD PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 串口配置
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
// 中断配置(可选,用于接收ESP8266的响应)
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启接收中断
USART_Cmd(USART3, ENABLE); // 使能串口
}
// 串口发送字符串
void USART3_Send_String(u8 *str) {
while(*str) {
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3, *str++);
}
}
(3)ESP8266 配置与数据上传
ESP8266 需先配置 WiFi 连接和机智云服务器地址,STM32 通过串口发送 AT 指令配置 ESP8266:
c
运行
// 配置ESP8266连接WiFi并接入机智云
u8 ESP8266_Config(void) {
u8 retry = 0;
USART3_Send_String("AT+CWMODE=1\r\n"); // 设置为STA模式
Delay_ms(500);
USART3_Send_String("AT+CWJAP=\"WiFi名称\",\"WiFi密码\"\r\n"); // 连接WiFi
Delay_ms(2000);
// 连接机智云服务器(TCP)
USART3_Send_String("AT+CIPSTART=\"TCP\",\"mqtt.gizwits.com\",8883\r\n");
Delay_ms(1000);
USART3_Send_String("AT+CIPMODE=1\r\n"); // 透传模式
Delay_ms(500);
USART3_Send_String("AT+CIPSEND\r\n"); // 开始透传
Delay_ms(500);
return 0;
}
// 封装温湿度数据并上传
void Gizwits_Send_Data(u8 temp, u8 humi) {
u8 data_buf[64];
// 封装JSON格式数据
sprintf((char*)data_buf, "{\"temp\":%d.0,\"humi\":%d.0}\r\n", temp, humi);
USART3_Send_String(data_buf); // 发送至ESP8266
}
注意:需根据机智云实际的 MQTT 服务器地址和端口调整 AT 指令,透传模式下发送的数据会直接转发至服务器。
(4)主函数设计
主函数实现初始化、数据采集、定时上传的逻辑:
c
运行
int main(void) {
u8 temp = 0, humi = 0;
u8 err_cnt = 0;
SysTick_Init(); // 系统滴答定时器初始化
DHT11_Init(); // DHT11初始化
USART3_Init(115200); // 串口3初始化
Delay_ms(1000);
ESP8266_Config(); // 配置ESP8266
while(1) {
if(DHT11_Read_Data(&temp, &humi) == 0) { // 读取温湿度
Gizwits_Send_Data(temp, humi); // 上传数据
err_cnt = 0;
} else {
err_cnt++;
if(err_cnt > 5) {
// 读取失败,复位ESP8266
ESP8266_Config();
err_cnt = 0;
}
}
Delay_ms(5000); // 每5秒上传一次
}
}
4.3 程序下载与调试
- 通过 J-Link 或 ST-Link 将程序下载至 STM32F103C8T6;
- 打开串口调试助手,连接 STM32 的调试串口,查看 ESP8266 的 AT 指令响应,确认 WiFi 连接和服务器接入是否成功;
- 若数据上传失败,排查:WiFi 密码是否正确、ESP8266 电平是否匹配、串口波特率是否一致、机智云数据点格式是否匹配。
五、系统测试与优化
5.1 功能测试
- 硬件上电后,观察 ESP8266 的指示灯(常亮表示已连接 WiFi);
- 登录机智云开发者中心,进入 "设备调试" 页面,查看实时数据是否与实际环境温湿度一致;
- 使用手机 App 连接设备,验证远程查看功能是否正常;
- 长时间运行测试,记录数据上传的稳定性和准确率。
5.2 常见问题与优化方案
- DHT11 数据读取不稳定:优化延时函数,增加数据校验次数,在 DATA 引脚增加抗干扰电容;
- ESP8266 频繁掉线:检查电源稳定性,增加 ESP8266 的复位机制,在程序中定期检测连接状态,掉线后自动重连;
- 数据上传延迟:减少数据封装的冗余内容,调整上传周期(如改为 10 秒一次),避免频繁发送数据导致网络拥堵;
- 温湿度精度不足:可更换 DHT22 传感器(温度精度 ±0.5℃,湿度精度 ±2% RH),并在程序中增加数据滤波算法(如滑动平均滤波)。
5.3 性能优化
- 采用低功耗模式:STM32 在数据采集间隔期间进入睡眠模式,降低功耗,适用于电池供电场景;
- 数据压缩:将浮点型数据转为整型传输,减少数据量,提升传输效率;
- 异常处理:增加温湿度数据范围校验(如温度超出 0~50℃时标记为异常),避免无效数据上传。
六、扩展功能与应用场景
6.1 功能扩展
- 增加报警功能:当温湿度超出阈值时,STM32 控制蜂鸣器报警,并向机智云上传报警信息;
- 远程控制:在机智云添加 "控制" 数据点,实现远程设置采集周期、报警阈值等;
- 数据存储:在 STM32 外接 SD 卡模块,本地存储历史温湿度数据,避免云端数据丢失;
- 多传感器扩展:增加光照、PM2.5 等传感器,实现多维度环境监测。
6.2 应用场景
- 智能家居:实时监测室内温湿度,联动空调、加湿器等设备;
- 农业大棚:远程监测大棚内温湿度,指导灌溉、通风等操作;
- 仓储环境:监测仓库温湿度,防止货物因温湿度异常损坏;
- 工业现场:监测生产车间温湿度,保障设备正常运行。
结论
本文详细阐述了基于 STM32F103 的温湿度数据采集与机智云上传方案,从硬件设计、平台配置到软件编程,形成了一套完整的物联网终端开发流程。通过 DHT11 完成温湿度采集,ESP8266 实现无线传输,机智云提供云端可视化,整个系统具备低成本、易开发、高稳定性的特点。开发者可基于该方案进行二次开发,扩展更多功能,适配不同的应用场景。
在实际开发过程中,需重点关注硬件电路的抗干扰设计、串口通信的时序匹配、机智云协议的正确封装,以及系统的稳定性测试。随着物联网技术的普及,STM32 与机智云的结合将在智能家居、工业物联网、智慧农业等领域发挥更大的作用,帮助开发者快速实现从终端到云端的全链路物联网解决方案。