【STM32】DHT11温湿度模块传感器详解&代码

简介: 【STM32】DHT11温湿度模块传感器详解&代码

一、DHT11产品介绍

DHT11是数字温湿度传感器,测量范围:湿度20%-95%,温度0-50℃,广泛应用于加湿器、温湿度计、空调、汽车等领域。


二、典型应用电路

如上图DATA引脚用于MCU与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右(超时时间的判断)。一次完整的数据传输为40bit,高位先出(MSB最高有效位有线传输)

数据传送正确时校验和数据等于:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据,所得结果的末8位。

如:

湿度:60.5% 60 05

温度:26.7℃ 26 07

60+5+26+7=98

98&0xFF=98=1001 1000


三、DHT11温湿度模块的通信过程

四、示例代码

显示室内温度和湿度

效果图:

1、DHT11初始化

void dht11_init(void)
{
  //打开端口G的硬件时钟,就是供电
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);


  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;   //9号引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  //开漏
  GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
  GPIO_Init(GPIOG,&GPIO_InitStructure);

  //只要有输出模式,肯定会有初始电平的状态,看连接设备的说明书
  PGout(9)=1;

}

2、

int32_t dht11_read(uint8_t *buf)
{
  uint32_t t=0;
  int32_t i=0,j=0;
  uint8_t d=0;
  uint8_t *p=buf;
  uint8_t check_sum=0;
  
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;   //9号引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  //开漏
  GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
  GPIO_Init(GPIOG,&GPIO_InitStructure); 
  
  PGout(9)=0;
  delay_ms(18);
  
  PGout(9)=1;
  delay_us(30);
  
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;   //9号引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN; //输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  //开漏
  GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
  GPIO_Init(GPIOG,&GPIO_InitStructure);
  
  //等待低电平出现
  t=0;
  while(PGin(9))
  {
    t++;
    delay_us(1);
    
    if(t >= 4000)
      return -1;
  }

  //用超时检测的方法测量低电平的合法性
  t=0;
  while(PGin(9)==0)
  {
    t++;
    delay_us(1);
    
    if(t >= 100)
      return -2;
  } 
  
  //用超时检测的方法测量高电平的合法性
  t=0;
  while(PGin(9))
  {
    t++;
    delay_us(1);
    
    if(t >= 100)
      return -3;
  } 
  
  for(j=0; j<5; j++)
  {
    //接收一个字节的数据
    for(d=0,i=7; i>=0; i--)
    {
      //用超时检测的方法测量低电平的合法性
      t=0;
      while(PGin(9)==0)
      {
        t++;
        delay_us(1);
        
        if(t >= 100)
          return -4;
      }

      //延时40us (延时时间在28us ~ 70us)
      delay_us(40);
      
      if(PGin(9))
      {
        d|=1<<i;  //将d变量对应的bit置1
        
        //等待高电平持续完毕
        t=0;
        while(PGin(9))
        {
          t++;
          delay_us(1);
          
          if(t >= 100)
            return -5;
        }     
      }
    } 
    p[j]=d;
  }
  
  //延时50us,可以忽略通讯结束的低电平
  delay_us(50);
  
  //计算校验和,检查接收到的数据是否准确
  check_sum = (p[0]+p[1]+p[2]+p[3])&0xFF;
  
  if(check_sum == p[4])
    return 0;
  
  return -6;
}

3、main函数实现

int main(void)
{
  uint8_t buf[5];
  int32_t rt;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  
  /* 初始化串口1波特率为115200bps,若发送/接收数据有乱码,请检查PLL */
  usart1_init(115200);
  
  dht11_init();

  printf("this is dht11 test\r\n");
  
  printf("1<<6=%X \r\n",1<<6);  
  printf("1<<3=%X \r\n",1<<3);    
  
  while(1)
  {
    rt = dht11_read(buf);
    
    if( rt == 0)
    {
      printf("T:%d.%d H:%d.%d\r\n",buf[2],buf[3],buf[0],buf[1]);
    
    }
    else
    {
      printf("dht11 read error code is %d\r\n",rt);
    }

    //官方要求,每6秒
    delay_ms(6000);
  }
}
相关文章
|
1月前
【STM32】NRF24L01模块的收发调试(三)
【STM32】NRF24L01模块的收发调试
|
1月前
【STM32】NRF24L01模块的收发调试(二)
【STM32】NRF24L01模块的收发调试
|
11天前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解独立看门狗的本质和使用步骤&代码
【STM32】详解独立看门狗的本质和使用步骤&代码
|
1月前
|
传感器
STM32循迹小车原理介绍和代码示例
STM32循迹小车原理介绍和代码示例
|
16天前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
63 2
|
1月前
|
传感器
|
16天前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
64 4
|
16天前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
18 1