ESP32使用 DHT11 传感器 通过 IO4 读出当前的温度和湿度。
起始信号
主机拉低总线不能小于 18ms(最大不得超过 30ms),然后微处理器的 I/O 设置为输入状态,由 于上拉电阻,主机的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号,
从机响应信号
DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 83 微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准 备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等 待 87 微秒的高电平后的数据接收,
static void InputInitial(void)//设置端口为输入
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT);
}
static void OutputHigh(void)//输出 1
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT); gpio_set_level(DHT11_PIN, 1);
}
static void OutputLow(void)//输出 0
{
gpio_pad_select_gpio(DHT11_PIN); gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT); gpio_set_level(DHT11_PIN, 0);
}
位数据 0 和位数据 1 的区别是:数据 1 的高电平时间比数据 0 的时间长,根据这个特 点,读取一个字节的代码如下:
```c
//读取一个字节数据
static void COM(void) // 温湿写入
{
uchar i; for(i=0;i<8;i++)
{
ucharFLAG=2;
//等待 IO 口变低,变低后,通过延时去判断是 0 还是 1 while((getData()==0)&&ucharFLAG++) ets_delay_us(10); ets_delay_us(35);//延时 35us
uchartemp=0;
//如果这个位是 1,35us 后,还是 1,否则为 0 if(getData()==1) uchartemp=1; ucharFLAG=2;
//等待 IO 口变高,变高后,表示可以读取下一位 while((getData()==1)&&ucharFLAG++) ets_delay_us(10); if(ucharFLAG==1)break;
ucharcomdata<<=1; ucharcomdata|=uchartemp;
}
}
按下开发板的复位键,让程序运行起来,观察显示屏的显示。
最后推荐一款开发套件,可以手淘扫码查看。