问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32读取DHT11温湿度传感器数据的完整指南

创作时间:
作者:
@小白创作中心

STM32读取DHT11温湿度传感器数据的完整指南

引用
CSDN
1.
https://blog.csdn.net/weixin_42854045/article/details/141497679

本文将详细介绍如何使用STM32微控制器读取DHT11温湿度传感器的数据。内容包括硬件配置、驱动代码以及主程序的实现,适合从事嵌入式系统开发的技术人员参考。

一、硬件配置

在开始编程之前,需要正确配置STM32的GPIO引脚和定时器。以下是具体的配置步骤:



二、软件实现

1. 延时函数

使用TIM3定时器实现微秒级延时:

void Delay_us(uint16_t delay)
{
    __HAL_TIM_DISABLE(&htim3);
    __HAL_TIM_SET_COUNTER(&htim3,0);
    __HAL_TIM_ENABLE(&htim3);
    uint16_t curCnt=0;
    while(1)
    {
        curCnt=__HAL_TIM_GET_COUNTER(&htim3);
        if(curCnt>=delay)
            break;
    }
    __HAL_TIM_DISABLE(&htim3);
}

2. DHT11引脚控制

定义输出和输入模式:

void Dht11_DATA_OUT(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void Dht11_DATA_IN(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

3. DHT11驱动函数

实现复位、状态检查、数据读取等功能:

void DHT11_Rst(void)
{
    Dht11_DATA_OUT();
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_Delay(20);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    Delay_us(30);
}

uint8_t DHT11_Check(void)
{
    uint8_t retry=0;
    Dht11_DATA_IN();
    while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100)
    {
        retry++;
        Delay_us(1);
    }
    if(retry>=100)
        return 1;
    else
        retry=0;
    while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100)
    {
        retry++;
        Delay_us(1);
    }
    if(retry>=100)
        return 1;
    return 0;
}

uint8_t DHT11_Read_Bit(void)
{
    uint8_t retry=0;
    while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100)
    {
        retry++;
        Delay_us(1);
    }
    retry=0;
    while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) && retry<100)
    {
        retry++;
        Delay_us(1);
    }
    Delay_us(40);
    if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12))
        return 1;
    else
        return 0;
}

uint8_t DHT11_Read_Byte(void)
{
    uint8_t dat=0;
    for(uint8_t i=0;i<8;i++)
    {
        dat <<= 1;
        dat |= DHT11_Read_Bit();
    }
    return dat;
}

uint8_t DHT11_Read_Data(uint8_t* humi,uint8_t* temp)
{
    uint8_t buf[5];
    DHT11_Rst();
    if(DHT11_Check() == 0)
    {
        for(uint8_t i=0;i<5;i++)
            buf[i]=DHT11_Read_Byte();
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
        {
            *humi=buf[0];
            *temp=buf[2];
        }
    }
    else
        return 1;
    return 0;
}

4. 主程序

main.c中实现数据读取和显示:

#include <stdio.h>
#include <string.h>
#include "dht11.h"

uint8_t temperature = 1;
uint8_t humidity = 1;
char* CntState = "No Connect!\r\n";
uint8_t aTxBuffer[50];

int main()
{
    DHT11_Rst();
    while(DHT11_Check())
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);
        CntState = "Fail!\r\n";
        HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);
        HAL_Delay(500);
    }
    CntState = "Success!\r\n";
    HAL_UART_Transmit(&huart1, (uint8_t *)CntState, strlen(CntState), 200);

    while (1)
    {
        DHT11_Read_Data(&humidity,&temperature);
        sprintf(aTxBuffer,"temperature : %d ^C    "
                        "humidity : %d %% \r\n", temperature,humidity);
        HAL_UART_Transmit(&huart1,aTxBuffer,strlen((const char*)aTxBuffer),200);
        HAL_Delay(500);
    }
}

三、其他

更多详细信息可以参考教程:DHT11温湿度传感器与STM32的连接与使用

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号