news 2026/4/15 8:52:04

STM32F103 实现温湿度数据采集并上传机智云的完整方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103 实现温湿度数据采集并上传机智云的完整方案

引言

物联网(IoT)技术的快速发展,让各类终端设备的数据采集与云端交互成为常态。STM32F103 作为意法半导体推出的经典 ARM Cortex-M3 内核微控制器,凭借高性价比、稳定的性能和丰富的外设,成为物联网终端开发的首选芯片之一。机智云作为一站式物联网开发平台,提供了设备接入、数据可视化、远程控制等全流程解决方案,极大降低了物联网项目的开发门槛。本文将详细讲解如何基于 STM32F103 实现温湿度数据采集,并通过串口 / ESP8266 模块将数据上传至机智云平台,从硬件选型、电路设计、软件编程到平台配置,全方位拆解实现过程,帮助开发者快速掌握物联网终端与云端的对接方法。

一、系统整体架构设计

本系统的核心目标是实现 “终端采集 - 数据传输 - 云端接收 - 可视化展示” 的全流程,整体架构分为三层:感知层、传输层和应用层。

  1. 感知层:以 STM32F103C8T6 最小系统板为核心控制器,搭配 DHT11 温湿度传感器完成环境温湿度数据的采集,DHT11 是一款低成本、单总线通信的数字传感器,测量范围为温度 0~50℃(精度 ±2℃)、湿度 20%~90% RH(精度 ±5% RH),满足常规环境监测需求。
  2. 传输层:采用 ESP8266-01S WiFi 模块作为无线通信载体,STM32F103 通过串口与 ESP8266 通信,将采集到的温湿度数据按照机智云协议封装后,由 ESP8266 发送至机智云服务器;也可选择串口转以太网模块,适用于有线网络场景,本文以 WiFi 传输为例。
  3. 应用层:机智云平台接收设备上传的数据,提供数据可视化面板、历史数据查询、设备在线状态监测等功能,同时支持手机 App / 小程序远程查看数据。

系统工作流程:STM32F103 定时读取 DHT11 的温湿度数据→对数据进行格式处理→按照机智云串口透传协议封装数据→通过串口发送给 ESP8266→ESP8266 连接 WiFi 并将数据上传至机智云→用户通过机智云平台查看实时温湿度数据。

二、硬件选型与电路设计

2.1 核心硬件清单

