前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DHT温湿度传感器的基本探究

DHT温湿度传感器的基本探究

作者头像
bigmagic
发布2020-03-17 14:42:09
1.2K0
发布2020-03-17 14:42:09
举报
文章被收录于专栏:嵌入式iot嵌入式iot

作为物联网IOT的Things,温湿度传感器也是一个重要的研究对象。本文以DHT11为主要的研究对象,通过对该传感器的研究,分析一下具体的使用方法。

1. 说明

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器

采集范围:温度0-50°±2°,湿度:20-90%RH。

供电电压:5V。

外观如下图所示:

2. 工作原理

对于DHT11传感器的工作原理,首先需要从典型的应用电路说起

数字温湿度传感器采用单数据格式,单个数据引脚完成输入输出单向传输。

2.1 工作时序

由于DHT11需要与主控进行通信,所以必须要涉及到通信时序。也就是约定好通信规则。那么对于DHT11温湿度传感器的通信时序又是怎样的呢?

该传感器通信是通过奥松电子有限公司开发的单总线协议和主控进行数据通信。可以分为以下四个步骤

(1)主机发起开始信号

(2)主机等待接收DHT11响应信号

(3)主机连续接收40Bit数据和校验和

(4)主机进行数据处理

从上图可以看到,当主机首先需要将DATA线上的信号拉低至少18ms,以保证DHT能够正常检测到起始信号,当主机拉高20-40us后,主机起始信号结束。此时,主机引脚作为输入,检测传感器输出过来的数据。

传感器也需要回应数据,首先将DATA线上的信号拉低40-50us,然后再拉高40-50us。主控接收到准备信号后,再开始接收数据。

数据”0“的表示

数据“0”,首先DHT把总线拉低12-14us然后拉高,高电平保持在26-28us这个范围。表示“0”。

数据“1”的表示

数字“1”,首先DHT把总线拉低12-14us然后拉高,高电平保持在116-118us这个范围。表示“1”。

2.2 数据格式

DHT单向数据传输的数据量大小为5Byte(40bit)。一次通信时长约为3ms。

湿度整数

湿度小数

温度整数

温度小数

校验和(数据相加)

8bit

8bit

8bit

8bit

8bit

数据处理

传感器的数据从高位到低位传输

那么从上述的数据可以得到计算公式如下

3. 代码实现

因为采用STM32的主控作为测试,所以需要选定特定的引脚做输入输出。这里可以采用位带操作的方式。

3.1 DHT初始化

初始化其实就是配置GPIO引脚功能的作用

可以将引脚先配置为输出即可。

3.2 向DHT1发出起始信号
代码语言:javascript
复制
void DHT11_Rst(void)       
{                 
    DHT11_IO_OUT();                                             //SET OUTPUT
      DHT11_DQ_OUT=;                                             //GPIOA.0=0
      Delay_ms();                                               //Pull down Least 18ms
      DHT11_DQ_OUT=;                                             //GPIOA.0=1 
    Delay_us();                                               //Pull up 20~40us
}
3.3 读1 bit的数据
代码语言:javascript
复制
u8 DHT11_Read_Bit(void)              
{
     u8 retry=;
    while(DHT11_DQ_IN&&retry<)                   //wait become Low level
    {
        retry++;
        Delay_us();
    }

    retry=;
    while(!DHT11_DQ_IN&&retry<)                  //wait become High level
    {
        retry++;
        Delay_us();
    }

    Delay_us();//wait 40us

    if(DHT11_DQ_IN)
        return ;
    else 
    return ;          
}
3.4 读一个字节的数据
代码语言:javascript
复制
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=;
    for (i=;i<;i++) 
    {
           dat<<=; 
        dat|=DHT11_Read_Bit();
    }                            

    return dat;
}
3.4 读温湿度数据
代码语言:javascript
复制
u8 DHT11_Read_Data(u8 *temperature,u8 *humidity)    
{        
     u8 buf[];
    u8 i;
    DHT11_Rst();
    if(DHT11_Check()==)
    {
        for(i=;i<;i++)
        {
            buf[i]=DHT11_Read_Byte();
        }
        if((buf[]+buf[]+buf[]+buf[])==buf[])
        {
            *humidity=buf[];
            *temperature=buf[];
        }
    }
    else 
        return ;

    return ;       
}

4.效果演示

我在main函数中通过每1ms采集一次数据通过串口打印出来,在串口调试助手上可以看到温湿度的信息。

上述演示中,并未取小数部分数据。

5.调试心得

在调试过程中也遇到一些问题,特别的留意一下。

(1)配置gpio时,不要忘记开启相应的时钟,否则不起作用。

(2)对于有引脚复用的模式,比如JTAG,需要先禁止掉JTAG模式接口

代码语言:javascript
复制
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 
// 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP) 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); 
// 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能 

(3)DHT的数据引脚,主控这边输出的时候,就配置成推挽输出模式,当配置为输入的时候,就配置成上拉输入模式。

(4)准守下面的原则基本不会出错

1.复位的时候,主机向程序发送数据,也就是MCU会发送一定的指令到dht11上

2.检测状态,这里就是从机的应答状态,这里的应答状态会直接看出是否该引脚有效

3.数据的读出

4.Bit位的组合状态

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 说明
  • 2. 工作原理
    • 2.1 工作时序
      • 数据”0“的表示
      • 数据“1”的表示
    • 2.2 数据格式
      • 数据处理
  • 3. 代码实现
    • 3.1 DHT初始化
      • 3.2 向DHT1发出起始信号
        • 3.3 读1 bit的数据
          • 3.4 读一个字节的数据
            • 3.4 读温湿度数据
            • 4.效果演示
            • 5.调试心得
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档