DHT11 与 DHT22 温湿度传感器套件 —— 适用于 Raspberry Pi 与 Arduino
组件与物料清单
| 组件 | 数量 | 备注 |
|---|---|---|
| DHT11 温湿度传感器(4 引脚) | 1 | |
| Raspberry Pi 2 Model B | 1 | |
| Arduino UNO | 1 | |
| 公对公杜邦线 | 3 | |
| 面包板(通用) | 1 | |
| 4.7kΩ 电阻 | 1 | 上拉电阻 |
| Cobbler 扩展板套件 | 1 | 用于 Raspberry Pi GPIO 引出 |
应用与在线服务
- Microsoft Windows 10 IoT Core
- Arduino IDE
- Raspberry Pi Raspbian
- Microsoft Visual Studio 2015
- WinSCP
- PuTTY
项目简介
背景
DHT11 是一款 4 引脚(一脚空置)温湿度传感器,测量范围:相对湿度 20%-90%,温度 0-50°C。工作电压 3-5.5V DC,采用专有 OneWire 协议通信,要求极精确的时序。数据线上通过高电平持续时间编码 0/1,单次读取最长 23.4 ms,包含 18 ms 启动延迟和最多 5.4 ms 数据窗口,单个信号脉宽 20-80 μs。
Windows 10 IoT Core 发布初期,我拿 Raspberry Pi 2 和 DHT11 尝试 C# 读取,发现速度不够快(至少当时不行)。在微软论坛发帖后,发现微软曾回复 OneWire 协议在 Windows 10 IoT Core 上的支持情况。随后看到微软发布了使用 C++ 在 Windows 10 IoT Core 上通过 DHT11 实现 OneWire 协议的示例,我决定将其移植为 C# 库,以便更多人使用这款流行传感器。
库
该库是对微软原始示例代码的简单重构,核心读取逻辑归功于微软。
库提供 Sensors.Dht 命名空间下的 Dht11 类。C# 中创建对象很简单:
using Sensors.Dht;
GpioPin pin = GpioController.GetDefault().OpenPin(4, GpioSharingMode.Exclusive);
Dht11 dht11 = new Dht11(_pin, GpioPinDriveMode.Input);
通过 GetReadingAsync 方法获取读数:
DhtReading reading = await dht11.GetReadingAsync().AsTask();
重载方法可指定最大重试次数(默认 20),即放弃前尝试读取传感器的次数。
DhtReading 结构定义如下:
public value struct DhtReading {
bool TimedOut;
bool IsValid;
double Temperature;
double Humidity;
int RetryCount;
};
观察
即使在 C++ 下传感器也无法每次都成功读取,因此需要重试机制(这也是微软示例的一部分)。我对比了 Raspberry Pi 2 (Raspbian) 和 Arduino Uno 上的表现,相关代码已放入 GitHub 仓库。项目附带的视频演示并对比了各平台输出。
入门指南
Raspberry Pi 2 电路组装
请参考页面底部原理图(线色仅为方便辨识):
- 将 T 型 Cobbler 放在半尺寸面包板左端(编号从 1 开始),最左两脚插在 E1 和 F1,最右两脚插在 E20 和 F20。
- 4.7kΩ 电阻连接 A4 和 3V3。
- 橙色公对公杜邦线连接 B4 和 F28。
- 红色公对公杜邦线连接 F29 和 3V3。
- 黑色公对公杜邦线连接 F30 和 GND。
- DHT11 传感器插入 J30 (-)、J29 (+)、J28 (信号)。
- 排线连接 Cobbler 和 Raspberry Pi。
Arduino 电路组装
参考页面底部原理图:
- 4.7kΩ 电阻连接 E12 和 E13。
- 白色公对公杜邦线连接 D13 和 Arduino 引脚 5。
- 红色公对公杜邦线连接 D12 和 Arduino 5V。
- 黑色公对公杜邦线连接 D11 和 Arduino GND。
- DHT11 传感器插入 A11 (-)、A12 (+)、A13 (信号)。
- USB 线连接电脑和 Arduino。









Raspberry Pi 应用启动
选择 Debug、ARM 配置、Remote Machine。右键项目 → Properties → Debug 标签,在 Remote machine 填入 Raspberry Pi 2 IP 地址,取消勾选 Use authentication。按 F5 部署(首次可能需几分钟)。
Arduino 应用启动
GitHub 仓库中有名为 Dht11_Speed 的草图。打开 Arduino IDE,加载草图,上传(Ctrl+U),打开串口监视器(Ctrl+Shift+M)。视频演示了详细步骤。
Raspbian 应用启动
GitHub 中有 Dht11.c 源码。需拷贝到 Raspberry Pi 并在那里编译。推荐用 WinSCP 传文件。编译前需安装 wiringPi。编译命令:
gcc -o Dht11_Speed Dht11_Speed.c -L/usr/local/lib -lwiringPi -std=c99 -lm
运行命令:
sudo ./Dht11_Speed 1000 10
其中 1000 为延迟 1000 ms(1 秒),10 为采样次数。视频演示了拷贝、编译全过程。Raspbian 安装见 树莓派官网。
视频演示
下方视频演示了应用运行情况,建议在 YouTube 使用影院模式观看以获得最佳画质。
代码
Visual Studio 2015 C#/C++ 源码
https://github.com/porrey/dht.git
原理图
Dht11_RPi2.fzz
Dht11_Arduino.fzz
制造工艺
- 树莓派+$5 I²C传感器打造温度记录仪
- 树莓派配合 TMP006 红外温度传感器:Python 库与安装指南
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- 树莓派 GPIO 直连 DS1820 单总线温度传感器指南
- 树莓派接入 DS18B20 单总线数字温度计:分步实战指南
- 树莓派多传感器温度光照监测系统:DS18B20 实战构建
- 树莓派 + MCP9808 + InfluxDB + Grafana:家庭温度监测系统
- 树莓派 3 接 DHT11 传感器上传数据到 ThingsIo.ai 云平台
- 面向色敏工艺的精准红外温度传感
- 高精度轴承温度传感器:原理、安装与SKF PT100选型指南
- DS18B20温度传感器:精准1-Wire数字温度计,工业与消费级首选
- DHT11传感器:工作原理与关键应用