器件名称型号数量用途
微控制器STM32F103C8T61核心控制、数据采集与处理
温湿度传感器DHT111采集环境温湿度
WiFi 通信模块ESP8266-01S1无线数据传输
STM32 最小系统板定制1提供电源、下载、串口接口
电源模块5V/3.3V1为各模块供电
杜邦线、面包板-若干电路连接
USB 转串口模块CH3401STM32 程序下载与调试

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 注册与设备创建

  1. 登录机智云官网(https://www.gizwits.com/),完成开发者账号注册并实名认证;
  2. 进入 “开发者中心”,点击 “创建新产品”,填写产品名称(如 “温湿度监测仪”)、选择产品品类(“智能家居 - 环境监测”)、通信方式(“WiFi”)、数据传输方式(“透传”);
  3. 产品创建完成后,进入 “数据点定义” 页面,添加自定义数据点:
    • 温度:数据类型为 “浮点型”,读写类型为 “只读”,标识符 “temp”,单位 “℃”;
    • 湿度:数据类型为 “浮点型”,读写类型为 “只读”,标识符 “humi”,单位 “% RH”;
  4. 保存数据点后,生成产品的 “Product Key” 和 “Product Secret”,后续设备接入需用到该信息。

3.2 设备激活与密钥获取

  1. 进入 “设备管理” 页面,点击 “添加测试设备”,生成设备的 “Device Secret” 和 “Device ID”;
  2. 记录产品的 Product Key、Product Secret,以及测试设备的 Device ID、Device Secret,后续 STM32 程序中需配置这些参数;
  3. 下载机智云提供的 “串口调试助手” 和 “手机 App 调试版”,用于后续调试。

3.3 协议解析

机智云串口透传协议采用固定格式封装数据,核心是将温湿度数据按照 “数据点标识符 + 数据值” 的格式封装,并添加帧头、帧尾、校验位。对于透传模式,STM32 需将采集到的温湿度数据封装为 JSON 格式(或机智云自定义二进制格式),本文采用 JSON 格式,示例:

json

{"temp":25.5,"humi":60.2}

ESP8266 连接机智云服务器后,将该 JSON 数据发送至指定端口即可。

四、STM32F103 软件编程

4.1 开发环境搭建

采用 Keil MDK-ARM V5 开发环境,配置步骤:

  1. 安装 STM32F103C8T6 的器件库(STM32F1xx_DFP);
  2. 创建新工程,选择 “STM32F103C8T6” 芯片,配置工程参数(如堆栈大小、编译器版本);
  3. 添加标准外设库(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 程序下载与调试

  1. 通过 J-Link 或 ST-Link 将程序下载至 STM32F103C8T6;
  2. 打开串口调试助手,连接 STM32 的调试串口,查看 ESP8266 的 AT 指令响应,确认 WiFi 连接和服务器接入是否成功;
  3. 若数据上传失败,排查:WiFi 密码是否正确、ESP8266 电平是否匹配、串口波特率是否一致、机智云数据点格式是否匹配。

五、系统测试与优化

5.1 功能测试

  1. 硬件上电后,观察 ESP8266 的指示灯(常亮表示已连接 WiFi);
  2. 登录机智云开发者中心,进入 “设备调试” 页面,查看实时数据是否与实际环境温湿度一致;
  3. 使用手机 App 连接设备,验证远程查看功能是否正常;
  4. 长时间运行测试,记录数据上传的稳定性和准确率。

5.2 常见问题与优化方案

  1. DHT11 数据读取不稳定:优化延时函数,增加数据校验次数,在 DATA 引脚增加抗干扰电容;
  2. ESP8266 频繁掉线:检查电源稳定性,增加 ESP8266 的复位机制,在程序中定期检测连接状态,掉线后自动重连;
  3. 数据上传延迟:减少数据封装的冗余内容,调整上传周期(如改为 10 秒一次),避免频繁发送数据导致网络拥堵;
  4. 温湿度精度不足:可更换 DHT22 传感器(温度精度 ±0.5℃,湿度精度 ±2% RH),并在程序中增加数据滤波算法(如滑动平均滤波)。

5.3 性能优化

  1. 采用低功耗模式:STM32 在数据采集间隔期间进入睡眠模式,降低功耗,适用于电池供电场景;
  2. 数据压缩:将浮点型数据转为整型传输,减少数据量,提升传输效率;
  3. 异常处理:增加温湿度数据范围校验(如温度超出 0~50℃时标记为异常),避免无效数据上传。

六、扩展功能与应用场景

6.1 功能扩展

  1. 增加报警功能:当温湿度超出阈值时,STM32 控制蜂鸣器报警,并向机智云上传报警信息;
  2. 远程控制:在机智云添加 “控制” 数据点,实现远程设置采集周期、报警阈值等;
  3. 数据存储:在 STM32 外接 SD 卡模块,本地存储历史温湿度数据,避免云端数据丢失;
  4. 多传感器扩展:增加光照、PM2.5 等传感器,实现多维度环境监测。

6.2 应用场景

  1. 智能家居:实时监测室内温湿度,联动空调、加湿器等设备;
  2. 农业大棚:远程监测大棚内温湿度,指导灌溉、通风等操作;
  3. 仓储环境:监测仓库温湿度,防止货物因温湿度异常损坏;
  4. 工业现场:监测生产车间温湿度,保障设备正常运行。

结论

本文详细阐述了基于 STM32F103 的温湿度数据采集与机智云上传方案,从硬件设计、平台配置到软件编程,形成了一套完整的物联网终端开发流程。通过 DHT11 完成温湿度采集,ESP8266 实现无线传输,机智云提供云端可视化,整个系统具备低成本、易开发、高稳定性的特点。开发者可基于该方案进行二次开发,扩展更多功能,适配不同的应用场景。

在实际开发过程中,需重点关注硬件电路的抗干扰设计、串口通信的时序匹配、机智云协议的正确封装,以及系统的稳定性测试。随着物联网技术的普及,STM32 与机智云的结合将在智能家居、工业物联网、智慧农业等领域发挥更大的作用,帮助开发者快速实现从终端到云端的全链路物联网解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 8:59:43

泉盛UV-K5/K6对讲机LOSEHU固件:从新手到高手的终极指南

泉盛UV-K5/K6对讲机LOSEHU固件&#xff1a;从新手到高手的终极指南 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 想要让您的泉盛UV-K5/K6对讲机…

作者头像 李华
网站建设 2026/4/14 18:56:51

72、FreeBSD 问题报告与系统崩溃处理指南

FreeBSD 问题报告与系统崩溃处理指南 1. 问题报告的重要性与原则 在使用 FreeBSD 时,提交完整且有说服力的错误报告至关重要。开发者通常不喜欢处理混乱且难以应对的错误报告,他们甚至期望因处理这类问题而获得报酬。所以,我们的目标是提交一份详尽的错误报告,让开发者觉得…

作者头像 李华
网站建设 2026/4/12 18:17:08

跨平台歌词下载新体验:告别音乐库的无声尴尬

你是否曾经遇到过这样的场景&#xff1f;精心收藏的数千首音乐&#xff0c;在播放时却总是缺少同步歌词&#xff0c;让整个听歌体验大打折扣。面对海量音乐文件&#xff0c;手动查找歌词既耗时又费力&#xff0c;不同格式的兼容性问题更是让人头疼不已。 【免费下载链接】ZonyL…

作者头像 李华
网站建设 2026/4/13 9:27:04

10.视图过渡 (View Transitions)

视图过渡API为页面不同状态之间或不同页面之间创建流畅的过渡动画&#xff0c;通过声明式CSS动画实现精致的用户体验&#xff0c;无需复杂的JavaScript动画库。本章概述视图过渡API是现代Web开发中的一个革命性特性&#xff0c;它允许开发者轻松创建页面状态变化时的流畅动画效…

作者头像 李华
网站建设 2026/4/10 17:26:55

【API 设计之道】04 字段掩码模式:让前端决定后端返回什么

大家好&#xff0c;我是Tony Bai。欢迎来到我们的专栏 《API 设计之道&#xff1a;从设计模式到 Gin 工程化实现》的第四讲。在上一讲中&#xff0c;我们解决了那些无法被 CRUD 囊括的复杂业务逻辑。今天&#xff0c;我们将目光转向数据传输的效率问题。在日常开发中&#xff0…

作者头像 李华
网站建设 2026/4/8 13:07:16

Linux动态壁纸引擎完全指南:解决7大使用难题与优化方案

Linux动态壁纸引擎完全指南&#xff1a;解决7大使用难题与优化方案 【免费下载链接】linux-wallpaperengine Wallpaper Engine backgrounds for Linux! 项目地址: https://gitcode.com/gh_mirrors/li/linux-wallpaperengine Linux桌面美化爱好者们&#xff0c;是否曾经为…

作者头像 李华