DHT22原理详解温湿度模块DHT22详解一:基础篇-CSDN博客
代码借鉴【玩转ESP32】4、ESP32驱动DHT11_esp32 esp-idf dht11-CSDN博客
感谢大佬
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "rom/ets_sys.h"
#include "esp_rom_gpio.h"
#define DHT_22 15
#define uchar unsigned char
#define uint8 unsigned char
#define uint16 unsigned short
//温湿度定义
uchar uchartemp;//COM函数调用,传递数据
float Humi,Temp;
//uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;//验证过后传递数据
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;//存储com获取的数据
static void InputInitial()
{
esp_rom_gpio_pad_select_gpio(DHT_22);
gpio_set_direction(DHT_22, GPIO_MODE_INPUT);
}
static void OutputHigh(void)//输出1
{
esp_rom_gpio_pad_select_gpio(DHT_22);
gpio_set_direction(DHT_22, GPIO_MODE_OUTPUT);
gpio_set_level(DHT_22, 1);
}
static void OutputLow(void)//输出1
{
esp_rom_gpio_pad_select_gpio(DHT_22);
gpio_set_direction(DHT_22, GPIO_MODE_OUTPUT);
gpio_set_level(DHT_22, 0);
}
static uint8 getData()//读取状态
{
return gpio_get_level(DHT_22);
}
//读取一个字节数据
static void COM()
{
uchar i;
for (i=0;i<8;i++)
{
while(!getData())
uchartemp=0;
ets_delay_us(35);//延时35us
if(getData()==1)
uchartemp=1;
ucharcomdata <<= 1;
ucharcomdata |= uchartemp;
while(getData());
}
}
void DHT11(void) //温湿传感启动
{
OutputLow();
ets_delay_us(1000);
OutputHigh();
ets_delay_us(40);
InputInitial(); //输入
if(!getData())//表示传感器拉低总线
{
//等待总线被传感器拉高
while(!getData())
ets_delay_us(10);
//等待总线被传感器拉低
while(getData())
ets_delay_us(10);
COM();//读取第1字节,
ucharRH_data_H_temp=ucharcomdata;
COM();//读取第2字节,
ucharRH_data_L_temp=ucharcomdata;
COM();//读取第3字节,
ucharT_data_H_temp=ucharcomdata;
COM();//读取第4字节,
ucharT_data_L_temp=ucharcomdata;
COM();//读取第5字节,
ucharcheckdata_temp=ucharcomdata;
OutputHigh();
//判断校验和是否一致
uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
if(uchartemp==ucharcheckdata_temp)
{
//校验和一致,
/*ucharRH_data_H=ucharRH_data_H_temp;
ucharRH_data_L=ucharRH_data_L_temp;
ucharT_data_H=ucharT_data_H_temp;
ucharT_data_L=ucharT_data_L_temp;
ucharcheckdata=ucharcheckdata_temp;*/
//保存温度和湿度
Humi=ucharRH_data_H_temp;
Humi=((uint16)Humi<<8|ucharRH_data_L_temp)/10;
Temp=ucharT_data_H_temp;
Temp=((uint16)Temp<<8|ucharT_data_L_temp)/10;
}
else
{
Humi=100;
Temp=100;
}
}
else //没用成功读取,返回0
{
Humi=0,
Temp=0;
}
OutputHigh(); //输出
}
void app_main() {
printf("Hello, Wokwi!\n");
while (true) {
DHT11(); //读取温湿度
printf("Temp=%.2f--Humi=%.2f%%RH \r\n", Temp,Humi);
vTaskDelay(300); //延时300毫秒
}
}