STM32 温湿度传感器DHT11

1.参数
工作电压范围:3.3V-5.5V
工作电流 :平均0.5mA
输出:单总线数字信号
测量范围:湿度20-90%RH,温度0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度1%,温度1℃

在这里插入图片描述
2.性能特点
DHT11数字湿温度传感器采用单总线数据格式。单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

其中校验和数据为前四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。
3.时序逻辑
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从DHT11读到的数据如图所示:
在这里插入图片描述
由以上数据就可得到湿度和温度的值,计算方法:
湿度= byte4 . byte3=45.0 (%RH)
温度= byte2 . byte1=28.0 ( ℃)
校验= byte4+ byte3+ byte2+ byte1=73(校验正确)

4.数据发送流程
在这里插入图片描述
首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20-40us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(40-50us)时间后,开始输出数据。

DHT11输出数字‘0’的时序如图
在这里插入图片描述
DHT11输出数字‘1’的时序如图
在这里插入图片描述
5.代码讲解

//IO方向设置
#define DHT11_IO_IN()  {GPIOB->MODER&=~(3<<(12*2));GPIOB->MODER|=0<<(12*2);}	//PB12输入模式
#define DHT11_IO_OUT() {GPIOB->MODER&=~(3<<(12*2));GPIOB->MODER|=1<<(12*2);} 	//PB12输出模式
 
IO操作函数					
#define	DHT11_DQ_OUT(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET):  \
                                         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET)) //数据端口PB12
#define	DHT11_DQ_IN     HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12) //数据端口	PB12

代码解析:复位
在这里插入图片描述

//复位DHT11
void DHT11_Rst(void)	   
{                 
    DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    delay_ms(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
    delay_us(30);     	//主机拉高20~40us
}

等待回应
在这里插入图片描述

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
   u8 retry=0;
  DHT11_IO_IN();//SET INPUT	 
   while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
  {
    retry++;   delay_us(1);
  };	 
  if(retry>=100)return 1;
  else retry=0;
   while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  {
       retry++;  delay_us(1);
  };
  if(retry>=100)return 1;	    
  return 0;
}

读数据一个bit
在这里插入图片描述

//从DHT11读取一个位   返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
      u8 retry=0;
      while(DHT11_DQ_IN&&retry<100)//等待变为低电平
      {
             retry++;   
             delay_us(1);
       }
      retry=0;
      while(!DHT11_DQ_IN&&retry<100)//等待变高电平
       {
              retry++;	
              delay_us(1);
         }
         delay_us(40);//等待40us
         if(DHT11_DQ_IN)return 1;
         else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
   for (i=0;i<8;i++) 
  {
      dat<<=1; 
     dat|=DHT11_Read_Bit();
    }				    
    return dat;
}

解析温度和湿度值

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)     humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
    u8 buf[5];
   u8 i;
    DHT11_Rst();
   if(DHT11_Check()==0)
   {
          for(i=0;i<5;i++)//读取40位数据
    {
          buf[i]=DHT11_Read_Byte();
   }
    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
   {
        *humi=buf[0];
       *temp=buf[2];
   }
 }else return 1;
  return 0;	    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值