概述
DHT11 是入门最经典的温湿度传感器,温度单位 °C(摄氏度),湿度单位 %RH(相对湿度百分比,"空气里含了多少水汽")。它只用一根数据线就能通信(这种一根线既传数据又传时钟的通信方式叫单总线),测量范围:温度 0~50°C(精度 ±2°C)、湿度 20~90%RH(精度 ±5%RH)。本教程用 Ai-WB2 开发板读取 DHT11 的温湿度,串口实时打印,并走完 接线 → 代码编写 → 编译 → 烧录(把编译好的程序写进开发板芯片)→ 运行验证 的完整流程。
用大白话讲:单总线就像「一根电线传话」——主控和数据线约定好:先拉低再拉高告诉传感器"我要问了",传感器用一串高电平时间长短不同的脉冲把 40 位数据(湿度、温度各 16 位加校验码)报回来。本教程用的驱动会解析这 40 位数据,直接给你温度和湿度两个数。
本教程基于安信可官方 SDK(Ai-Thinker-Open/Ai-Thinker-WB2,版本
release_bl_iot_sdk_1.6.40)的官方示例applications/iot-solution/demo_dht11编写,代码可在本地 SDK 中直接找到。
按官方示例接线(见 SDK applications/iot-solution/demo_dht11/README.md),用杜邦线(两端带插针的连接线)连接:
| Ai-WB2 引脚 | DHT11 引脚 |
|---|---|
| IO11 | DATA |
| 3V3 | VCC |
| GND | GND |
💡 DHT11 是单总线设备,VCC 接 3.3V(DHT11 支持 3.3V~5V 供电,本教程统一 3.3V)。 ⚠️ 官方 README 标注的是 IO4,但本版本官方驱动代码实际使用 GPIO11(见
demo_dht11/driver_dht11_interface_bl602.c中.port = 11),以代码为准接 IO11,接错就读不到数据。 💡 若使用长杜邦线(>20cm),建议在 DATA 与 3V3 之间加一个 5.1kΩ 上拉电阻(把线路默认拉到高电平的小电阻),提高通信稳定性。
本教程直接使用官方 SDK 自带的 demo_dht11 示例工程,打开终端进入该工程目录:
cd ~/Ai-Thinker-WB2/applications/iot-solution/demo_dht11
说明:
cd是「进入目录」命令,这里进入 DHT11 示例工程目录;后续的make编译、make flash烧录命令都必须先在这个目录里执行。
本工程是多文件工程:主程序 + 官方移植的 DHT11 驱动库(源自开源 LibDriver 驱动,封装了单总线时序),结构如下:
| 文件 | 作用 |
|---|---|
demo_dht11/main.c |
主程序源码,本教程主要查看的文件 |
demo_dht11/driver_dht11_basic.c/h |
基础读写接口(初始化、读温湿度),调用下层的时序驱动 |
demo_dht11/driver_dht11.c/h |
单总线时序核心(40 位数据收发、校验) |
demo_dht11/driver_dht11_interface_bl602.c |
平台适配层:把驱动接到 WB2 的 GPIO11 上 |
Makefile |
编译入口,一般无需修改 |
打开 demo_dht11/main.c,本步完整代码已移至文末,见:
📜 完整代码 — 位于本页「完整代码」章节,默认折叠,点击展开,与官方示例(
applications/iot-solution/demo_dht11/demo_dht11/main.c)完全一致。
代码要点:
| 代码 | 作用 |
|---|---|
dht11_basic_init() |
初始化 DHT11 驱动(配置单总线引脚为收发模式),不初始化驱动无法工作 |
dht11_basic_read(&temperature, &humidity) |
发起单总线通信读取温湿度:温度是 float(°C),湿度是 uint8_t(整数 %),一次读失败返回 1 |
blog_info("%.2f C degree\t%u%%", ...) |
串口打印温度与湿度,不打印就看不到测量结果 |
vTaskDelay(pdMS_TO_TICKS(500)) |
每 500ms 采样一次;太快 DHT11 内部来不及刷新数据,读出来会是不变的旧值 |
在工程目录执行编译:
make -j8
说明:
make是「编译工程」命令,把代码变成开发板能运行的固件(程序文件);-j8表示用 8 个核并行编译,速度更快。
编译成功后生成固件 build_out/demo_dht11.bin。
⚠️ 若提示
riscv64-unknown-elf-gcc: command not found,说明工具链权限未配置,先执行cd toolchain/riscv/Linux && . chmod755.sh再重新编译。
开发板保持 USB 连接,确认串口设备号(Linux 下通常为 /dev/ttyUSB0),执行烧录:
make flash p=/dev/ttyUSB0 b=921600
说明:
make flash是「烧录」命令,把编译好的固件写进开发板芯片。p=后面是串口设备号(要改成你电脑上实际的串口,可用ls /dev/ttyUSB*查看),b=是烧录波特率(传输速度)。
⏳ 烧录过程中按提示长按开发板 EN 键进入下载模式(部分开发板自动进入),等待进度条完成即烧录成功。 Windows 平台烧录方法见 Windows 平台快速开始。
烧录完成后开发板自动重启运行,打开串口助手(波特率 921600,波特率 = 串口传输速度,收发两端必须设成一样),每 500ms 打印一次温湿度:
26.00 C degree 45%
26.00 C degree 46%
...
对着传感器哈气,湿度数值应上升;用手捏住传感器,温度数值应缓慢上升。
看到串口每 500ms 打印一次温湿度即为成功;如果一直不打印或数值固定不变(如恒为 0),说明还没成功,对照文末「常见问题与踩坑提示」排查。
💡 用逻辑分析仪观察 IO11 波形,可看到单总线的起始信号与 40 位数据脉冲(见官方示例
img/logic_analyzer.jpg)。
代码执行流程
例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):
本文 API 汇总
dht11_basic_init()
初始化 DHT11 驱动:注册平台接口函数(GPIO 读写、微秒延时、关中断)并完成传感器自检。
参数:
- 无
返回值:成功返回 0;失败返回 1(如传感器初始化自检失败)。驱动实现见 demo_dht11/driver_dht11_basic.c
dht11_basic_read(temperature, humidity)
按 DHT11 单总线时序发起一次测量并读取 40 位数据(8 位湿度整数 + 8 位湿度小数 + 8 位温度整数 + 8 位温度小数 + 8 位校验),解析出温度与湿度。
参数:
temperature:float *输出指针,收到温度值(单位 °C),必填humidity:uint8_t *输出指针,收到湿度值(单位 %RH,整数),必填
返回值:成功返回 0;失败返回 1(读失败或校验错误)。驱动实现见 demo_dht11/driver_dht11_basic.c
blog_info(fmt, ...)
输出一条 INFO 级日志(UART0,受级别过滤),本教程打印温湿度。
参数:
fmt:格式化字符串,同printf用法,必填...:变参,与fmt占位符对应,可省略
返回值:无
完整代码
以下为 demo_dht11/main.c 完整源码,与官方示例(applications/iot-solution/demo_dht11/demo_dht11/main.c)完全一致。本工程为多文件工程,其余驱动文件(driver_dht11*.c/h、driver_dht11_interface_bl602.c)位于同一目录,无需修改:
📜 点击展开 demo_dht11/main.c 完整代码
#include <stdio.h>
#include <FreeRTOS.h>
#include <task.h>
#include <blog.h>
#include "driver_dht11_basic.h"
int main(void)
{
dht11_basic_init();
float temperature;
uint8_t humidity;
for (;;) {
dht11_basic_read(&temperature, &humidity);
blog_info("%.2f C degree\t%u%%", temperature, humidity);
vTaskDelay(pdMS_TO_TICKS(500));
}
return 0;
}常见问题与踩坑提示
⚠️ 串口一直不打印数据(读不到)
原因:DATA 没接在 IO11(官方 README 标注 IO4 易误导)、杜邦线接触不良、或传感器损坏
解决:确认 DATA 接 IO11(驱动代码 .port = 11 为准);重新插紧杜邦线;换一块 DHT11 测试
⚠️ 数值恒为 0 或乱码
原因:VCC 供电电压不足、开发板与模块未共地(GND 没接),或长导线干扰导致校验失败
解决:确认 VCC 接 3V3、GND 接 GND(共地 = 两个设备的地线必须接在一起,否则电压没有参考点);长线时在 DATA 与 3V3 间加 5.1kΩ 上拉电阻
⚠️ 温度和湿度数值固定不变
原因:两次读取间隔太短,DHT11 内部测量数据还没来得及刷新(数据手册建议间隔 ≥1 秒)
解决:本示例 500ms 间隔通常可用;若数值长时间不变,可加大 vTaskDelay 到 1000 再试
⚠️ 找不到串口设备或提示无权限
原因:Linux 下 /dev/ttyUSB0 不存在或权限不足,Windows 下未安装 USB 转串口驱动
解决:Linux 用 ls /dev/ttyUSB* 确认设备号,权限不足执行 sudo usermod -aG dialout $USER 后重新登录;Windows 在设备管理器安装驱动并确认 COM 口号
⚠️ 烧录一直卡住等待,进度条不动
原因:未进入下载模式,或数据线只能充电不能传数据
解决:烧录时按提示长按 EN 键进入下载模式;换一根能传数据的 Type-C 数据线后重试
⚠️ 执行 make 报找不到 Makefile
原因:在错误的目录执行了编译命令(必须在示例工程目录内)
解决:先执行 cd ~/Ai-Thinker-WB2/applications/iot-solution/demo_dht11 进入工程目录,再执行 make -j8
运行自检
串口每 500ms 打印一次温湿度,哈气湿度上升、手捏温度上升,即 DHT11 温湿度测量验证通过。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

