把上節的blink工程複製一份,修改名稱為dht11,其中CMakeLists.txt、Makefile、包括源文件名也改為dht11,然後試著編譯,發現可以編譯通過,這樣就可以先不用去管CMakeLists.txt、Makefile等文件的編寫。
注意避開那幾個只能用作輸入的IO口即可。
DHT11 開發板
VCC <-> VCC
GND <-> GND
DOUT <-->GPIO21(模塊的絲印G21的引腳)
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#define DHT11_PIN (21) //可通過宏定義,修改引腳
#define DHT11_CLR gpio_set_level(DHT11_PIN, 0)
#define DHT11_SET gpio_set_level(DHT11_PIN, 1)
#define DHT11_IN gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT)
#define DHT11_OUT gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT)
uint8_t DHT11Data[4]={0};
uint8_t Temp, Humi;
//us延時函數,誤差不能太大
void DelayUs( uint32_t nCount)
{
ets_delay_us(nCount);
}
void DHT11_Start(void)
{
DHT11_OUT; //設置埠方向
DHT11_CLR; //拉低埠
DelayUs(19*1000);
// vTaskDelay(19 * portTICK_RATE_MS); //持續最低18ms;
DHT11_SET; //釋放總線
DelayUs(30); //總線由上拉電阻拉高,主機延時30uS;
DHT11_IN; //設置埠方向
while(!gpio_get_level(DHT11_PIN)); //DHT11等待80us低電平響應信號結束
while(gpio_get_level(DHT11_PIN));//DHT11 將總線拉高80us
}
uint8_t DHT11_ReadValue(void)
{
uint8_t i,sbuf=0;
for(i=8;i>0;i--)
{
sbuf<<=1;
while(!gpio_get_level(DHT11_PIN));
DelayUs(30); // 延時 30us 後檢測數據線是否還是高電平
if(gpio_get_level(DHT11_PIN))
{
sbuf|=1;
}
else
{
sbuf|=0;
}
while(gpio_get_level(DHT11_PIN));
}
return sbuf;
}
uint8_t DHT11_ReadTemHum(uint8_t *buf)
{
uint8_t check;
buf[0]=DHT11_ReadValue();
buf[1]=DHT11_ReadValue();
buf[2]=DHT11_ReadValue();
buf[3]=DHT11_ReadValue();
check =DHT11_ReadValue();
if(check == buf[0]+buf[1]+buf[2]+buf[3])
return 1;
else
return 0;
}
void app_main(void)
{
printf(rrr"ESP32 DHT11 TEST:%s,%s!\r\n",__DATE__,__TIME__);
gpio_pad_select_gpio(DHT11_PIN);
while(1) {
DHT11_Start();
if(DHT11_ReadTemHum(DHT11Data))
{
Temp=DHT11Data[2];
Humi=DHT11Data[0];
printf("Temp=%d, Humi=%d\r\n",Temp,Humi);
}
else
{
printf("DHT11 Error!\r\n");
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
系列文章:
【玩轉ESP32】1、開發環境搭建
【玩轉ESP32】2、開發資料
【玩轉ESP32】3、點亮LED,Blink,blink,blink
謝謝支持 !