心流logo

stm32dht11代码

STM32与DHT11温湿度传感器代码示例

在STM32微控制器上使用DHT11温湿度传感器时,代码实现主要涉及以下步骤:

  1. 硬件连接

    • DHT11连接:将DHT11的DQ引脚连接到STM32的GPIO引脚上。
    • 电源:DHT11传感器通常使用3.3V或5V供电,可以从STM32的VCC引脚获取。
    • 上拉电阻:DHT11的数据线需要连接到GPIO引脚,通常需要一个上拉电阻。
  2. 代码初始化

    • GPIO配置:将DHT11连接的GPIO引脚配置为输出模式,用于发送请求信号。
    • 定时器配置:使用定时器产生精确的延时,用于控制DHT11通信的时间。
  3. 通信协议

    • 发送请求信号:拉低GPIO引脚至少18ms,然后拉高20-40us。
    • 接收响应信号:DHT11会拉低数据线80us,然后拉高80us作为响应信号。
    • 读取数据:DHT11会发送40位数据,每个数据位由50us的低电平和后续的高电平组成,高电平持续时间决定数据位是“0”还是“1”。
  4. 读取温湿度数据

    • 读取湿度数据:DHT11发送的40位数据中,前16位是湿度数据。
    • 读取温度数据:DHT11发送的40位数据中,后16位是温度数据。

下面是一个简化的代码示例,展示如何与DHT11进行通信并读取温湿度数据:

#include "main.h"
#include "dht.h"

#define DHT11_GPIO GPIOA
#define DHT11_PIN GPIO_PIN_0

void DHT11_Reset(void)
{
    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
    HAL_Delay(20);
    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_SET);
    HAL_Delay(30);
}

uint8_t DHT11_Check(void)
{
    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
    HAL_Delay(180);
    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_SET);
    HAL_Delay(30);

    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
    HAL_Delay(1);
    if (HAL_GPIO_ReadPin(DHT11_GPIO, DHT11_PIN) == GPIO_PIN_RESET)
    {
        return 1; // 未检测到DHT11
    }
    else
    {
        return 0; // 存在DHT11
    }
}

void DHT11_ReadBit(uint8_t *bit)
{
    HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
    HAL_Delay(1);
    if (HAL_GPIO_ReadPin(DHT11_GPIO, DHT11_PIN) == GPIO_PIN_SET)
    {
        *bit = 1;
    }
    else
    {
        *bit = 0;
    }
}

void DHT11_ReadData(uint8_t *data)
{
    uint8_t bit = 0;
    for (int i = 0; i < 40; i++)
    {
        DHT11_ReadBit(&bit);
        data[i] = bit;
    }
}

void DHT11_ReadHumidity(float *humidity)
{
    uint8_t data[5];
    DHT11_ReadData(data);

    *humidity = (data[0] << 8) | data[1];
    *humidity /= 10;
}

void DHT11_ReadTemperature(float *temperature)
{
    uint8_t data[5];
    DHT11_ReadData(data);

    *temperature = (data[2] << 8) | data[3];
    *temperature /= 10;
}

int main(void)
{
    HAL_Init();
    DHT11_Reset();
    if (DHT11_Check() == 0)
    {
        DHT11_ReadHumidity(&humidity);
        DHT11_ReadTemperature(&temperature);
        printf("Humidity: %.2f%%\n", humidity);
        printf("Temperature: %.2f°C\n", temperature);
    }
    else
    {
        printf("DHT11 not detected\n");
    }

    while (1)
    {
        // 无限循环
    }
}

代码解释

参考文献