IoT-For-Beginners 实战:在 Wio Terminal 上使用 DHT11 传感器测量温度(Grove 温湿度传感器接入指南)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
导读
本篇技术指南源自开源课程 IoT-For-Beginners 的「用 IoT 预测植物生长」一课,讲解如何在 Seeed Wio Terminal 上接入 Grove DHT11 温湿度传感器并读取环境温度。你将完成硬件接线、PlatformIO 工程配置、DHT 库引入与串口读数,最终在串口监视器中持续输出摄氏温度——这是后续基于生长度日(Growing Degree Days, GDD)计算作物成熟度的第一步数据采集环节。
课程背景:为什么要测温度
在 2-farm 项目第 1 课 中,核心业务是"用 IoT 预测植物生长"。植物除了需要水、二氧化碳、光照和养分外,还需要热量才能生长。通过测量空气温度并计算 GDD(当日平均气温减去植物基准温度的累积值),农民可以预判作物何时接近成熟,从而减少人工巡查成本。
本课所处链路为:温度传感器采集 → 微控制器读取 → 串口输出。采集到可靠温度后,下一步才会上报 MQTT(参见 wio-terminal-temp-publish.md)并由服务端落盘 CSV 用于 GDD 计算。因此本文聚焦的 Wio Terminal 温度读取,是整个农业数字化方案中最底层的硬件采集环节。
硬件准备
DHT11 温湿度传感器
本课选用的传感器是DHT11 温湿度传感器(Grove 接口版本),它在同一个封装内集成了两个传感器:
- 温度传感组件:负温度系数(NTC)热敏电阻,其电阻值随温度升高而降低;
- 湿度传感组件:电容式湿度感应元件;
- 片上 ADC:DHT11 是数字传感器,内部集成模数转换器,将温度和湿度数据编码为数字信号,微控制器可直接读取,无需外接模拟采样电路。
补充:市场上常见的 DHT 系列还有 DHT22(AM2302),精度与量程优于 DHT11。本课使用的 Seeed Grove 温湿度传感器库同时支持多种 DHT 变体,代码中仅需改变构造函数第二个参数即可切换。
接线任务:连接温度传感器
连接步骤:
- 将 Grove 4-pin 连接线的一端插入温湿度传感器插座——接口有防呆设计,只能以一个方向插入;
- 在 Wio Terminal 断电状态下(从电脑或其它电源断开),将连接线另一端插入 Wio Terminal 的右侧 Grove 端口(正对屏幕时,离电源键最远的那个端口)。
为什么是右侧端口?右侧 Grove 端口在 Seeed Wio Terminal 的 Arduino 引脚映射中对应数字引脚D0,这是 DHT 库实例化时使用的引脚号(下文会看到
DHT dht(D0, DHT11);)。
编程实现:读取温度
创建工程与配置依赖
使用 PlatformIO 新建 Wio Terminal 工程,命名为
temperature-sensor,并在setup函数中预留串口配置代码。若需要复习工程创建步骤,可参考 1-getting-started 项目第 1 课 Wio Terminal 指南。在工程的
platformio.ini中添加 Seeed Grove 温湿度传感器库依赖:
lib_deps = seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1仓库内完整工程配置文件见 code-temperature/wio-terminal/temperature-sensor/platformio.ini,其环境声明如下:
[env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1关键点说明:
platform = atmelsam:Wio Terminal 基于 Microchip ATSAMD51 系列(ARM Cortex-M4F),需使用 atmel SAM 平台;board = seeed_wio_terminal:PlatformIO 内置的板卡标识;framework = arduino:使用 Arduino 框架编写固件;lib_deps:PlatformIO 会自动从官方库注册表拉取Grove Temperature And Humidity Sensor @ 1.0.1(固定版本 1.0.1)。
添加库的通用流程可参考 1-getting-started 项目第 4 课的 MQTT 章节。
- 在
main.cpp顶部、已有的#include <Arduino.h>之后加入两个头文件:
#include <DHT.h> #include <SPI.h>DHT.h:DHT 传感器驱动库,封装了读取温湿度的核心逻辑;SPI.h:确保编译时链接传感器通信所需的 SPI 相关代码。
说明:Seeed 的这款 Grove 温湿度传感器基于 DHT 协议(单总线时序),SPI 头文件用于满足库内部的底层依赖,保证链接完整。
声明 DHT 实例
在setup函数之前声明传感器对象:
DHT dht(D0, DHT11);- 第一个参数
D0:传感器所连接的引脚,即 Wio Terminal 右侧 Grove 端口对应的数字引脚; - 第二个参数
DHT11:指定传感器型号。该库还支持 DHT22 等其它 DHT 变体,直接替换型号即可。
初始化串口与传感器
在setup函数中配置串口,等待串口就绪后调用dht.begin()启动传感器:
void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); dht.begin(); }Serial.begin(9600):以 9600 波特率初始化串口;while (!Serial) ;:阻塞等待 USB 串口枚举完成(Wio Terminal 经 USB 连接时很有必要);delay(1000):留出稳定时间;dht.begin():必须在读取前调用,完成传感器初始化。
循环读取并打印温度
在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); }工作原理解析:
float temp_hum_val[2] = {0};声明一个包含 2 个元素的浮点数组;dht.readTempAndHumidity(temp_hum_val);由库内部读取一次完整测量,并就地填充该数组:temp_hum_val[0]为相对湿度(C++ 数组索引从 0 开始);temp_hum_val[1]为温度(单位摄氏度);
- 取出温度元素打印
Temperature: 25.00°C; delay(10000);每 10 秒采样一次——环境温度变化缓慢,无需更频繁读取,也避免对传感器造成过高的读取压力。
温度单位为摄氏度。如需换算华氏度:
°F = (°C / 5) × 9 + 32,例如 20°C → (20/5)×9+32 = 68°F。
编译烧录与验证
- 编译并烧录到 Wio Terminal(上传与构建流程可参考 第 1 课的 Hello World 应用指南);
- 使用 PlatformIO 的串口监视器查看输出,仓库中对应实跑输出如下:
> 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监视器每 10 秒刷新一条Temperature: xx.xx°C记录,说明 DHT11 已正常工作。若数值跳动,属于传感器正常精度波动(DHT11 温度精度典型值为 ±2°C)。
源码参考
完整可运行工程位于仓库 2-farm/lessons/1-predict-plant-growth/code-temperature/wio-terminal,核心实现见 main.cpp。它与上文代码一一对应:
#include <Arduino.h> #include <DHT.h> #include <SPI.h> #include "config.h" DHT dht(D0, DHT11); void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); dht.begin(); } 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); }下一步:温度数据如何走向 GDD
本课完成的温度读取仅是数据链路的起点。在 课程主文档 的后续任务中:
- 发布温度:通过 MQTT 将
{"temperature":25}形式的 JSON 遥测发布到公共 Mosquitto Broker(参见 wio-terminal-temp-publish.md),其中温度同样取自temp_hum_val[1],并将采样间隔放宽到 10 分钟(delay(10 * 60 * 1000);); - 服务端落盘:服务端订阅遥测主题,把
date与temperature写入 CSV(见 code-server/temperature-sensor-server),并补充时间戳(ISO 8601 格式); - GDD 计算:取当天最高与最低温,按简化公式
GDD = (Tmax + Tmin) / 2 − Tbase计算当日生长度日,累加后即可判断作物是否接近成熟。
例如草莓基准温度为 10°C,某日最高 25°C、最低 12°C,则当日 GDD = (25+12)/2 − 10 = 8.5,而草莓结果约需累计 250 GDD。
总结
本文完整复现了 Wio Terminal 接入 Grove DHT11 的四个关键环节:硬件接线(右侧 D0 端口)、platformio.ini库依赖配置、DHT dht(D0, DHT11)实例化与初始化、以及readTempAndHumidity数组式读取温度。掌握这些步骤后,你便拥有了可靠的温度采集能力,可无缝衔接 MQTT 遥测发布与 GDD 计算,构建完整的"预测植物生长"IoT 应用。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考