查看: 1292|回复: 1

DLT-RK3288 Android — DHT11温湿度传感器驱动

[复制链接]

47

主题

49

帖子

227

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
227
发表于 2018-1-9 13:58:36 | 显示全部楼层 |阅读模式
DHT11是一个款数字温湿度传感器,DHT11已内部校准。 dht11.png

说它是数字传感器,是因为DHT11输出的是数字信号。内部集成了:测湿度电阻、NTC测温元件、单片机。
电气特性:
VCC供电电压:3V-5.5V;
测试电流:  0.5mA-2.5mA
待机电流: 100uA-150uA
平均电流:  0.2mA-0.5mA
传感器性能:
测试湿度范围:20-90%RH
测试湿度精度:±5%RH
测试温度范围:0-50℃
测试温度精度:±2℃
软件协议:
通信协议:  单总数据传输线协议
数据格式: 8bit湿度整数数据 + 8bit湿度小数数据 + 8bint温度整数数据 + 8bit温度小数数据 + 8bit校验位
采样周期间隔:不得低于1秒
读数据时序:
dht11时序.jpg
时序概要:DHT11接收到主机发送的开始信号后,一次传输40位数据·
主机发送起始信号:
                           1、主机将DATA IO 拉低并保持大于18ms,接着拉高20us ~40us。
                           2、设置IO为输出,释放总线等待DHT11应答;
DHT11发送应答信号:
                           DTH11先发送80us低电平,再发送80us高电平;
DHT11发送数据:
                          DHT11发送完应答信号后,连续发送5个字节40bit数据。高位先被发出
数据“0”: 50 微秒的低电平和 26-28 微秒的高电平;
数据“1”: 50 微秒的低电平加 70微秒的高电平;


数据发送顺序:8bit湿度整数数据 + 8bit湿度小数数据 + 8bint温度整数数据 + 8bit温度小数数据 + 8bit校验位
校验:校验和。判断 8bit湿度整数数据 + 8bit湿度小数数据 + 8bint温度整数数据 + 8bit温度小数数据)&0xff 是否等于校验数据。
代码:
发送开始信号:
  1. static int start_dht11(void)
  2. {
  3.         unsigned int loop_cnt =0;
  4.         int data_gpio = gdht11_pdata->data_gpio.io;
  5.         
  6.         //active dht11
  7.         gpio_direction_output(data_gpio,0);
  8.         mdelay(40);  //>18MS
  9.         gpio_direction_output(data_gpio,1);
  10.         udelay(40);
  11.         gpio_direction_input(data_gpio);
  12.         
  13.         //wait for dht11 ask
  14.         loop_cnt = 10;
  15.         while(gpio_get_value(data_gpio)){
  16.                 if(loop_cnt-- ==0 ){
  17.                         DHT11_DBG("%s  ERROR_NOASK 1 cnt = %d \n",__func__,loop_cnt);
  18.                         return ERROR_NOASK;
  19.                 }
  20.                 udelay(1);
  21.         }
  22.         //wait  dht11 ask low 80us finish
  23.         loop_cnt = 80;
  24.         while(!gpio_get_value(data_gpio)){
  25.                 if(loop_cnt-- ==0 ){
  26.                         DHT11_DBG("%s  ERROR_NOASK 2 cnt = %d \n",__func__,loop_cnt);
  27.                         return ERROR_NOASK;
  28.                 }
  29.                 udelay(1);
  30.         }        
  31.         //wait  dht11 ask hight 80us finish
  32.         loop_cnt = 80;
  33.         while(gpio_get_value(data_gpio)){
  34.                 if(loop_cnt-- ==0 ){
  35.                         DHT11_DBG("%s  ERROR_NOASK 3 cnt = %d \n",__func__,loop_cnt);
  36.                         return ERROR_NOASK;
  37.                 }
  38.                 udelay(1);
  39.         }
  40.         return 0;
  41. }
复制代码
读取数据:
  1. //温湿度传感
  2. static int  read_dht_data(void)    // 温湿写入
  3. {     
  4.         int i,j;   
  5.         unsigned int loop_cnt =0;
  6.         int data_gpio = gdht11_pdata->data_gpio.io;
  7.         
  8.         for(j = 0;j <5;j++){
  9.                 dht11_data[j]  = 0;
  10.                 for(i = 7;i >= 0;i--)   
  11.                 {
  12.                 // dht11 send 50us low
  13.                         loop_cnt = 52;
  14.                         while(!gpio_get_value(data_gpio)){
  15.                                 if(loop_cnt-- ==0 ){
  16.                                         DHT11_DBG("%s  ERROR_TIMEOUT 1 i = %d  j = %d\n",__func__,i,j);
  17.                                         return ERROR_TIMEOUT;
  18.                                 }
  19.                                 udelay(1);
  20.                         }
  21.                 // dht11 send 26us~ 28us hight for "0", send 70us hight for "1"
  22.                         loop_cnt =80;
  23.                         while(gpio_get_value(data_gpio)){
  24.                                 if(loop_cnt-- ==0 ){
  25.                                         DHT11_DBG("%s  ERROR_TIMEOUT 2 i = %d  j = %d\n",__func__,i,j);
  26.                                         return ERROR_TIMEOUT;
  27.                                 }
  28.                                 udelay(1);
  29.                         }
  30.                         if((80- loop_cnt) >  28 ){ // 1
  31.                                 dht11_data[j]  |= (1<<i);
  32.                         }
  33.                 }
  34.         }
  35.         return 0;
  36. }
复制代码
校验:
  1. static int  DHT11(void)   //温湿传感启动
  2. {
  3.         unsigned int check = 0;
  4.         int ret = -1;
  5.         unsigned long flags = 0;
  6.         ret = start_dht11();
  7.         if(ret < 0)
  8.                 goto dht_error;
  9.         
  10.             ret = read_dht_data();        //接收温湿度数据
  11.             if(ret < 0)
  12.                 goto dht_error;
  13.                         
  14.         check =         (dht11_data[0] + dht11_data[1] + dht11_data[2] +dht11_data[3])&0xff;
  15.        if(dht11_data[4] != check){        //校验温湿度数据的总和的末8位数据
  16.                 DHT11_DBG("ERROR_CHECKSUM s: %x.%x,   t: %x.%x,     %x\n",dht11_data[0],dht11_data[1],dht11_data[2],dht11_data[3],dht11_data[4]);
  17.                       ret = ERROR_CHECKSUM;
  18.                 goto dht_error;
  19.         }
  20.         DHT11_DBG("s: %d.%d,   t: %d.%d\n",dht11_data[0],dht11_data[1],dht11_data[2],dht11_data[3]);
  21.         udelay(50);
  22.         return 0;        //接收完并且数据校验成功,则返回0
  23.         
  24. dht_error:
  25.         mdelay(4);
  26.         DHT11_DBG("%s error ret = %d\n",__func__,ret);
  27.         return ret;
  28. }
复制代码
测试结果:
DHT11结果.png
源码文件:
dht11.c (9.29 KB, 下载次数: 1)
回复

使用道具 举报

0

主题

23

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2018-8-23 21:33:07 | 显示全部楼层
HEN HAO DE ZILIAO
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表