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 核心硬件清单

器件名称 型号 数量 用途
微控制器 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 注册与设备创建

  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 与机智云的结合将在智能家居、工业物联网、智慧农业等领域发挥更大的作用,帮助开发者快速实现从终端到云端的全链路物联网解决方案。

相关推荐
码上上岸6 小时前
基于STM32的农业大棚温湿度自动调控系统
stm32·单片机·嵌入式硬件
痴长几岁6 小时前
开发日志:一个属性前缀,为stm32程序节省 500KB Flash 空间
stm32·单片机·嵌入式硬件
是大强6 小时前
jtag和sw的区别
嵌入式硬件
d111111111d7 小时前
嵌入式面试问题:STM32中指针和数组的本质区别是什么,常用数组存储什么数据?
java·笔记·stm32·单片机·嵌入式硬件·学习
Jerry丶Li7 小时前
三十九、STM32的SPI(软件读写W25Q64)
stm32·单片机·嵌入式硬件
.普通人7 小时前
stm32之DS18B20温度传感器+OLED显示+RTOS多任务执行(cubemx配置,使用hal库)
stm32·单片机·嵌入式硬件
BT-BOX18 小时前
普中开发板基于51单片机贪吃蛇游戏设计
单片机·游戏·51单片机
驴友花雕18 小时前
【花雕动手做】CanMV K230 AI视觉识别模块之使用CanMV IDE调试运行人脸代码
ide·人工智能·单片机·嵌入式硬件·canmv k230 ai视觉·canmv ide 人脸代码
点灯小铭21 小时前
基于单片机的酒驾报警刹车系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业