请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】DHT11温湿度传感器——基于STM32f1

[复制链接]
STMCU小助手 发布时间:2022-5-14 21:00
前言
今天主要讲到DHT11温湿度传感器的应用,该传感器适用于多个场景,用途比较广泛,主要用来测量温度和湿度,其实对于单纯测量温度我们可以直接采用dsb18b20温度传感器,但是注意引脚接法,之前我不注意接反了,结果烧的······一碰手都直接起泡哈哈,好了,废话不讲,进入主题

一、DHT11温湿度传感器
DHT11传感器有四个接口,即VCC、GND、DATA、NC,那么首先要怎么接呢?其实这里面我们主要的就是接DATA这个口就行了,VCC、GND就不用多说了,NC端不接,悬空NC端即可,正常模块也是只有3个引脚引出来,所以只需要设定一个端口来与DATA互联就可以了

B(YH$LEE]2Z_0P{LB6GMVSR.png

我们发现实际上也就是如我上面所说的,它的四个引脚只需要利用三个就行了,而且该模块还有一块电源指示灯,当工作时会亮起。下面为原理图:

8%I]GF@I9)_@LG@40J2O]$X.png

那么在这里DATA只要随意连上STM32上一端口(下面我用到了PA11),设置为推挽输出即可,就可以实现数据互联。

KBIWLAD[0SQ81@B@ED9_4_N.png
下面这里主要是对输出的流程的讲解,实际上如果看不懂也没事,后面可以通过代码加深对这几段话的理解

K~)U5~2H$~ELP`6{]$AT4`P.png

二、实现测量主程序
DHT11函数(wenshi.c)

  1. #include "delay.h"
  2. #include "wenshi.h"

  3. #define DT GPIO_Pin_11

  4. //复位DHT11
  5. void DHT11_Rst(void)           
  6. {                 
  7.         DHT11_IO_OUT();         //SET OUTPUT
  8.         DHT11_DQ_OUT=0;         //拉低
  9.         delay_ms(20);            //拉低延时至少18ms
  10.         DHT11_DQ_OUT=1;         //DQ=1,拉高
  11.         delay_us(30);             //拉高延时至少20~40us
  12. }

  13. //检测回应
  14. //返回1:检测错误
  15. //返回0:检测成功
  16. u8 DHT11_Check(void)            
  17. {   
  18.         u8 retry=0;
  19.         DHT11_IO_IN();//SET INPUT         
  20.     while (DHT11_DQ_IN&&retry<100)//DHT11拉低40~80us
  21.         {
  22.                 retry++;
  23.                 delay_us(1);
  24.         };         
  25.         if(retry>=100)return 1;
  26.         else retry=0;
  27.     while (!DHT11_DQ_IN&&retry<100)//DHT11再次拉高40~80us
  28.         {
  29.                 retry++;
  30.                 delay_us(1);
  31.         };
  32.         if(retry>=100)return 1;            
  33.         return 0;
  34. }

  35. //读取一个位Bit
  36. //返回1或0
  37. u8 DHT11_Read_Bit(void)                          
  38. {
  39.          u8 retry=0;
  40.         while(DHT11_DQ_IN&&retry<100)//等待变低电平
  41.         {
  42.                 retry++;
  43.                 delay_us(1);
  44.         }
  45.         retry=0;
  46.         while(!DHT11_DQ_IN&&retry<100)//等待变高电平
  47.         {
  48.                 retry++;
  49.                 delay_us(1);
  50.         }
  51.         delay_us(40);//等待40us
  52.         if(DHT11_DQ_IN)return 1;
  53.         else return 0;                  
  54. }

  55. //读取一个字节
  56. //返回读到的数据
  57. u8 DHT11_Read_Byte(void)   
  58. {        
  59.         u8 i,dat;
  60.         dat=0;
  61.         for (i=0;i<8;i++)
  62.         {
  63.                 dat<<=1;
  64.                 dat|=DHT11_Read_Bit();
  65.         }                                                   
  66.         return dat;
  67. }

  68. //DHT11读取一次数据
  69. //temp:温度(范围:0~50°)
  70. //humi:湿度(范围:20%~90%)
  71. //tem:温度小数位
  72. //hum:湿度小数位
  73. u8 DHT11_Read_Data(u8 *temp,u8 *humi,u8 *tem,u8 *hum)   
  74. {        
  75.          u8 buf[5];
  76.         u8 i;
  77.         DHT11_Rst();
  78.         if(DHT11_Check()==0)
  79.         {
  80.                 for(i=0;i<5;i++)//读取40位字节
  81.                 {
  82.                         buf<i>=DHT11_Read_Byte();
  83.                 }
  84.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  85.                 {
  86.                         *humi=buf[0];
  87.                         *hum=buf[1];
  88.                         *temp=buf[2];
  89.                         *tem=buf[3];
  90.                 }
  91.         }
  92.         else return 1;
  93.         return 0;            
  94. }

  95. //初始化DHT11,同时检测是否连接上DHT11,PA11初始化
  96.          
  97. u8 DHT11_Init(void)
  98. {         
  99.          GPIO_InitTypeDef  GPIO_InitStructure;        
  100.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
  101.          GPIO_InitStructure.GPIO_Pin = DT;                                 //PA11
  102.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  103.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104.          GPIO_Init(GPIOA, &GPIO_InitStructure);                        
  105.          GPIO_SetBits(GPIOA,DT);                                                
  106.                            
  107.         DHT11_Rst();  
  108.         return DHT11_Check();
  109. }</i>
复制代码


主函数(main.c)

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"
  7. #include "wenshi.h"

  8. u8 temp;
  9. u8 humi;
  10. u8 tem;
  11. u8 hum;


  12. int main(void)
  13. {         

  14.         delay_init();                              
  15.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         
  16.         uart_init(115200);                 
  17.          LED_Init();                             //LED初始化
  18.         LCD_Init();              //LCD初始化
  19.         POINT_COLOR=RED;         
  20.         while(DHT11_Init())
  21.         {
  22.                 printf("DHT11 Error \r\n");
  23.                 LCD_ShowString(20,20,210,16,16,"DHT11 Error");
  24.                 delay_ms(1000);
  25.         }
  26.         
  27.   while (1)
  28.   {
  29.                 DHT11_Read_Data(&temp,&humi,&tem,&hum);//取地址

  30.                 LCD_ShowString(20,40,210,16,16,"temp:"); //分别显示所要显示的温度、湿度
  31.                 LCD_ShowString(20,70,200,16,16,"humi:");
  32.                 LCD_ShowString(90,40,110,8,16,".");
  33.                 LCD_ShowString(90,70,100,8,16,".");
  34.                 LCD_ShowNum(70,40,temp,2,16);
  35.                 LCD_ShowNum(70,70,humi,2,16);
  36.                 LCD_ShowNum(95,40,tem,2,16);
  37.                 LCD_ShowNum(95,70,hum,2,16);
  38.                 LED0=!LED0;
  39.                 delay_ms(1000);
  40.   }
  41. }<i style="background-color: rgb(255, 255, 255);">        </i>
复制代码

LCD的代码就不列出来了,主要函数以及注释基本上已经到位了,希望对大家有所帮助!

三、测试结果

下图 为测试结果:

%~)RIQAOPS%TD5`P]T[S$AD.png

四、总结
写到这里就接近尾声了,老规矩肯定不能忘哈哈,于晏老哥的话后面依旧续上,那么这里总结就再啰里啰嗦几句吧,DHT11是一款比较入门级且又十分耐用的温湿度检测模块,咱们要用到基本上学习期间也是在单片机上的运用学习



收藏 评论0 发布时间:2022-5-14 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版