使用 Wio Terminal 与 DHT11 测量环境温度:IoT 植物生长预测实战指南
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
导读
本文基于 IoT-For-Beginners 课程「2-farm/lessons/1-predict-plant-growth」中面向 Wio Terminal 的温度测量实操文档(wio-terminal-temp.md),完整讲解如何将 Grove DHT11 温湿度传感器接入 Wio Terminal,并通过 PlatformIO + Arduino 框架读取温度数值。完成本指南后,你将掌握:数字温湿度传感器的工作原理、Grove 接口接线方法、DHT 库的配置与调用,以及串口监视温度数据的完整流程——这是后续通过生长度日(GDD)模型预测植物成熟时间的第一步,也是理解「精准农业」中温度遥测(telemetry)采集链路的基础。
为什么要在农场里测量温度
在 2-farm 项目第 1 课中,课程反复强调一个核心观点:植物的生长不仅依赖水分、光照、二氧化碳和养分,还依赖热量。每种植物都有其基础温度(低于此温度不生长)、最适温度(生长最快)与最高温度(高于此温度停止生长以保存水分)。
温度数据一旦被 IoT 设备采集,就可以通过 MQTT 发布到服务端保存,再在夜间任务中计算当日 GDD(生长度日)累计值,从而在作物接近成熟时自动提醒农户,避免人工逐日巡检的巨大劳动力开销。因此,在 Wio Terminal 上稳定地测量并读出环境温度,是整个智慧农业数据管线的起点。
硬件准备:DHT11 数字温湿度传感器
本课使用的传感器是 Grove 温湿度传感器 DHT11,它将两个传感器封装在同一个器件中,是一个相当流行的选择。市场上还存在不少同时集成温度、湿度甚至大气压力的商用传感器。
从工作原理上看,DHT11 的温度传感元件是一个NTC 负温度系数热敏电阻——即电阻值随温度升高而降低。由于这是一个数字传感器,它内部集成了 ADC(模数转换器),能够直接输出包含温度与湿度数据的数字信号,微控制器无需自行进行模拟采样转换,只需按协议解析数字帧即可。
该文档对应的完整硬件接线图示可参考 images/grove-dht11.png 与 images/wio-temperature-sensor.png。
连接传感器:Grove 接口与 Wio Terminal 的数字口
Grove 温湿度传感器需要连接到 Wio Terminal 的数字口(digital port)。接线分两步:
- 将 Grove 线缆的一端插入 DHT11 传感器上的插座——线缆只有一种插入方向,反了插不进去;
- 在Wio Terminal 断电(断开与电脑或其他电源的连接)的前提下,将线缆另一端插入 Wio Terminal 屏幕朝向你时的右侧 Grove 插座,即离电源按键最远的那个插座。
⚠️ 接线必须在断电状态下进行,这是所有 Grove 硬件操作的基本安全规范。
编程前的工程准备:PlatformIO 项目与库依赖
Wio Terminal 的固件开发使用 PlatformIO + Arduino 框架。请先创建一个全新的 Wio Terminal 工程并命名为temperature-sensor(若不清楚如何创建 PlatformIO 工程,可参考 第 1 项目第 1 课的 PlatformIO 建工程指南)。
在 platformio.ini 中声明传感器库
在工程的platformio.ini中添加 Seeed 官方的 Grove 温湿度传感器库依赖:
lib_deps = seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1仓库中完整的工程配置如下(code-temperature/wio-terminal/temperature-sensor/platformio.ini),其中atmelsam平台与seeed_wio_terminal开发板对应 Wio Terminal 的 ATSAMD51 微控制器:
[env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1若需要回顾在 PlatformIO 中添加第三方库的完整步骤,可参考 第 1 项目第 4 课的 MQTT 库安装说明。
引入 DHT 头文件
在main.cpp顶部已有的#include <Arduino.h>之下,加入以下两条#include指令:
#include <DHT.h> #include <SPI.h>DHT.h包含了驱动 DHT11 传感器本身的代码;SPI.h用于确保与传感器通信所需的底层代码在编译时被正确链接进来。
核心代码:声明并初始化 DHT 传感器
声明 DHT 实例
在setup函数之前声明 DHT 对象:
DHT dht(D0, DHT11);这行代码创建了一个DHT类的实例,用于管理这颗数字温湿度传感器(Digital Humidity and Temperature):
- 第一个参数
D0指定传感器挂接在 Wio Terminal 的D0引脚上,即右侧那个 Grove 插座; - 第二个参数
DHT11告知库当前使用的是 DHT11 型号——所用库还支持该传感器的其他衍生型号(如 DHT22 等)。
setup:串口初始化与传感器启动
setup函数负责串口配置与传感器上电:
void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); dht.begin(); }Serial.begin(9600)以 9600 波特率开启串口,用于打印温度读数;while (!Serial) ;阻塞等待串口就绪(此时枚举 USB 虚拟串口需要时间);delay(1000)再等待 1 秒,确保 USB 串口完全稳定;dht.begin()必须在delay之后调用,完成 DHT 传感器内部状态初始化。
loop:读取温度并打印
loop函数是温度采集的核心循环:
void loop() { float temp_hum_val[2] = {0}; dht.readTempAndHumidity(temp_hum_val); Serial.print("Temperature: "); Serial.print(temp_hum_val[1]); Serial.println ("°C"); delay(10000); }这段代码的逻辑要点:
- 声明一个包含 2 个
float的空数组temp_hum_val; - 调用
dht.readTempAndHumidity(temp_hum_val),该调用会把传感器读数写入数组——湿度存入第 0 个元素,温度存入第 1 个元素(C++ 数组下标从 0 开始,第 0 个即"第一个"元素); - 从第 1 个元素取出温度,连同单位
°C一起打印到串口; delay(10000)使每次采样间隔 10 秒——环境温度变化缓慢,无需更高频采样,同时也避免对传感器造成过多读写压力。
完整可编译代码可在仓库中直接查看:code-temperature/wio-terminal/temperature-sensor/src/main.cpp。
🇺🇸 温度默认以摄氏度读取。若要转换为华氏度:将摄氏度值除以 5,乘以 9,再加 32。例如 20°C → ((20/5)*9) + 32 = 68°F。
编译、烧录与串口监视
完成代码编写后,在 PlatformIO 中执行构建并烧录到 Wio Terminal(构建与烧录的完整步骤可参考 第 1 课 Hello World 烧录指南)。
烧录成功后,通过串口监视器(PlatformIO 的device monitor任务)观察输出,应看到类似以下内容:
> Executing task: platformio device monitor < --- 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: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- Temperature: 25.00°C Temperature: 25.00°C Temperature: 25.00°C Temperature: 24.00°C/dev/cu.usbmodem1201是 macOS 下 Wio Terminal 的串口设备路径;在 Windows 上通常显示为COMx,在 Linux 上则是/dev/ttyACM0之类的设备节点。9600,8,N,1表示波特率 9600、8 数据位、无校验、1 停止位的串口参数,与代码中Serial.begin(9600)一致。
进阶:从本地读数到 MQTT 遥测发布
温度测量本身只是第一步。在 wio-terminal-temp-publish.md 中,课程进一步把温度数据通过 MQTT 发布到公共 Mosquitto broker,供服务端保存并用于后续 GDD 计算。仓库中对应的完整实现位于 code-publish-temperature/wio-terminal,其要点包括:
- 在
platformio.ini中追加 MQTT 与 WiFi 相关依赖(查看完整配置):
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- 在
config.h中配置 WiFi 凭据与 MQTT broker(config.h 完整内容),默认 broker 为test.mosquitto.org、端口 1883; loop中改用DynamicJsonDocument构造 JSON 遥测载荷,并只发送温度字段:
float temp_hum_val[2] = {0}; dht.readTempAndHumidity(temp_hum_val); DynamicJsonDocument doc(1024); doc["temperature"] = temp_hum_val[1];- 由于温度在短时间内变化不大,发布间隔从本课的 10 秒调整为 10 分钟(
delay(10 * 60 * 1000),即 10 × 60 秒 × 1000 毫秒)。
发布成功时,串口输出形如:
Connecting to WiFi.. Connected! Attempting MQTT connection...connected Sending telemetry {"temperature":25} Sending telemetry {"temperature":25}与课程整体的衔接:GDD 计算管线
本节温度采集属于 「Predict plant growth with IoT」 课程「测量环境温度(Measure ambient temperature)」环节。在完成本地读数后,课程会引导你:
- 通过 MQTT 发布温度遥测(见上文);
- 编写服务端代码订阅遥测并追加时间戳写入 CSV(见 code-server/temperature-sensor-server/app.py);
- 依据简化 GDD 公式
GDD = (Tmax + Tmin) / 2 - Tbase逐日计算作物累计生长度日,进而判断成熟期。
Wio Terminal 的串口温度采样即这条数据链路的源头——温度数据的准确性与采样节奏,直接决定了后续 GDD 计算的质量。
常见问题与注意事项
- 串口无输出:检查
while (!Serial)阻塞是否因 USB 串口未就绪导致,以及串口监视器波特率是否与代码中的9600一致; - 传感器读数异常:确认 Grove 线缆是否插牢、是否连接到右侧(
D0)而非左侧插座,因为DHT dht(D0, DHT11)中的引脚参数必须与物理接线对应; - 接线安全:所有 Grove 线缆的连接与断开都应在 Wio Terminal 断电状态下进行;
- 采样频率:本课代码以 10 秒为周期打印读数用于调试;正式采集场景可参考发布版本把间隔放大到 10 分钟,以降低功耗与网络占用。
至此,你已完整走通「Wio Terminal + DHT11 温度采集」的全部流程——从硬件接线、库配置、代码编写到串口验证,为后续通过 MQTT 上云并计算 GDD 奠定了坚实的硬件基础。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考