STM32+ESP8266+MQTT 实现阿里云温湿度监控及 LED 点灯(FreeRTOS+标准库 or HAL)
标题直接 Buff 点满…
阅读指引
如果你是 0 基础选手,建议先阅读以下内容掌握基本的 FreeRTOS 工程知识:
- C 语言基本语法
- STM32 工程创建,详看
- FreeRTOS 的移植,详看
本文主要分为三个部分,每个部分需要准备的工具如下:
- 阿里云物联网平台注册:需要阿里云账号。
- 模拟 MQTT 客户端发送与订阅消息:软件 MQTT.fx,阿里云提供的 MQTT_Password 工具。
- ESP8266 固件烧录:串口助手软件,需要材料 ESP8266、USB-TTL、杜邦线若干。
- 软件实现:Keil 软件、STM32CubeMX(使用 HAL)、STM32、DHT11、杜邦线若干、OLED(可选)、LED 灯、ST-Link
- 阿里云相关产品新用户只能免费试用 1 个月。比如物联网企业版实例新用户可以试用 1 个月,但也有公共实例永久免费使用。增值服务 IoT Studio 用于绘制可视化界面,可以试用 1 个月,但其实这也不是必须的,就是提供了一个可视化界面而已。
- MQTT 功能是通过固件烧录进 ESP8266 中的,不是 MQTT 协议在 FreeRTOS 上的移植。
- 如果只是单纯实现温湿度监控及点灯的话,FreeRTOS 其实不是必须的。
接线图与实物图展示
Visio 随便画的,感觉掌握不到诀窍,很难画。

下图有个多余连接的串口,读者可以忽略。

UML
如果 UML 图不规范请指出哈。我感觉 UML 图我永远画不对…
用例图:

用户通过阿里云物联网平台进行温湿度数据监测以及 LED 灯控制,此外,用户还可通过直接观察设备显示屏读取温湿度监测数据。对于通过阿里云物联网平台监测温湿度数据的用例,除了在远程平台实现可视化界面外,STM32 需实现将温湿度数据发送至远程平台的能力。无论是温湿度数据的本地展示或远程发送,都依赖于 STM32 中获取温湿度数据用例。该用例需要 STM32 与温湿度监测设备进行数据交互。远程平台中控制 LED 灯用例的实现不仅依赖于物联网平台提供的指令发送接口,也需要 STM32 实现信号的接收与 LED 灯设置的功能。
发送温湿度过程顺序图:

单片机从监测设备获取温湿度数据并发送至阿里云物联网平台过程的顺序图如上图所示。单片机初始化完毕后,利用 FreeRTOS 任务函数定时向 DHT11 发送复位信号。DHT11 接收复位信号后将 40 Bit 的检测数据通过单总线协议传输至 STM32 处理。随后,STM32 利用该数据完成以下任务:
- 更新 OLED 显示屏,实现设备实时显示温湿度信息的功能。
- 将温湿度数据生成 AT 命令,通过串口发送至 ESP8266 模块中。
ESP8266 模块接收到 AT 指令后,将通过 MQTT 协议向阿里云物联网平台发布消息。阿里云物联网平台将根据该消息的主题与参数,更新可视化界面的网络应用,从而实现用户远程监控设备的功能。
接收 LED 灯指令顺序图:

用户通过网络应用的可视化界面控制设备 LED 灯的顺序图如上图所示。用户通过可视化界面操作 LED 灯状态为“0(关闭)”或“1(开启)”。MQTT Broker 向设备发送消息,该消息由连接至 STM32 单片机的 WIFI 模块接收。WIFI 模块将接收到的数据存放在串口缓冲区中,并设置标志位提醒 STM32 单片机进行接收。STM32 利用 FreeRTOS 任务调度,获取 WIFI 模块返回的信息并解析 LED 灯控制指令。最后根据指令控制 LED 灯电路,改变灯的状态。
阿里云物联网平台
此部分可参考官方文档:如何快速将设备接入物联网平台并控制其开关_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)
添加产品物模型
首先你得拥有一个阿里云账号,然后开通物联网平台:

