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 个月
- 这里不涉及 MQTT 的软件实现,MQTT 功能是通过固件烧录的
- 如果只是单纯实现温湿度监控及点灯的话,FreeRTOS 其实不是必须的
阿里云物联网平台
添加产品物模型
首先你得拥有一个阿里云账号,然后开通物联网平台:
进入管理控制台:
创建一个实例(前提需实名认证):
公共实例开通免费,但据说可能联网不佳。标准实例可以免费开通试用 1 个月。
进入实例详情:
创建一个产品:
创建设备:
下面添加一个物模型:
使用 IoT Studio 绘制界面
回到物联网平台,查看增值服务。如果没有 IoT Studio,可以在选购增值服务中购买。IoT Studio 可以试用 1 个月。
进入 IoT Studio,选择你的实例,新建 Web 应用:
绘制一个像样的页面:
仪表盘数据源配置:
折线图数据源配置:
按钮交互配置:
这时点击预览的话仪表盘会显示没有数据,可继续下一章节阅读。
MQTT.fx 模拟客户端发布与订阅消息
安装 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 | # 设置热点模式 |
测试发送时间上行成功后,可以继续测试 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 |
|