• STM32——DHT11温湿度传感器


    一、DHT11介绍

    1、DHT11技术性能特征

    工作电压范围:3.3V~5.5V

    工作电流:平均0.5mA

    输出:单总线数字信号

    测量范围:湿度20~90%RH,温度0~50°C

    精度:湿度±5%,温度±2°C

    分辨率:湿度±1%,温度±1°C

    DHT11数字湿度传感器采用单总线数据格式。单个数据引脚端口完成输入输出双向传输。其中数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

    DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从DHT11读到的数据如图所示:

    由以上数据就可得到湿度和温度的值,计算方法:

    湿度=byte4.byte3=45.0(%RH)

    温度=byte2.byte1=28.0(°C)

    校验=byte4+byte3+byte2+byte1=73(校验正确)

    二、数据发送流程

    首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。

    DHT11输出数字‘0’的时序如图:

     

    DHT11输出数字‘1’的时序如图:

     

    硬件连接:

     

    信号线:PG9

    1. //IO方向设置
    2. #define DHT11_IO_IN() {GPIOG->MODER&=~(3<<(9*2)); GPIOG->MODER|=0<<9*2;} //PG9输入模
    3. #define DHT11_IN_OUT() {GPIOG->MODER&~=(3<<(9*2)); GPIOG->MODER|=0<<9*2;} //PG9输出模
    4. //IO操作
    5. #define DHT11_DQ_OUT PGout(9);//数据端口 PG9
    6. #define DHT11_DQ_IN PGin(9);//数据端口 PG9

    三、代码解析

    复位:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间

     

    1. //复位DHT11
    2. void DHT11_Rst(void)
    3. {
    4. DHT11_IO_OUT();//SET OUTPUT
    5. DHT11_DQ_OUT=0;//拉低DQ
    6. delay-ms(20);//拉低至少18ms
    7. DHT11_DQ_OUT=1;
    8. delay_us(30);//主机拉高20~40us
    9. }

    等待回应:

    1. //等待DHT11的回应
    2. //返回1:未检测到DHT11的存在
    3. //返回0:存在
    4. u8 DHT11_Check(void)
    5. {
    6. u8 retry=0;
    7. DHT11_IO_IN();
    8. while(DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
    9. {
    10. retry++;
    11. delay_us(1);
    12. }
    13. if(retry>=100) return 1;
    14. else retry=0;
    15. while(!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
    16. {
    17. retry++;
    18. delay_us(1);
    19. }
    20. if(retry>=100) return 1;
    21. return 0;
    22. }

    读数据一个bit:

    1. 从DHT11读取一个位,返回值:1/0
    2. u8 DHT11_Read_bit(void)
    3. {
    4. u8 retry=0;
    5. while(DHT11_DQ_IN&&retry<100)//等待变为低电平
    6. {
    7. retry++;
    8. delay_us(1);
    9. }
    10. retry=0;
    11. while(!DHT11_DQ_IN&&retry<100)//等待变为高电平
    12. {
    13. retry++;
    14. delay_us(1);
    15. }
    16. delay_us(40);//等待40us
    17. if(DHT11_DQ_IN) return 1;
    18. else return 0;
    19. }

    读数据(一个字节):

    1. //从DHT11读取一个字节
    2. //返回值:读到的数据
    3. u8 DHT11_Read_Byte(void)
    4. {
    5. u8 i,dat;
    6. dat=0;
    7. for(i=0;i<8;i++)
    8. {
    9. dat<<=1;
    10. dat|=DHT11_Read_Bit();
    11. }
    12. return dat;
    13. }

    解析湿度和温度值:

    1. //从DHT11读取一次数据
    2. //temp:温度值(范围0~50°C)
    3. //humi:湿度值(范围20%~90%)
    4. //返回值:0正常 1:读取失败
    5. u8 DHT11_Read_Data(u8 *temp,u8 *humi)
    6. {
    7. u8 buf[5];
    8. u8 i;
    9. DHT11_Rst();
    10. if(DHT11_Check()==0)
    11. {
    12. for(i=0;i<5;i++)//
    13. {
    14. buf[i]=DHT11_Read_Byte();
    15. }
    16. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    17. {
    18. *humi=buf[0];
    19. *temp=buf[2];
    20. }
    21. }else return 1;
    22. return 0;
    23. }

    u8 DHT11_Init(void);//初始化DHT11

    u8 DHT11_Read_Data(u8 *temp,u8 *hmi);//读取温湿度

    u8 DHT11_Read_Byte(void);//读出一个字节

    u8 DHT11_Read_Bit(void);//读出一个位

    u8 DHT11_Check(void);//检测是否存在DHT11

    void DHT11_Rst(void);//复位DHT11

    关于串口初始化的配置:

    1. u8 DHT11_Init(void)
    2. {
    3. GPIO_INitTypeDef GPIO_InitABC;
    4. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//使能GPIO时钟
    5. GPIO_InitABC.GPIO_Pin=GPIO_Pin_9;
    6. GPIO_InitABC.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
    7. GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽输出
    8. GPIO_InitABC.GPIO_Speed=GPIO_Speed_50MHz;//50MHz
    9. GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
    10. GPO_Init(GPIOG,&GPIO_InitABC);//初始化
    11. DHT11_Rst();
    12. return DHT11_Check();
    13. }

  • 相关阅读:
    一文教你普罗米修斯Prometheus的基础应用
    【kafka源码】TopicCommand之alter源码解析(分区扩容)
    [信息系统项目管理师-2023备考]信息化与信息系统(二)
    关于工信部发布的app备案以及小程序备案流程
    解决sass问题:npm ERR! node-sass@9.0.0 postinstall: `node scripts/build.js`
    学习6大步
    Go实战学习笔记-1.3流程控制
    MySQL-运维篇 初识
    Python新手入门必须学会的技巧:pycharm中配置Python解释器(2022最新)
    邱锡鹏神经网络怎么样,邱锡鹏神经网络答案
  • 原文地址:https://blog.csdn.net/weixin_62584795/article/details/126897942