十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IoT-For-Beginners 实战指南:Wio Terminal 通过 MQTT 发布温度遥测数据

IoT-For-Beginners 实战指南:Wio Terminal 通过 MQTT 发布温度遥测数据 IoT-For-Beginners 实战指南Wio Terminal 通过 MQTT 发布温度遥测数据【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文围绕 wio-terminal-temp-publish.md丹麦语版对应英文原文 2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md展开讲解在 IoT-For-Beginners 课程「农场项目」第一课中如何用 Wio Terminal 读取 DHT11 传感器温度并以 JSON 格式通过 MQTT 发布遥测消息为后续的积温Growing Degree Days, GDD计算提供数据。读完后你将掌握在 PlatformIO 工程中复用第 4 课的 WiFi/MQTT 连接代码、修改config.h与main.cpp实现温度发布、以及从源码层面理解整条设备到服务器的遥测数据链路。背景为什么要发布温度数据在本课程中Wio Terminal 已经在前一个任务里接入了 Grove DHT11 温湿度传感器并完成了本地读数硬件连接与读数代码参见 wio-terminal-temp.md。DHT11 内部使用负温度系数NTC热敏电阻测温是数字传感器自带 ADC 向微控制器输出数字信号。发布温度的目的不是「显示温度」而是为积温GDD计算积累数据。GDD 用简化公式估算GDD (T_max T_min) / 2 - T_base其中 T_base 是作物的基础温度例如玉米约 10°C草莓约 10°C。农民每天需要当日最高/最低气温才能计算 GDD而这些数据必须由 IoT 设备长期、定时地采集并上传。整个数据链路是设备测温 → 经 MQTT 发布 → 服务器订阅并存储 → 夜间批处理计算 GDD。架构示意见课程主文档 2-farm/lessons/1-predict-plant-growth/README.md 中的「Calculate GDD using temperature sensor data」一节。关键设计决策时间戳由服务器补充文档明确指出微控制器默认不从互联网获取时间也没有实时时钟RTC硬件支持——即使硬件支持也需要专门编程。为了让本课保持简单设备端不随传感器数据一起发送时间而是在服务器代码收到消息时补充时间戳。这一点在仓库的服务器端代码中得到了印证code-server/temperature-sensor-server/app.py 的handle_telemetry函数在写入 CSV 时用datetime.now().astimezone().replace(microsecond0).isoformat()生成带时区、不含微秒的 ISO 8601 时间戳与遥测负载中的temperature值一起追加到temperature.csv列结构为date,temperature。设备端因此只需专注于「读数 发布」这一最小职责。任务把温度发布到 MQTT1. 打开 temperature-sensor 项目并复用第 4 课的 MQTT 接入步骤打开 Wio Terminal 的temperature-sensor项目即上一节测温任务创建的平台 IO 工程重复 第 4 课连接 MQTT 的步骤和发送遥测的步骤使用同一个公共 Mosquitto brokertest.mosquitto.org。具体包含四步向.ini文件添加 Seeed WiFi 与 MQTT 库添加config.h配置文件和连接 WiFi 的代码添加连接 MQTT broker 的代码添加发布遥测的代码从仓库中的成品工程 platformio.ini 可以看到完整的库依赖清单lib_deps[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduino lib_deps seeed-studio/Grove Temperature And Humidity Sensor 1.0.1 knolleary/PubSubClient 2.8 bblanchon/ArduinoJson 6.17.3 seeed-studio/Seeed Arduino rpcWiFi 1.0.5 seeed-studio/Seeed Arduino FS 2.1.1 seeed-studio/Seeed Arduino SFUD 2.0.2 seeed-studio/Seeed Arduino rpcUnified 2.1.3 seeed-studio/Seeed_Arduino_mbedtls 3.0.1其中前两项是本课直接依赖的seeed-studio/Grove Temperature And Humidity SensorDHT11 传感器驱动与knolleary/PubSubClientMQTT 客户端bblanchon/ArduinoJson用于构造 JSON 遥测文档后五项是 Seeed 官方 WiFi 库栈rpcWiFi 及其依赖 FS、SFUD、rpcUnified、mbedtls。注意 版本号语法锁定了具体版本——第 4 课文档特别提醒去掉版本号会始终使用最新版但没有保证后续版本与本课程代码兼容仓库中的代码就是按上述版本测试通过的。2. 确保 CLIENT_NAME 体现本项目修改 config.h 头文件中的CLIENT_NAME使其与本项目的身份一致const string CLIENT_NAME ID temperature_sensor_client;仓库中的完整 config.h 定义了设备侧的全部配置常量// WiFi credentials const char *SSID SSID; const char *PASSWORD PASSWORD; // MQTT settings const string ID ID; const string BROKER test.mosquitto.org; const string CLIENT_NAME ID temperature_sensor_client; const string CLIENT_TELEMETRY_TOPIC ID /telemetry;三个占位符SSID、PASSWORD、ID需要你自行替换。ID建议用 GUID 等全局唯一值因为test.mosquitto.org是公共 broker任何学员都可能在使用唯一的 ID 能保证你的客户端名和主题ID/telemetry不会与他人冲突。ID同时也是服务器端代码订阅主题和命名自己客户端IDtemperature_sensor_server的纽带设备端与服务器端的ID必须保持一致。3. 修改 loop 函数读取温度并写入 JSON遥测数据不再发送光照值而是把 DHT 传感器读出的温度写入 JSON 文档的temperature属性。修改 main.cpp 的loop函数核心片段float temp_hum_val[2] {0}; dht.readTempAndHumidity(temp_hum_val); DynamicJsonDocument doc(1024); doc[temperature] temp_hum_val[1];逐行说明DHT dht(D0, DHT11)在全局作用域声明main.cpp 第 10 行绑定到 Wio Terminal 右侧 Grove 接口的D0端口型号参数指定为 DHT11readTempAndHumidity(temp_hum_val)把两个值填入浮点数组下标 0 是湿度下标 1 是温度所以下文取的是temp_hum_val[1]摄氏度DynamicJsonDocument doc(1024)是 ArduinoJson v6 的 API创建 1024 字节缓冲区的动态 JSON 文档足够容纳本例的短文档温度值最终以{temperature:25}这样的 JSON 报文发出。4. 把上报间隔设为 10 分钟温度在短时间内变化很小无需高频采样。把loop函数末尾的delay设为 10 分钟delay(10 * 60 * 1000);delay以毫秒为单位这里写成表达式方便阅读10 x60 秒/分钟x1000 毫秒/秒 600,000 毫秒 10 分钟。这也意味着每 10 分钟产生一条 GDD 采样点一天约 144 条记录足以求出当日最高/最低温。5. 上传并用串口监视器验证将代码上传到 Wio Terminal用 PlatformIO 的 Serial Monitor9600 波特率观察输出预期看到--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at http://bit.ly/pio-monitor-filters --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- --- Quit: CtrlC | Menu: CtrlT | Help: CtrlT followed by CtrlH --- Connecting to WiFi.. Connected! Attempting MQTT connection...connected Sending telemetry {temperature:25} Sending telemetry {temperature:25}出现Connected!、connected以及周期性的Sending telemetry {temperature:...}即表示发布成功。源码级解读完整工程是怎么组装的上文只展示了需要改动的片段仓库成品工程 code-publish-temperature/wio-terminal 的完整调用链如下可用来核对本地工程是否与参考实现一致。启动阶段setupmain.cpp 中setup()依次执行Serial.begin(9600)→ 等待串口就绪 →delay(1000)→dht.begin()初始化传感器→connectWiFi()→createMQTTClient()。其中connectWiFi()第 12–22 行用while (WiFi.status() ! WL_CONNECTED)循环重试连接每 500 毫秒尝试一次WiFi.begin(SSID, PASSWORD)。MQTT 客户端构建第 24–25 行先创建WiFiClient wioClient再包出PubSubClient client(wioClient)createMQTTClient()第 47–51 行调用client.setServer(BROKER.c_str(), 1883)指向 broker 的1883 端口Mosquitto 公共端点随后进入reconnectMQTTClient()。该函数第 27–45 行在未连接时死循环重试用CLIENT_NAME注册失败则打印返回码并等待 5 秒——这就是串口中Attempting MQTT connection...connected的来源。主循环loop第 68–88 行每轮先执行reconnectMQTTClient()和client.loop()。文档第 4 课解释过原因该程序是单线程的没有后台线程处理入站消息必须在主循环里定期调用client.loop()处理网络队列中的消息同时每轮开头重连检查保证链路断开后能自动恢复。之后读取传感器、构造 JSON并用serializeJson(doc, telemetry)序列化为字符串先打印到串口便于调试最后client.publish(CLIENT_TELEMETRY_TOPIC.c_str(), telemetry.c_str())发布到ID/telemetry主题第 85 行再以delay(10 * 60 * 1000)第 87 行休眠 10 分钟。数据在下游的落点服务器端 app.py 用 paho-mqtt 以IDtemperature_sensor_server身份连接同一 broker订阅ID/telemetry在handle_telemetry中把收到的负载反序列化为 JSON取payload[temperature]连同服务器本地时间追加写入temperature.csv。这正是本文开头所说「时间戳由服务器补充」的完整闭环。排错与一致性检查清单基于上述实现验证失败时可按以下顺序排查卡在Connecting to WiFi..检查config.h中的SSID/PASSWORD是否正确设备是否在同一网络。卡在Retying in 5 seconds - failed, rc...确认能访问test.mosquitto.org:1883rc返回值来自client.state()常见 4 为连接被拒、7 为无网络。串口有Sending telemetry但服务器收不到核对设备端ID与服务器端id是否完全一致——主题ID/telemetry是唯一的收束点任何大小写或拼写差异都会导致订阅落空。JSON 中缺少temperature字段确认DynamicJsonDocument是 ArduinoJson v6 的写法v7 已改名为JsonDocument版本以 platformio.ini 锁定的bblanchon/ArduinoJson 6.17.3为准。数值恒定不变DHT11 精度有限且变化慢属正常现象若用虚拟设备调试第 1 课 README 建议勾选 random 选项并设置取值范围避免每次返回相同温度。小结本任务在「读温度」基础上完成了遥测链路的最后一块拼图设备端以ID/telemetry主题为契约每 10 分钟发布一条{temperature:...}JSON 消息时间戳职责下沉到服务器端。完整参考代码位于 code-publish-temperature/wio-terminal/temperature-sensor设备端与 code-server/temperature-sensor-server服务器端你可以将本地工程与 main.cpp、config.h 逐行比对确认 MQTT 连接、重连、发布三条路径均与参考实现一致后即可进入下一节的服务器采集与 GDD 计算。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表