【RT-Thread实战】从传感器到云端:基于MQTT的温湿度数据采集与上传

张开发
2026/4/17 9:30:49 15 分钟阅读

分享文章

【RT-Thread实战】从传感器到云端:基于MQTT的温湿度数据采集与上传
1. 项目背景与硬件准备最近在做一个智能家居的小项目需要实时监测房间的温湿度数据并上传到云端。经过一番调研最终选择了RT-Thread操作系统搭配星火一号开发板使用板载的AHT10温湿度传感器采集数据通过MQTT协议上传到阿里云物联网平台。这个方案最大的优势就是RT-Thread丰富的软件包生态让开发变得特别简单。星火一号开发板是一款性价比很高的国产开发板板载资源丰富特别适合物联网项目开发。它搭载了STM32F407主控芯片内置WiFi模块还集成了AHT10温湿度传感器。AHT10是一款高精度的数字温湿度传感器测量范围广精度高完全能满足日常环境监测的需求。在开始之前我们需要准备好以下硬件星火一号开发板一根Micro USB数据线用于供电和调试一台安装了RT-Thread开发环境的电脑2. RT-Thread环境搭建RT-Thread是一个国产的实时操作系统特别适合物联网设备开发。它最大的特点就是组件化设计通过软件包机制可以快速集成各种功能模块。我使用的是RT-Thread的master分支这个版本包含了最新的功能和修复。首先需要安装RT-Thread的开发环境。推荐使用env工具这是一个基于Python的开发环境管理工具。安装过程很简单pip install env安装完成后在项目目录下执行env --init这个命令会初始化RT-Thread的开发环境下载必要的工具链和组件。如果遇到网络问题可以切换到国内的镜像源menuconfig -s在配置界面中选择gitee作为下载源这样下载速度会快很多。3. AHT10传感器驱动配置星火一号开发板已经集成了AHT10传感器我们不需要自己接线直接使用RT-Thread的软件包就能快速开发。这就是RT-Thread的优势之一丰富的软件包生态大大提高了开发效率。在env环境中我们可以通过menuconfig来配置AHT10驱动menuconfig进入Hardware Drivers Config → On-chip Peripheral Drivers → I2C Drivers确保I2C3总线已经启用。因为星火一号的AHT10是连接在I2C3总线上的。然后进入RT-Thread online packages → peripheral libraries and drivers找到aht10软件包并启用它。保存配置后执行pkgs --update这个命令会自动从GitHub或Gitee下载AHT10的驱动软件包。下载完成后我们就可以在代码中调用AHT10的API来读取温湿度数据了。4. 读取温湿度数据AHT10软件包提供了非常简洁的API接口。下面是一个读取温湿度的示例代码#include rtthread.h #include board.h #include drv_gpio.h #include aht10.h #define AHT10_I2C_BUS i2c3 void aht10_thread_entry(void *parameter) { aht10_device_t dev aht10_init(AHT10_I2C_BUS); if(dev RT_NULL) { rt_kprintf(AHT10 init failed!\n); return; } while(1) { float temp aht10_read_temperature(dev); float humi aht10_read_humidity(dev); rt_kprintf(Temperature: %d.%d°C, Humidity: %d.%d%%\n, (int)temp, (int)(temp*10)%10, (int)humi, (int)(humi*10)%10); rt_thread_mdelay(2000); // 每2秒读取一次 } } int aht10_start(void) { rt_thread_t tid rt_thread_create(aht10, aht10_thread_entry, RT_NULL, 1024, 25, 5); if(tid ! RT_NULL) { rt_thread_startup(tid); } return 0; } MSH_CMD_EXPORT(aht10_start, Start AHT10 sensor);这段代码创建了一个线程每2秒读取一次温湿度数据并通过串口打印出来。在实际项目中我们还需要考虑数据的精度处理、异常情况处理等问题。5. MQTT客户端配置接下来我们要把采集到的数据上传到云端。这里选择MQTT协议因为它特别适合物联网场景轻量级、开销小而且阿里云物联网平台也原生支持MQTT协议。首先需要在阿里云物联网平台上创建产品和设备登录阿里云物联网平台控制台创建一个新产品选择自定义品类在产品下创建设备获取设备的三元组ProductKey、DeviceName、DeviceSecret在RT-Thread中我们可以使用aliyun-iotkit软件包来实现MQTT客户端功能。同样通过menuconfig来配置menuconfig进入RT-Thread online packages → IoT - internet of things → aliyun-iotkit启用该软件包。然后在子菜单中配置设备的三元组信息。配置完成后保存退出并更新软件包pkgs --update6. 数据上传实现现在我们需要把AHT10采集的数据通过MQTT上传到阿里云。阿里云物联网平台使用物模型来定义设备的功能我们需要先定义温湿度属性。在阿里云控制台中进入产品详情在功能定义标签页下添加两个属性CurrentTemperature温度float类型CurrentHumidity湿度float类型然后修改我们的代码将采集到的数据发布到阿里云#include rtthread.h #include board.h #include aht10.h #include aliyun_mqtt.h #define AHT10_I2C_BUS i2c3 static void publish_sensor_data(float temp, float humi) { char payload[256]; rt_snprintf(payload, sizeof(payload), {\params\:{\CurrentTemperature\:%.1f,\CurrentHumidity\:%.1f}}, temp, humi); aliyun_mqtt_publish(/sys/{ProductKey}/{DeviceName}/thing/event/property/post, payload, strlen(payload)); } void aht10_thread_entry(void *parameter) { aht10_device_t dev aht10_init(AHT10_I2C_BUS); if(dev RT_NULL) return; while(1) { float temp aht10_read_temperature(dev); float humi aht10_read_humidity(dev); publish_sensor_data(temp, humi); rt_thread_mdelay(5000); // 每5秒上传一次 } }这段代码每5秒读取一次温湿度数据然后通过MQTT发布到阿里云物联网平台。阿里云会自动解析这些数据并存储起来。7. 云端数据可视化数据上传到阿里云后我们可以在控制台中查看实时数据也可以配置数据可视化面板。阿里云物联网平台提供了丰富的数据展示功能进入物联网平台控制台选择监控运维 → 数据可视化创建一个新的面板添加温湿度曲线图配置数据源为我们的设备属性这样就能实时看到温湿度的变化曲线了。如果需要更复杂的展示还可以把数据流转到其他数据分析服务中。8. 常见问题排查在实际开发中可能会遇到各种问题。这里分享几个我踩过的坑WiFi连接不稳定星火一号的WiFi模块只支持2.4GHz频段确保路由器开启了2.4GHz WiFi。信号强度最好保持在-70dBm以上。MQTT连接失败检查设备三元组是否正确时间是否同步。阿里云要求设备时间与服务器时间差不能超过15分钟。数据上传失败检查物模型定义是否与代码中的属性名称一致。阿里云对JSON格式要求很严格多一个空格都可能导致解析失败。内存不足RT-Thread默认配置的内存比较小如果出现内存不足的情况可以在menuconfig中调整内存大小。遇到问题时建议先查看串口日志RT-Thread的日志系统非常完善能帮助快速定位问题。

更多文章