南飓风 发表于 2024-11-4 04:51:55

DHT11温湿度传感模块

笔墨信息来源
温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司 (aosong.com)
1.DHT11简介     

概述:DHT11是广州奥松有限公司生产的一款湿温度一体化的数字传感器。 该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位 单片机相连接。通过单片机等微处理惩罚器简单的电路连接就能够实时的收罗本地湿 度和温度。DHT11 与单片机之间能采用简单的单总线进行通讯,仅仅必要一个 I/O 口。传感器内部湿度和温度数据40Bit 的数据一次性传给单片机,数据采用 校验和方式进行校验,有效的包管数据传输的准确性。DHT11功耗很低,5V电 源电压下,工作平均最大电流0.5mA。
性能指标和特性如下:


[*]工作电压范围:3.5V-5.5V
[*]工作电流 :平均0.5mA
[*]湿度丈量范围:20-90%RH
[*]温度丈量范围:0-50℃
[*]湿度分辨率 :1%RH 8位
[*]温度分辨率 :1℃ 8 位
[*]采样周期 :1S
[*]单总线结构
[*]与TTL兼容(5V)
管脚分列如下:
https://i-blog.csdnimg.cn/direct/526a136a419049c7b950f18255356f7f.png

2.应用电路连接说明

        DHT11数字湿温度传感器连接方法极为简单。第一脚接电源正,第四脚接电源地端。 数据端为第二脚。可直接接主机(单片机)的I/O口。为进步稳固性,建议在数据端和电源 正之间接一只4.7K的上拉电阻。第三脚为空脚,此管脚悬空不用。

3.DHT11数据结构

         DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输 入输出双向传输。其数据包由5Byte(40Bit)构成。数据分小数部分和整数部分,具 体格式在下面说明。
https://i-blog.csdnimg.cn/direct/5f2bef921bc44567937032af64e8f02f.png
4.DHT11的传输时序

4.1 DHT11 开始发送数据流程

https://i-blog.csdnimg.cn/direct/fb7ed106c5564e08b60a97410610e365.png

4.2 主机复位信号和DHT11响应信号

https://i-blog.csdnimg.cn/direct/988c2b325f2c44b785304b792943ea77.png
4.3 数字‘0’信号表现方法

https://i-blog.csdnimg.cn/direct/171fca84021c4f559761f0cf98b44060.png
4.4 数字‘1’信号表现方法

https://i-blog.csdnimg.cn/direct/9b0a7a4a679a44cea2909d9c1ddfa693.png
5.原理图

https://i-blog.csdnimg.cn/direct/8f72a4a4d70241f3818152218645d95a.png
6.代码

DHT22.c

#include "stm32f10x.h"                  // Device header
#include "DHT22.h"
#include "Delay.h"


//DHT22引脚输出模式
void DHT22_GPIO_OUT(void)
{
        GPIO_InitTypeDefGPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = DHP_GPIO_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DHP_GPIO_PORT, &GPIO_InitStructure);
}

//DHT22引脚输入模式
void DHT22_GPIO_IN(void)
{
        GPIO_InitTypeDefGPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = DHP_GPIO_Pin;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DHP_GPIO_PORT, &GPIO_InitStructure);
}


//写引脚的高低电平
void DHT22_W_SCL(uint8_t BitValue)
{
       GPIO_WriteBit(DHP_GPIO_PORT, DHP_GPIO_Pin, (BitAction)BitValue);
}

//读引脚电平
uint8_t DHT22_R_SCL(void)
{
       return GPIO_ReadInputDataBit(DHP_GPIO_PORT, DHP_GPIO_Pin);
}

//复位DHT22
void DHT22_Rst(void)
{
        DHT22_GPIO_OUT();         //SET OUTPUT
        DHT22_W_SCL(0);
        Delay_ms(20);                //主机拉低至少18ms
        DHT22_W_SCL(1);
        Delay_us(30);                //主机拉高20~40us                                  
}

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

//初始化DHT22 同时检测是否存在
//返回1:不存在
//返回0:存在
uint8_t DHT22_Init(void)
{
        RCC_APB2PeriphClockCmd(DHP_GPIO_CLK, ENABLE);    //使能外设时钟
       
        DHT22_GPIO_OUT();
       
        GPIO_SetBits(DHP_GPIO_PORT, DHP_GPIO_Pin);       //默认引脚高电平
       
        DHT22_Rst();        //复位DHT22
        returnDHT22_Check();//等待DHT11的回应
}

//从DHT22读取一个wei
//返回值:1/0
uint8_t DHT22_ReadBit(void)
{
        uint8_t retry = 0;
        while (DHT22_R_SCL() && retry < 100)   //等待变为低电平
        {
                retry ++;
                Delay_us(1);
        }
        retry =0;
        while (!DHT22_R_SCL() && retry < 100)   //等待变高电平
        {
                retry ++;
                Delay_us(1);
        }
        Delay_us(40); //等待40us
        if (DHT22_R_SCL()) return 1;
        else return 0;
}


//读取一个字节
uint8_t DHT22_ReadByte(void)
{
        uint8_t i, data;
        data = 0;
        for (i = 0; i < 8; i++){
                data <<= 1;
                data |= DHT22_ReadBit();
        }
        return data;
}

//读取数据
//1 成功,0失败
uint8_t DHT22_ReadData(float *Temp, float *Humi)
{
        uint8_t buf;
        uint8_t i;
        DHT22_Rst();
        if(!DHT22_Check())      //DHT22存在
        {
               for (i = 0; i < 5; i ++)
                {
                       buf = DHT22_ReadByte();
                }
                if(buf + buf + buf + buf == buf)
                {
                        *Humi = buf + buf / 10.0;
                        *Temp = buf + buf / 10.0;                       
                }
        }
        else return 0;
        return 1;
}

DHT22.h

#ifndef __DHT22_H_
#define __DHT22_H_



//DHT引脚宏定义
#define DHP_GPIO_Pin                GPIO_Pin_3
#define DHP_GPIO_PORT                GPIOA
#define DHP_GPIO_CLK                RCC_APB2Periph_GPIOA


uint8_t DHT22_Init(void);
uint8_t DHT22_ReadData(float *Temp, float *Humi);

#endif
main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "LED.h"
#include "DHT22.h"

uint8_t flag;
float Temp, Humi;

int main(void)
{
        OLED_Init();
        LED_Init();
        while (DHT22_Init())
        {
               OLED_Printf(0, 32, OLED_8X16, "DHT11 Error \r\n");
        }
       
       
        OLED_ShowString(0, 0, "Temp:      C", OLED_8X16);
        OLED_ShowString(0, 16, "Humi:      %", OLED_8X16);

       
        OLED_Update();
       
        while(1)
        {
                DHT22_ReadData(&Temp, &Humi);
//                OLED_ShowNum(0, 32, flag, 2, OLED_8X16);

                OLED_ShowFloatNum(40, 0, Temp, 2, 1, OLED_8X16);
                OLED_ShowFloatNum(40, 16, Humi, 2, 1, OLED_8X16);
                OLED_Update();

        }
}
oled模块代码为江科大oled部分代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: DHT11温湿度传感模块