DHT11温湿度传感器

发布时间:2023年12月24日

产品概述

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通
空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制

特点

  • 相对湿度和温度测量
  • 全部校准,数字输出
  • 长期稳定性
  • 超长的信号传输距离:20
  • 超低能耗:休眠
  • 4 引脚安装:可以买封装好的
  • 完全互换 : 直接出结果,不用转化

?数据传送逻辑

只有一根数据线 DATA ,上官一号发送序列指令给 DHT11 模块,模块一次完整的数据传输为 40bit, 高位先出

数据格式

8bit 湿度整数数据 +8bit 湿度小数数据 +8bi 温度整数数据 +8bit 温度小数数据 +8bit 校验和

通讯过程时序图

?

检测模块是否存在

根据如下时序图,做通信初始化,并检测模块是否存在,功能是否正常

?

时序逻辑分析
a : dht = 1
b dht = 0
延时 30ms
c dht = 1
60us 后读 d 点,如果 d 点是低电平(被模块拉低),说明模块存在!

DHT11传输0的时序分析

?

DHT11传输1的时序分析

?

代码实现

#define DHT_HIGHT HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)
uint8_t datas[5];
void delay_us(uint16_t cnt)
{
    uint8_t i;
    while(cnt)
    {
        for (i = 0; i < 10; i++)
        {
        }
        cnt--;
    }
}
void DHT_GPIO_Init(uint32_t Mode)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = Mode;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_Start(void)
{
    DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);
    DHT_HIGHT;
    DHT_LOW;
    HAL_Delay(30);
    DHT_HIGHT;
    DHT_GPIO_Init(GPIO_MODE_INPUT);
    while(DHT_VALUE);
    while(!DHT_VALUE);
    while(DHT_VALUE);
}
void Read_Data_From_DHT()
{
    int i;//轮
    int j;//每一轮读多少次
    char tmp;
    char flag;
    DHT11_Start();
    DHT_GPIO_Init(GPIO_MODE_INPUT);
    for(i= 0;i < 5;i++){
        for(j=0;j<8;j++){
            while(!DHT_VALUE);//等待卡g点
            delay_us(40);
            if(DHT_VALUE == 1){
                flag = 1;
                while(DHT_VALUE);
            }else{
                flag = 0;
            }
        tmp = tmp << 1;
        tmp |= flag;
        }
        datas[i] = tmp;
    }
}
int fputc(int ch, FILE *f)
{
    unsigned char temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,0xffff);
    return ch;
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
    printf("hello world\r\n");
    HAL_Delay(2000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//DHT_Get_Temp_Humi_Data(datas);
    Read_Data_From_DHT();
    printf("Temp: %d.%d ", datas[2], datas[3]);
    printf("Humi: %d.%d\r\n", datas[0], datas[1]);
    HAL_Delay(2000);
}
/* USER CODE END 3 */
}

文章来源:https://blog.csdn.net/qq_61391875/article/details/135181269
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。