这个实验是读取温湿度数据,并在 TFT 显示屏显示和串口输出。 这个实验的代码为工程“3_7_dht11”目录。
3.7.1. 实验内容
(1) 学习 ESP32 库函数对 IO 口的配置
(2) 学习如何使用 LCD 显示屏
3.7.2. 硬件设计和原理
打开我们提供的电路图,在文件:\原理图\ESP32 开发板电路图 V1.3.pdf 里,DHT11 温湿度传感器通过拨码开关后,是接在 IO4 上的,使用 DHT11 温湿 度传感器时一定要打开底板上的拨码开关1,如下图:
ESP32 通过 IO4 使用单总线协议,就可以读取到当前的温湿度数据,DHT11 传感器的单总线协议在目录
<<手册和文档>>下的文档<<DHT11 数字型温湿度模块-v1.4-20170508.pdf>>有详细说明,以下内容全部从 此文档摘取。
(1) DHT11 数据时序图
1 起始信号
主机拉低总线不能小于 18ms(最大不得超过 30ms),然后微处理器的 I/O 设置为输入状态,由 于上拉电阻,主机的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号,发送信 号如图所示:
2 从机响应信号
DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 83 微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准 备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等 待 87 微秒的高电平后的数据接收,发送信号如图所示:
3 从机返回 5 个字节的数据
由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据 “0”的格式为: 54 微秒的低电平和 23-27 微秒的高电平,位数据“1”的格式为: 54 微秒的低电
平加 68-74 微秒的高电平。位数据“0”、“1”格式信号如图所示:
(2) 接收的数据格式 比如接收数据:
校验和计算:
数据正确:
湿度:0011 0101(整数)=35H=53%RH 0000 0000(小数)=00H=0.0%RH =>53%RH + 0.0%RH =53.0%RH
注 : 更 详细 的说 明 请自 己查 询 文档 , 在 目 录<< 手 册和 文档 >> 下 的<<DHT11 数 字型 温湿 度模 块
-v1.4-20170508.pdf>>。
3.7.3. 函数介绍
这个实验是对 IO 口操作,没有使用到新的 ESP32 函数,请往回看实验 3.3.3 介绍的 4 个函数即可。
3.7.4. 代码讲解
使用 vs code 展开本实验的工程目录,如下图:
本实验在 components 目录下,有一个 lcd 文件夹是关于 TFT 显示屏的使用,在 3.4 的实验里有专门的 讲解。在这个实验里增加了一个 DHT11 文件夹,就是专门用于读取 DHT11 传感器数据的源文件,下面我 们对 DHT11 文件进行分析。
我们打开 dht11.c,在文件的最前面有几个函数,是设置 IO4 的输入输出和读取 IO4 的状态,代码如下:
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);
}
static uint8 getData()//读取状态
下面介绍 ESP32 的 IO4 如何读取一个字节的数据,我们先回头看 3.7.2 读取一个位的时序图:
由图可以看出,位数据 0 和位数据 1 的区别是:数据 1 的高电平时间比数据 0 的时间长,根据这个特 点,读取一个字节的代码如下:
//读取一个字节数据
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;
}
}
最后就是外部调用的函数 DHT11()的说明,这个函数先由 ESP32 发起开始信号,接着等待 DHT11 响应, 最后读取了 5 个字节的数据,经过校验数据无误后,我们把温度和湿度保存在全局变量 wendu 和 shidu 里, 下图是时序图和代码的对应关系,完整代码需要用户打开 dht11.c 自己查看,都有注释。
最后我们看主文件 app_main.c,进入函数后,先是对 LCD 初始化和显示,然后通过 while(1) 3 秒调用
DHT11()读一次数据,显示到 LCD 上并从串口输出,代码如下图:
//用户函数入口,相当于 main 函数
void app_main()
{
char dht11_buff[50]={0};
//显示屏初始化 Lcd_Init();
//显示屏提示信息 Gui_DrawFont_GBK24(15,0,RED,WHITE,(u8 *)"亿研电子");
LCD_P6x8Str(20,24,WHITE,BLACK,(u8 *)"sz-yy.taobao.com"); Gui_DrawFont_GBK16(16,34,VIOLET,WHITE,(u8 *)"深圳亿研电子");
```while(1)
{
DHT11(); //读取温湿度
温度
Gui_DrawFont_GBK16(6,90,VIOLET,BLACK", wendu);
*)dht11_bu
sprintf(dht11_buff 湿度
Gui_DrawFont_GBK16(6,110,VIOLET,BLACK,(u8
printf("T=%d,H=%d %%.\r\n", wendu, shidu); vTaskDelay(300);
}
}
3.7.5. 实验过程
配置下载串口、波特率、编绎和程序下载的详细过程请往回看 3.1.4,在这个实验里都是一笔带过。 (1) 把开发板通过 USB 线接到电脑上,通过设备管理器查看生成的串口。开发板在我们演示电脑上生
成的是 COM3。
(2) 在 menuconfig 菜单里配置下载程序串口。提供的例程配置的串口是 COM3,波特率为 921600。
(3) 通过 make all 编绎工程。
(4) 当编绎通过之后,使用命令 make flash 把程序下载到开发板上。或者参考 2.3.2 节,使用工具下载。
(5) 按下开发板的复位键,让程序运行起来,观察显示屏的显示。
(6) 使用串口工具打开开发板生成的串口,默认的波特率是 115200,通过长按和短按 KEY1 键观察串 口工具的输出(拨码开关一定要打开)。串口工具在目录:.\开发软件\串口工具-sscom32.rar。
最后推荐一款开发套件,可以手淘扫码查看。