ESP32 温湿度传感器(DHT11)

作者:追风剑情 发布于:2026-5-28 23:56 分类:物联网

999999.png

接线
DHT11 模块 ESP32 引脚 说明
GND GND 共地
VCC VCC 工作电压 3.3V-5V
DATA GPIO 5 数据输出是串行数据,单总线。

安装DHT传感器驱动
idf.py add-dependency "zorxx/dht"

dht11_control.h

#ifndef DHT11_CONTROL_H
#define DHT11_CONTROL_H

#include <stdbool.h>

// 初始化 DHT11 传感器
void dht11_init(void);

// 读取温度 (摄氏度)
float dht11_get_temperature(void);

// 读取湿度 (百分比)
float dht11_get_humidity(void);

// 一次性读取温湿度,成功返回 true
bool dht11_read(float *temperature, float *humidity);

// 温湿度数据回调函数类型
typedef void (*dht11_callback_t)(float temperature, float humidity);

// 设置数据更新回调
void dht11_set_callback(dht11_callback_t callback);

// 启动自动读取任务(每隔 seconds 秒读取一次)
void dht11_start_auto_read(int seconds);

#endif


dht11_control.c

#include "dht11_control.h"
#include "dht.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

// DHT11 配置
#define DHT_GPIO        5               // GPIO5 连接 DATA 引脚
#define DHT_SENSOR_TYPE DHT_TYPE_DHT11  // 传感器类型

static const char *TAG = "DHT11";
static bool is_initialized = false;
static dht11_callback_t data_callback = NULL;
static TaskHandle_t auto_read_task_handle = NULL;

// 配置 GPIO 内部上拉(增强稳定性)
static void configure_gpio_pullup(void)
{
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << DHT_GPIO),
        .mode = GPIO_MODE_INPUT_OUTPUT_OD,
        .pull_up_en = GPIO_PULLUP_ENABLE,   // 启用内部上拉
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE,
    };
    gpio_config(&io_conf);
    ESP_LOGI(TAG, "GPIO %d configured with internal pull-up", DHT_GPIO);
}

void dht11_init(void)
{
    ESP_LOGI(TAG, "Initializing DHT11 on GPIO %d...", DHT_GPIO);
    
    // 配置 GPIO 内部上拉
    configure_gpio_pullup();
    
    // 等待传感器稳定
    vTaskDelay(pdMS_TO_TICKS(100));
    
    // 测试读取一次,验证传感器是否正常工作
    float temp = 0, hum = 0;
    esp_err_t ret = dht_read_float_data(DHT_SENSOR_TYPE, DHT_GPIO, &hum, &temp);
    
    if (ret == ESP_OK) {
        is_initialized = true;
        ESP_LOGI(TAG, "DHT11 initialized successfully!");
        ESP_LOGI(TAG, "Test reading - Temperature: %.1f°C, Humidity: %.1f%%", temp, hum);
    } else {
        is_initialized = false;
        ESP_LOGE(TAG, "DHT11 initialization failed: %s", esp_err_to_name(ret));
        ESP_LOGE(TAG, "Please check:");
        ESP_LOGE(TAG, "  1. Wiring: VCC→3.3V, GND→GND, DATA→GPIO%d", DHT_GPIO);
        ESP_LOGE(TAG, "  2. 4.7kΩ~10kΩ pull-up resistor between DATA and VCC");
        ESP_LOGE(TAG, "  3. Sensor is not damaged");
    }
}

float dht11_get_temperature(void)
{
    if (!is_initialized) {
        ESP_LOGE(TAG, "Sensor not initialized");
        return -999.0f;
    }
    
    float temp = 0, hum = 0;
    esp_err_t ret = dht_read_float_data(DHT_SENSOR_TYPE, DHT_GPIO, &hum, &temp);
    
    if (ret == ESP_OK) {
        return temp;
    } else {
        ESP_LOGE(TAG, "Failed to read temperature: %s", esp_err_to_name(ret));
        return -999.0f;
    }
}

float dht11_get_humidity(void)
{
    if (!is_initialized) {
        ESP_LOGE(TAG, "Sensor not initialized");
        return -999.0f;
    }
    
    float temp = 0, hum = 0;
    esp_err_t ret = dht_read_float_data(DHT_SENSOR_TYPE, DHT_GPIO, &hum, &temp);
    
    if (ret == ESP_OK) {
        return hum;
    } else {
        ESP_LOGE(TAG, "Failed to read humidity: %s", esp_err_to_name(ret));
        return -999.0f;
    }
}

bool dht11_read(float *temperature, float *humidity)
{
    if (!is_initialized) {
        ESP_LOGE(TAG, "Sensor not initialized");
        return false;
    }
    
    esp_err_t ret = dht_read_float_data(DHT_SENSOR_TYPE, DHT_GPIO, humidity, temperature);
    
    if (ret == ESP_OK) {
        ESP_LOGI(TAG, "Temperature: %.1f°C, Humidity: %.1f%%", *temperature, *humidity);
        return true;
    } else {
        ESP_LOGE(TAG, "Read failed: %s", esp_err_to_name(ret));
        return false;
    }
}

void dht11_set_callback(dht11_callback_t callback)
{
    data_callback = callback;
}

// 自动读取任务
static void auto_read_task(void *pvParameters)
{
    int interval_seconds = (int)pvParameters;
    float temp, hum;
    
    ESP_LOGI(TAG, "Auto-read task started, interval: %d seconds", interval_seconds);
    
    while (1) {
        if (dht11_read(&temp, &hum)) {
            if (data_callback != NULL) {
                data_callback(temp, hum);
            }
        }
        vTaskDelay(pdMS_TO_TICKS(interval_seconds * 1000));
    }
}

void dht11_start_auto_read(int seconds)
{
    if (seconds < 2) {
        ESP_LOGW(TAG, "Interval too short, adjusting to 2 seconds (DHT11 minimum)");
        seconds = 2;
    }
    
    if (auto_read_task_handle != NULL) {
        vTaskDelete(auto_read_task_handle);
        ESP_LOGI(TAG, "Previous auto-read task stopped");
    }
    
    xTaskCreate(auto_read_task, "dht_auto", 4096, (void*)seconds, 5, &auto_read_task_handle);
    ESP_LOGI(TAG, "Auto-read task started (interval: %d seconds)", seconds);
}

标签: IoT

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号