进入管理控制台:

创建一个实例(前提需实名认证):

标准实例可以免费开通试用 1 个月。
公共实例开通免费,但据说可能联网不佳,我试了一下感觉还行,没条件的可以直接使用公共实例。
进入实例详情:

创建一个产品:

创建设备:

下面添加一个物模型:



使用 IoT Studio 绘制界面
回到物联网平台,查看增值服务。如果没有 IoT Studio,可以在选购增值服务中购买。IoT Studio 可以试用 1 个月。

进入 IoT Studio,选择你的实例,新建 Web 应用:


绘制一个像样的页面:

仪表盘数据源配置:


折线图数据源配置:

按钮交互配置:

这时点击预览的话仪表盘会显示没有数据,可继续下一章节阅读。
MQTT.fx 模拟客户端发布与订阅消息
此部分可参考文档:使用MQTT协议模拟设备快速接入物联网平台_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)
安装 MQTT_Password 工具包:如何计算MQTT签名参数_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)
安装 MQTT.fx:MQTT.fx® Download (softblade.de)
回到阿里云物联网平台控制台>设备>查看,把三元素复制下来:

使用 MQTT_Password 计算签名:

除了此处的 Clientid 是需要填入的设备信息 Clientid,其他所有地方说的 Client ID 都是指 MQTT 连接的 Client ID 具体值就是计算结果的 mqttClientid
打开 MQTT.fx,配置:


Broker Address 为你的 ProductID+.iot-as-mqtt.cn-shanghai.aliyuncs.com。
链接。然后尝试发布消息和订阅消息:

连接后阿里云物联网平台将显示在线:

尝试在 /sys/k10qu3ushCq/mqtt_stm32/thing/event/property/post 发布一个 json 数据:
1 | {"params":{"temperature":42,"Humidity":22},"version":"1.0.0"} |

结果在 IoT Studio 网页应用就会显示数据:

在 /sys/k10qu3ushCq/mqtt_stm32/thing/service/property/set 中订阅,点击开关按钮将收到消息:

ESP8266 固件烧录及串口调试
首先,固件烧录部分详看:站内文章ESP8266 烧写 AT MQTT 固件。
ESP8266 连上串口后测试 AT 命令(记得加 \r\n):
1 | # 设置热点模式 |
指令说明参考:入门指南 - ESP32 - — ESP-AT 用户指南 latest 文档 (espressif.com)
测试发送时间上行成功后,可以继续测试 LED 开关命令。在 IoT Studio 点击按钮,串口助手将回显消息。
软件实现思路
整个 STM32 工程比较庞杂。本节介绍主要的具体思路,并展示重要代码过程。
主要思路:
- STM32 串口 1 用于向电脑发送数据,
printf重写为向串口 1 发送数据。详看:站内文章串口驱动程序之「发送数据」 - 串口 2 用于链接 ESP8266,需要实现不定长数据的收发。详看:站内文章串口驱动程序之「不定长字符串的接收」
- 使用 DHT11 检测环境温湿度。详看:站内文章DHT11 驱动程序
- OLED 模块作为温湿度数据的实时显示。详看:站内文章OLED 驱动程序
- 一个任务指示灯,单纯用来指示 FreeRTOS 任务有没有卡死
- 一个 LED 灯用来应答阿里云发来的数据
以下代码主要解析任务分配以及设备初始化的编写。标准库和 HAL 具体实现略有不同(LED 用的端口、不定长字符串接收的实现方式),请以具体配置为准。
标准库
main.c:
1 |
|
设备:
1 |
|
HAL 库
任务配置:

freertos.c:
1 | /* Includes ------------------------------------------------------------------*/ |
设备:
1 |
|
后记
工程实践被🍐🏮训斥了…😎😎😎。
本文 PlantUML 存档:
1 | @startuml |
1 | @startuml |
1 | @startuml |





