ESP8266之DHT11串口打印温湿度

模块:唯倚SIOT-1物联网模块
SDK版本:ESP8266_RTOS_SDK-3.0
开发环境:wsl+vscode
功能模块:wifi,tcp_client,dht11

由于sdk不断更新,使得网上很多代码都无法使用,本代码sdk2.0与sdk3.0适用,不兼容老的sdk。
关于dht11我们可以查看它的中文说明书,了解其数据总线通信的时序图
本文代码参考了RTOS V2.0 驱动DHT11 读取温度湿度值并作为TCP客户端发送到PC
不过这里只采用串口查看dht11的温度湿度。
主要思路是利用gpio2给传感器发送特定信号,然后dht11返回开始信号,传输数据。并对返回数据进行转换处理。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "rom/ets_sys.h"
#include "driver/gpio.h"
#include <string.h>

#define DHT_MAXTIMINGS    10000
#define DHT_BREAKTIME    20
#define DHT_MAXCOUNT    32000

struct dht_sensor_data {
    float temperature;
    float humidity;
};//定义一个变量
struct dht_sensor_data reading ;

float scale_humidity(int *data) 
{
    return data[0];
}
float scale_temperature(int *data) 
{
    return data[2];
}
float get_temperature()
{
    return reading.temperature;
}
float get_humidity()
{
    return reading.humidity;
}
void DHT11_read(void)
{
    int counter = 0;
    int laststate = 1;
    int i = 0;
    int j = 0;
    int checksum = 0;
    int data[100];
    data[0] = data[1] = data[2] = data[3] = data[4] = 0;
    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = ((1ULL<<2) | (1ULL<<2));
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);
    gpio_set_level(2, 1);
    vTaskDelay(250 / portTICK_PERIOD_MS);
    gpio_set_level(2, 0);
    vTaskDelay(20 / portTICK_PERIOD_MS);
    gpio_set_level(2, 1);
    gpio_set_direction(2,GPIO_MODE_INPUT);
    os_delay_us(10);
    while (gpio_get_level(2) == 1 && i < DHT_MAXCOUNT) 
    {
        os_delay_us(1);
        i++;
    }
    if(i == DHT_MAXCOUNT)//读取失败,可能是DHT11还未准备好 
        return;
    for (i = 0; i < DHT_MAXTIMINGS; i++)
    {
        counter = 0;
        while (gpio_get_level(2) == laststate)
        {
            counter++;
            os_delay_us(1);
            if (counter == 1000)
                break;
        }
        laststate = gpio_get_level(2);
        if (counter == 1000)
            break;
        if ((i>3) && (i%2 == 0)) 
        {
            data[j/8] <<= 1;
            if (counter > DHT_BREAKTIME)
                data[j/8] |= 1;
            j++;
        }
    }

    if (j >= 39) {
        checksum = (data[0] + data[1] + data[2] + data[3]) & 0xFF;
        if (data[4] == checksum)
        {
            reading.temperature = scale_temperature(data);
            reading.humidity = scale_humidity(data);
        } 
    }

}
void app_main(void)
{
        while(1)
        {
            DHT11_read();
            printf("[DHT11]Temp:%d,Hud:%d\n",(int)(get_temperature()),(int)(get_humidity()));

            vTaskDelay(5000 / portTICK_PERIOD_MS);
        }
}

本文链接:

https://www.veryxs.com/index.php/archives/8/
1 + 1 =
快来做第一个评论的人吧~