在esp32(s3/h2)上运行DHT11的例子

本文介绍了如何在STM32单片机如GD32或STM8上使用DHT11温度湿度传感器,重点讲解了与主机通信的逻辑,包括模拟时序和延迟IO操作。提供了一个C语言实现的DHT11驱动代码示例,强调设备上电后1秒再读取数据的重要性。

首先,DHT11 在哪运行,不重要,重要的是,它与主机的通信,也就是与单片机STM32(GD32)

或者STM8 ,或者51也行

看懂通信逻辑原理图,然后,,模拟时序,对,就是读写数据,,

在单片机通常使用 延迟io 口时间,来达到此效果。为此,我不做过多解释,看代码,

代码参考正点原子DHT11,如有侵权,联系我删除!!

/* 

	DHT11 temperature sensor driver

*/

#ifndef DHT11_H_  
#define DHT11_H_

#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"

#define DHT_OK 0
#define DHT_CHECKSUM_ERROR -1
#define DHT_TIMEOUT_ERROR -2

// == function prototypes =======================================

#define DHT11_PIN     (12)   //可通过宏定义,修改引脚

#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)

void DelayUs(uint32_t nCount);
uint8_t DHT11_ReadTemHum(uint8_t *temp,uint8_t *humi);
void 	DHT11_task(void);
#endif

下面是源码 .c 的实现

#include "DHT11.h"

static const char *TAG = "DHT11";

void DelayUs(uint32_t nCount){
    esp_rom_delay_us(nCount);
}

static void DHT11_IO_IN(void)
{
    esp_rom_gpio_pad_select_gpio(DHT11_PIN);
    DHT11_IN;
}

static void OutputHigh(void){
  DHT11_OUT;
  DHT11_SET;
} 

static void OutputLow(void){
  DHT11_OUT;
  DHT11_CLR;
}

static uint8_t getData(void){
  return gpio_get_level(DHT11_PIN);
}

static void DHT11_Rst(void){
    OutputLow();
    DelayUs(19*1000);//拉低19ms(最多30,最少18ms)
    OutputHigh();
    DelayUs(30);//拉高30us(20-40us)
}

static uint8_t DHT11_Check(void){
  uint8_t retry = 0;
  DHT11_IO_IN();
  
  while(getData() && retry < 100){
    retry++;
    DelayUs(1);
  }
  if(retry>=100)return 1;
  else retry= 0;

  while(!getData() && retry < 100){
    retry++;
    DelayUs(1);
  }
  if(retry>=100)return 1;

  return 0;
}

static uint8_t DHT11_Read_Bit(void) 			 
{
    uint8_t retry=0;
    while(getData()&&retry<100)//等待变为低电平
    {
      retry++;   
      DelayUs(1);
    }
    retry=0;
    while(!getData()&&retry<100)//等待变高电平
    {
        retry++;	
        DelayUs(1);
    }
    DelayUs(40);//等待40us
    if(getData())return 1;
    else return 0;		   
}

static uint8_t DHT11_Read_Byte(void)    
{        
  uint8_t i,dat;
  dat=0;
  for (i=0;i<8;i++) 
  {
    dat <<=1; 
    dat|= DHT11_Read_Bit();
  }				    
  return dat;
}

uint8_t DHT11_ReadTemHum(uint8_t *temp,uint8_t *humi)
{
  uint8_t buf[5];
  uint8_t i;
  DHT11_Rst();//发握手
  if(DHT11_Check()==0)//检查是否存在
  {
    //ESP_LOGI(TAG,"ESP32H2 DHT11 exist!\r\n");
    for(i=0;i<5;i++)//读取40位数据
    {
      buf[i]=DHT11_Read_Byte();
    }
    //ESP_LOGI(TAG,"ESP32H2 buf1(%d) buf2(%d) buf3(%d) buf4(%d),buf5(%d)!\r\n",buf[0],buf[1],buf[2],buf[3],buf[4]);
    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    {
      *humi=buf[0];
      *temp=buf[2];
    }
  }else return 1;
  return 0;
}

void 	DHT11_task(void){
  ESP_LOGI(TAG,"ESP32H2 DHT11 Start:%s,%s!\r\n",__DATE__,__TIME__);
}


注意,设备上电后1s  后,再读取数据。

### 关于ESP32-S3DHT11传感器连接至Arduino平台的方法 对于希望利用Arduino IDE开发环境操作ESP32-S3并接入DHT11温湿度传感器的情况,可以遵循如下说明实现硬件连接与软件编程。 #### 硬件连接指南 为了使ESP32-S3能够同DHT11正常工作,需按照下述方式完成电气连接: - 将DHT11的VCC引脚接到ESP32-S33.3V电源端口上; - 把GND引脚接地,即连到ESP32-S3上的任意一个GND管脚; - 数据线(DATA)则应连接到选定用于通信的一个GPIO引脚,并建议在此线上串联约4.7kΩ~10kΩ大小的电阻作为拉高作用[^1]。 #### 软件配置流程 当完成了物理层面的组装之后,接下来就是编写程序代码以便获取来自DHT11的数据。考虑到DHT11较为复杂的通讯机制,在Arduino环境中推荐采用专门设计好的库文件来辅助处理这一过程。具体来说,“DHT sensor library”是一个不错的选择,它支持多种型号包括但不限于DHT11在内的设备,并提供了易于使用的API接口方便开发者调用。 安装该库可以通过Arduino Library Manager轻松做到:打开IDE后依次点击`Sketch -> Include Library -> Manage Libraries...`,然后在弹出窗口里搜索“DHT sensor library”,找到对应条目后点击安装按钮即可。 有了上述准备以后,下面给出一段简单的测试代码片段展示怎样读取由DHT11测得的信息: ```cpp #include "DHT.h" #define DHTPIN 2 // 定义数据信号输入所占用的IO编号 #define DHTTYPE DHT11 // 设置为DHT11类型 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { float h = dht.readHumidity(); // 获取当前空气中的相对湿度百分比值 float t = dht.readTemperature(); // 取回摄氏度表示下的环境温度 if (isnan(h) || isnan(t)) { // 检查是否有任何异常情况发生 Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C"); delay(2000); // 延迟两秒钟再重复执行一轮测量动作 } ``` 值得注意的是,虽然这里是以Arduino框架为例进行了介绍,但对于运行MicroPython系统的ESP32-S3而言同样适用类似的思路去解决问题——只不过会涉及到不同语法风格以及相应模块的应用差异而已[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值