一:DHT11的性能指标和特性
工作电压范围:3.5V-5.5V,工作电流 :平均 0.5mA,湿度测量范围:20-90%RH,温度测量范围:0-50℃,湿度分辨率 :1%RH 8 位,温度分辨率 :1℃ 8位,采样周期 :1S
二:DHT11 数据结构
DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具体格式在下面说明。一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和校验和数据为前四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如果,某次从传感器中读取如下5Byte数据:byte4 byte3 byte2 byte1 byte000101101 00000000 00011100 00000000 01001001整数 小数 整数 小数 校验和湿度 温度 校验和由以上数据就可得到湿度和温度的值,计算方法:
humi (湿度)= byte4 . byte3=45.0 (%RH)
temp (温度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)
注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。
三:树莓派接线
注意!勿将将正负极接反,否则DHT11模块必定烧毁,不可逆转。
传感器的正极VCC:连接树莓派的4号引脚(5V);
传感器DATA数据连:接树莓派18号引脚(BCM编码 24);
传感器GND负极:连接树莓派6号引脚(GND);
四:Python部分
我们这里使用的是已经编译好的库, Adafruit 来读取 DHT11 温湿度传感器
可以先更新下软件包
sudo apt-get update
sudo apt-get install build-essential python-dev
在从GitHub获取Adafruit库
sudo git clone https://github.com/adafruit/Adafruit_Python_DHT
安装完成后pi文件夹下新增Adafruit_Python_DHT文件夹,进入该文件夹安装该库。
cd Adafruit_Python_DHT
sudo python setup.py install
sudo python3 setup.py install
安装完成后进入examples文件夹运行AdfruitDHT.py可以获得结果。
cd examples
输入下面的执行命令查看测温数据(后面两个数值11代表使用的是DHT11模块,24代表着所接的GIPO引脚编号(BCM)
运行结果:
sudo python AdafruitDHT.py 11 24
参照下面的方法引入Adafruit库,可以使用 “read_retry” 方法来读取 DHT11 数据:
import Adafruit_DHT # Set sensor type : Options are DHT11,DHT22 or AM2302 sensor=Adafruit_DHT.DHT11 # Set GPIO sensor is connected to GPIO=24 # Use read_retry method. This will retry up to 15 times to # get a sensor reading (waiting 2 seconds between each retry). humidity, temperature = Adafruit_DHT.read_retry(sensor, GPIO) # Reading the DHT11 is very sensitive to timings and occasionally # the Pi might fail to get a valid reading. So check if readings are valid. if humidity is not None and temperature is not None: print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity)) else: print('Failed to get reading. Try again!')
五:C程序部分
1.由于我们C程序的DHT11是将DATA接到GPIO1(BCM编码:18)参考下图,如果你需要更改接口需要将下面的C程序引脚编码也同步更改。才能正常显示!
2.我们需要新建一个dht11.c文件,然后编写代码,具体如下;
sudo nano dht11.c
3.编译程序:
// // //mydht11.c // #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; #define HIGH_TIME 32 int pinNumber =1; //use gpio1 to read data uint32 databuf; uint8 readSensorData(void) { uint8 crc; uint8 i; pinMode(pinNumber,OUTPUT); // set mode to output digitalWrite(pinNumber, 0); // output a high level delay(25); digitalWrite(pinNumber, 1); // output a low level pinMode(pinNumber, INPUT); // set mode to input pullUpDnControl(pinNumber,PUD_UP); delayMicroseconds(27); if(digitalRead(pinNumber)==0) //SENSOR ANS { while(!digitalRead(pinNumber)); //wait to high for(i=0;i<32;i++) { while(digitalRead(pinNumber)); //data clock start while(!digitalRead(pinNumber)); //data start delayMicroseconds(HIGH_TIME); databuf*=2; if(digitalRead(pinNumber)==1) //1 { databuf++; } } for(i=0;i<8;i++) { while(digitalRead(pinNumber)); //data clock start while(!digitalRead(pinNumber)); //data start delayMicroseconds(HIGH_TIME); crc*=2; if(digitalRead(pinNumber)==1) //1 { crc++; } } return 1; } else { return 0; } } int main (void) { printf("Use GPIO1 to read data!\n"); if (-1 == wiringPiSetup()) { printf("Setup wiringPi failed!"); return 1; } pinMode(pinNumber, OUTPUT); // set mode to output digitalWrite(pinNumber, 1); // output a high level printf("Enter OS-------\n"); while(1) { pinMode(pinNumber,OUTPUT); // set mode to output digitalWrite(pinNumber, 1); // output a high level delay(3000); if(readSensorData()) { printf("Congratulations ! Sensor data read ok!\n"); printf("RH:%d.%d\n",(databuf>>24)&0xff,(databuf>>16)&0xff); printf("TMP:%d.%d\n",(databuf>>8)&0xff,databuf&0xff); databuf=0; } else { printf("Sorry! Sensor dosent ans!\n"); databuf=0; } } return 0; } //
4.代码编写好后,按Ctrl+X按Y进行保存,然后在编译文件
gcc -Wall -o dht11 dht11.c -lwiringPi
5.执行命令查看数据:(每隔2秒刷新一次数据)
./dht11
五:资源下载
➥ DHT11原理图及51系列测试程序 提取码:8888