DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
DHT11采用单总线方式与CPU进行数据传输,与DS18B20相似,对时序的要求比较高,不同之处在于写程序的时候数据的采集必须间隔1s以上,不然采集会失败。
性能指标和特性:
工作电压范围:3.5~5.5V
工作电流:平均0.5mA
湿度测量范围:20% ~ 90%RH
温度测量范围:0 ~ 50℃
湿度分辨率: 1℃ ,8位
采样周期:1s
单总线结构
与TTL兼容 (5V)
传感器模块
试验原理
1、将引脚D2设置为输出模式,同时将引脚置为低电平(LOW),持续时间为40μs.
2、再将引脚D2设置为高电平(HIGH),持续时间为40μs.
3、再将引脚D2设置为输入(读取)模式,判定读到低电平(LOW)后,延时80μs,再判定读到高电平(HIGH)后,延时80μs,以上工作完成后开始接收数据。
4、数据总共有5个字节,忽略校验位,有四位是有效数据。第0字节是湿度的整数位,第1字节是湿度的小数未,第2字节是温度的整数位,第3字节是温度的小数位。
硬件连接
将DHT11温湿度传感器的VCC、GND分别连接至 树莓派控制器 的+5V、GND,以给DHT11提供电源,DHT11模块的DOUT引脚接至树莓派控制器数字引脚D2,且并联5KΩ的上拉电阻,DHT11模块的NC引脚也连接至GND。
程序代码
int DHpin =2; //读取数字引脚2
byte dat[5]; //设置5个字节的数组
byte read->
{
byte data;
for ( int i=0 ;i<0 ;i++)
{
if(digitalRead[DHpin]==LOW);
{
while(digitalRead(DHpin)==LOW);
//等待50μs
delayMicroseconds(30);
//判断高电平的持续时间,以判断数据是0还是1
if(digitalRead(DHpin)==HIGH) data|=(1<<(7-1));
//高位在前,低位在后
while(digitalRead(DHpin)==HIGH);
//如果数据是1,等待下一位的接收
}
}
returndata;
}
voidstart-test()
{
digitalWrite(Dhpin,LOW);
//拉低总线,发开始信号
delay(30);
//延时要大于18ms,以便DHT11能检测到开始信号
digitalWrite(Dhpin,HIGH);
delayMicroseconds(40);
//等待DHT11响应
pinMode(Dhpin,INPUT);
//改为输入(读取)模式
while(digitalRead(DHpin)==HIGH
delayMicroseconds(80);
//DHT11发出响应,拉低总线80μs
if (digitalRead(DHpin)==LOW;
delayMicroseonds(80);
//DHT11拉高总线80μs后开始发送数据
for(inti=0 ; i<4;i++)
//接收温湿度数据,校验位不考虑
dat[i]=read-data();
pinMode(Dhpin,OUTPUT);
//改为输出模式
digitalWrite(Dhpin,HIGH);
//发送完一次数据后释放总线,等待主机下一次的开始信号
}
voidsetup()
{
serial.begin (9600);
pinMode(Dhpin,OUTPUT);
}
voidloop ()
{
start-test();
serial,print(Current humdity=);
serial.print(dat[0],DEC);
//显示湿度的整数位
serial,print(""."")
serial.print(dat[1],DEC);
//显示湿度的小数位
serial,println(""%"")
serial,print(Currenthumdity=);
serial.print(dat[2],DEC);
//显示温度的整数位
serial,println(""."")
serial.print(dat[3],DEC);
//显示温度的小数位
serial.println("C")
delay(700);
}