温湿度demo项目实现
169.4温湿度demo项目实现
/* ==================== Inc/main.h:生成工程中的 KEY2 引脚定义 ==================== */
#define KEY2_Pin GPIO_PIN_8 /* KEY2 使用 GPIO 的 8 号引脚。 */
#define KEY2_GPIO_Port GPIOA /* KEY2 所在端口为 GPIOA,合起来就是 PA8。 */
/* ==================== Src/main.c:KEY2 长按回调 ==================== */
void key2LongPress(void) /* KEY2 长按事件满足后,按键框架会调用这个函数。 */
{ /* KEY2 长按处理开始。 */
//AirLink mode /* 课程源码原注释:下面进入 AirLink 配网模式。 */
GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n"); /* 从调试串口输出进入 AirLink 模式的提示。 */
#if !MODULE_TYPE /* 仅在当前模组类型配置允许时编译下面的模式切换。 */
gizwitsSetMode(WIFI_AIRLINK_MODE); /* 通知机智云 GAgent 进入 AirLink 一键配网模式。 */
#endif /* 结束 MODULE_TYPE 条件编译。 */
} /* KEY2 长按处理结束。 */
/* ==================== Gizwits/gizwits_product.c:本节最终修正的业务代码 ==================== */
void userHandle(void) /* 机智云主循环反复调用此函数采集用户数据。 */
{ /* 本次温湿度采集和赋值开始。 */
DHT_Read(); /* 读取 DHT11,并把 5 个字节写入全局数组 Data。 */
currentDataPoint.valuetemp = Data[2]; /* 第 3 字节是温度整数部分,写入 temp 数据点。 */
currentDataPoint.valuehumi = Data[0]; /* 第 1 字节是湿度整数部分,写入 humi 数据点。 */
} /* 本次用户数据处理结束。 */
源码范围说明:顶部只抄录本节实际查看、调用或修正的业务代码,并只增加逐行注释。
key2LongPress()和 KEY2 引脚定义来自机智云生成工程;userHandle()是本节经过 App 实测后得到的最终课堂版本。视频中先把赋值从错误的userInit()移到userHandle(),又通过“哈气”测试发现温湿度下标互换,最后才形成Data[2] → temp、Data[0] → humi。中间错误版本用于排错,不冒充最终源码;机智云 SDK、按键状态机和 DHT11 底层驱动也不在此强行补全。
一、机智云平台
1.1 机智云平台介绍
本节开头补充了两个学习入口:机智云独立 MCU 方案资料和手机调试 App 下载页。课程使用的是“独立 MCU 方案”,系统分工如下:
DHT11 ──> STM32F103 ──USART2/机智云协议──> ESP8266 GAgent
│
2.4 GHz Wi-Fi
│
路由器、机智云与调试 App
- STM32 负责读取 DHT11、维护产品数据点并运行机智云 MCU SDK。
- ESP8266 中的 GAgent 负责配网、连接路由器以及与机智云通信。
- 手机 App 负责给模组传递路由器信息、绑定设备并查看数据。
官方资料里同时存在独立 MCU 与 SoC 两类方案,阅读时不能混淆:独立 MCU 方案由 STM32 承担主要业务,ESP8266 作为联网模组;SoC 方案则把业务也运行在联网芯片中。两类方案的工程结构、烧录对象和调试方法不同。
1.2 机智云产品调试APP
原笔记的“智驾 APP”是识别错误。机智云下载中心把相关 App 分成不同类别:
| App | 面向对象 | 本实验是否使用 |
|---|---|---|
| 机智云产品调试 App | 开发阶段,用于设备配网和数据点调试 | 是 |
| 机智云公版智家 App | 面向最终用户的公版智能家居应用 | 否 |
课程通过页面链接或二维码下载“机智云产品调试 App”。不同版本的登录、跳过登录和授权界面可能变化;视频中点击确认后直接进入,不代表所有新版本都一定可以免账号使用,应以当前 App 的实际提示为准。
二、温湿度检测项目实现
2.1 烧写代码
课程在 Keil 中依次打开 Options for Target → Debug,把调试器改成 ST-Link Debugger,再进入 Settings 检查是否识别到 ST-Link 设备。识别到调试器序列号,只能证明 ST-Link 通信基本正常;还要继续确认目标芯片、Flash 下载算法和连接方式。
本地课程工程最后一次构建结果为 0 Error、2 Warning,并非“零警告”。两条警告都是生成代码中的未使用符号:dataPointPtr 和 gizDataPoint2Event。它们不阻止本次生成固件,但学习时不应把“可以下载”误写成“代码完全没有问题”。
还要特别注意,配套工程的目标是 STM32F103C8,下载算法也是 128 KiB 的 C8 配置,而课程实物板为 STM32F103ZE。视频只改成 ST-Link 并不能消除型号差异。复现实验的规范做法是按实物 MCU 建立 ZE 工程,再迁移机智云协议目录和业务代码,同时核对启动文件、容量宏、链接空间、时钟与全部引脚;不能把 C8 工程二进制当成通用 ZE 固件。
代码下载后还要让 ESP8266 进入配网状态。原笔记多次写成“AR link”,正确名称是 AirLink。生成代码中,KEY2 长按回调会调用:
key2LongPress()
└─ gizwitsSetMode(WIFI_AIRLINK_MODE)
└─ 请求 GAgent 进入 AirLink 配网模式
按键框架把 KEY2 配置为低电平按下,长按阈值约为 1 秒;课程实际按住约 1~2 秒再松开。进入模式后,手机 App 才能把当前 2.4 GHz Wi-Fi 的 SSID 和密码传给 ESP8266。
2.2 杜邦线连接按键
这里是本节最容易因转写而接错的部分。课程生成的 C8 工程把逻辑 KEY2 定义成 PA8,但 ZE 开发板原理图上的实体按键连接如下:
| 板载按键 | MCU 引脚 | 按下时的电气动作 |
|---|---|---|
| KEY0 | PE4 | 引脚经按键接到 GND |
| KEY1 | PE3 | 引脚经按键接到 GND |
| KEY2 | PE2 | 引脚经按键接到 GND |
因此,视频中为了不改代码,使用杜邦线把 板载 KEY2 的 PE2 节点与生成工程监听的 PA8连接起来。按下实体 KEY2 后,PE2 被按键接到 GND,PA8 也随之读到低电平,从而触发代码中的 KEY2。原笔记的“A12”“一二引脚”“将按键 1 和按键 2 相连”都不准确。
小白可以把它理解成:
未按键:PA8 ──杜邦线── PE2 按键断开
按下键:PA8 ──杜邦线── PE2 ──按键── GND
↑
PA8 被拉成低电平
不过,这种接法只是课堂临时适配,必须注意三点:
- 不能看到“两个脚”就随意短接。只有确认两端没有被配置成相反电平的推挽输出时,才不会发生 GPIO 争用甚至过流。
- 配套 C8 工程把 PA8 配成输入且
No Pull;按键松开时线路可能悬空,容易受到干扰。更稳妥的临时方案是让 PA8 使用上拉输入并保持“低电平按下”的逻辑。 - 真正适配 ZE 板时,应在正确的 ZE 工程中把逻辑 KEY2 配到 PE2,而不是长期依靠 PE2 与 PA8 的跨接线。
原理图还显示板载 ESP8266 接口使用 USART2,并带有 3.3 V 与 GND。排查联网时除了信号线,还要确认 3.3 V 供电稳定、所有模块共地以及 TX/RX 交叉连接正确。
2.3 手机APP配网
课程演示的 AirLink 配网流程为:
- 给 STM32 和 ESP8266 正确供电,长按接到 PA8 逻辑的实体 KEY2 约 1~2 秒后松开,使模组进入 AirLink。
- 打开机智云产品调试 App,点击右上角加号,进入“一键配网”。
- 输入手机当前连接的 Wi-Fi 名称和密码,并确认使用 2.4 GHz 网络。ESP8266 不支持 5 GHz Wi-Fi。
- 在设备类型中选择乐鑫/ESP8266,确认后等待配网完成。
- App 出现“温湿度检测”设备后进入设备页,继续核对在线状态和数据点是否变化。
AirLink 的本质不是让手机永久控制 STM32,而是把路由器的 SSID 和密码交给 GAgent。GAgent 配网成功后会缓存上一次成功连接的网络信息,所以只重新烧写 STM32 固件通常不必再次输入 Wi-Fi 密码。这句话有明确边界:若执行了 GAgent 重置、重新烧写/更换模组、路由器名称或密码变化,或者模组配置已丢失,就需要重新配网。
App 中保留设备卡片不等于设备此刻一定在线,因为绑定记录可以继续存在。更可靠的成功依据是:设备显示在线,并且温湿度能随环境变化持续更新。
2.4 用户数据处理函数
首次进入设备页时,温湿度均显示为 0。课程返回 Keil 后发现上一节把数据点赋值放错到了 userInit()。两个函数的执行时机不同:
| 函数 | 典型执行时机 | 适合做什么 |
|---|---|---|
userInit() | 上电初始化时调用一次 | 初始化数据结构、设置初值 |
userHandle() | 主循环中反复调用 | 周期采集传感器并更新数据点 |
因此,教师把 DHT11 读取和数据点赋值剪切到 userHandle()。仅把代码移到正确函数还不够,数组下标也必须和 DHT11 数据帧一致:
| 数组元素 | 含义 | 机智云数据点 |
|---|---|---|
Data[0] | 湿度整数部分 | valuehumi |
Data[1] | 湿度小数部分 | 本实验未上传 |
Data[2] | 温度整数部分 | valuetemp |
Data[3] | 温度小数部分 | 本实验未上传 |
Data[4] | 校验和 | 用于帧校验 |
视频先把某个错误的下标 1 改成 2,随后又通过实测发现温度和湿度字段仍然对调,最终才交换成顶部所示的 Data[2] → temp、Data[0] → humi。不能只看中间一次编译画面就把未完成的版本当作最终答案。
课程源码仍有两个已知限制,但按要求不在顶部擅自优化:DHT_Read() 的返回值没有判断,并且它被快速主循环连续调用。实际产品应按 DHT11 允许的采样周期读取,只在本次应答和校验成功时更新数据点;这些属于后续改进,不是本节原样源码。
2.5 复位查看数据
重新编译、下载并按下复位键后,STM32 会重新启动,currentDataPoint 也会先被初始化。刚启动时 App 暂无新数据,不等于绑定丢失,更不等于必须立刻重新配网;应该先等待 MCU、GAgent、路由器和云端恢复通信并完成一次有效数据上报。
视频中 App 显示“远程在线”。这个状态通常表示手机通过机智云远程链路访问设备,而不是“数据没有配对”的报错。状态与数据应分开判断:
- 在线但数据为 0:优先检查 DHT11 读取、
userHandle()赋值和数据点映射。 - 在线但没有新数据:检查 MCU 与 ESP8266 的 USART2 通信、供电、固件/产品信息和上报流程。
- 设备离线:再检查 GAgent 是否启动、Wi-Fi 凭据、路由器、云连接与供电。
按下 STM32 复位键不会自动清除 App 绑定,也不会清除 ESP8266 已缓存的 Wi-Fi 凭据。刷新或重启 App 只能排除界面缓存问题,不能代替硬件与协议排查。
2.6 断电处理
视频随后完全断开 ST-Link、USB/充电器等所有供电,再重新上电。这种完整电源循环可以同时复位 STM32 与 ESP8266,适合清除偶发的临时状态;但它不是“每次复位后都必须重新配网”的标准步骤,也不能掩盖供电、串口或接线故障。
本次真正恢复数据的关键是重新固定 ESP8266 的杜邦线。原笔记的“18650 线”是语音识别错误。排查接触不良时建议按下面顺序进行:
- 先确认 STM32、ESP8266、DHT11 共地,ESP8266 的 3.3 V 供电不会因发射电流而明显跌落。
- 检查 USART2:STM32 TX 接模组 RX,STM32 RX 接模组 TX,不能 TX 对 TX。
- 轻触或重新插紧杜邦线,观察日志和 App 在线状态是否随之变化;若变化明显,说明连接可靠性不足。
- 再检查 PA5 上的 DHT11 数据线、上拉条件和读取结果。
- 最后再区分本地硬件、路由器、云端和 App 界面问题,不要一次同时改很多项。
接线恢复后,App 显示约 20、21 的温湿度值。教师向 DHT11 哈气后,界面中名为“温度”的字段快速升到约 44。呼气通常会显著增加传感器附近的湿度;这个现象提示不是室温瞬间升到 44 ℃,而是湿度值被错误写进了温度字段。这个测试验证了“数据会变化”,也暴露了字段映射错误。
2.7 重新烧写代码
发现温湿度对调后,教师把数组下标 0 和 2 对换,保存、编译并重新烧写,最终业务代码为:
Data[2](温度整数) → currentDataPoint.valuetemp
Data[0](湿度整数) → currentDataPoint.valuehumi
重新下载 STM32 固件通常不会清除 ESP8266 中已保存的路由器配置,因此模组恢复后可自动重连。验证时不要只看 Keil 下载成功,还应做闭环检查:
- Keil 构建和下载完成,目标型号及下载算法正确。
- ESP8266 能重新连接路由器,App 显示设备在线。
- 静置时温湿度数值处于合理范围且不是固定为 0。
- 轻微改变传感器附近湿度后,主要变化的是“湿度”字段。
- 多观察几次,排除杜邦线接触不良造成的偶然成功。
2.8 实验总结
本节完成了一条最小的远程温湿度链路:
长按 KEY2
↓
ESP8266 进入 AirLink 并取得 2.4 GHz Wi-Fi 信息
↓
STM32 在 userHandle() 中读取 DHT11
↓
Data[2]/Data[0] 分别写入温度/湿度数据点
↓
机智云 SDK 经 USART2 把数据交给 GAgent
↓
调试 App 查看远程数据并通过环境变化验证映射
这不是“烧写成功就结束”的演示。本节实际体现了嵌入式联网调试的完整思路:先确认下载链路,再确认配网入口与硬件按键,随后按“传感器 → MCU 数据点 → 串口模组 → 路由器/云 → App”逐层定位。特别是哈气测试,它不是随意演示,而是通过可控输入辨认字段对应关系。
课程后续会以更完整的物联网项目串联此前知识。本节留下的工程化问题也应继续关注:按真实 ZE 芯片重建工程、取消 PA8 临时跨接、为 DHT11 增加合理采样节拍与成功判断、改善模组供电和连接可靠性。
参考资料
- 机智云:产品调试 App 下载中心:核对“产品调试 App”与“公版智家 App”的用途区别。
- 机智云:GAgent 功能说明:核对 AirLink/SoftAP 配网、网络信息缓存、重置与重连行为。
- Espressif:ESP8266EX 数据手册:核对 ESP8266 的 2.4 GHz 802.11 b/g/n 无线能力。
- 本地课程配套 STM32 开发板原理图:核对板载 KEY0/KEY1/KEY2 分别连接 PE4/PE3/PE2、按下接地,以及 ESP8266 接口。
- 本地完成工程 main.h、main.c 与 gizwits_product.c:核对 PA8 的 KEY2 定义、AirLink 长按回调和最终温湿度赋值。
- 本地完成工程 gpio.c、hal_key.h 与 构建日志:核对输入模式、按键时序阈值和 0 Error/2 Warning 的构建结果。