首页 > 自考资讯 > 自考知识

dht11温湿度传感器的使用视频,dht11温湿度传感器简介

头条共创 2024-07-05

a27468a7-7273-422a-81a5-2e7215b35496~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=urxihQYKj7SgLMxLgkMRZiszdFY%3D来源:百文网_嵌入式Linux wiki_jz2440新题1视频Wiki教程(视频文字版)

作者:魏东山

本文字数:2379,阅读时间:4分钟

本课程首先介绍如何使用DH11 温湿度传感器。首先,检查芯片的手册。

829df645ee2f46db8e8cc3ffdecd47e3~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=fokdUeK9HIckSVqDmm7HrV5ghQA%3DMCU通过数据线连接到DH11,MCU通过该线向DH11发送命令,DH11通过该线向MCU发送数据。

因此,温湿度模块的核心是MCU发送给DH11的命令格式和DH11返回的数据格式。

让我们快速了解一下沟通的时机。

7ccbce3a60e64998be8f6bf94758ac5d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=ox%2FPJnJZy7p0DbRqrmAvv6ybglA%3D 灰色区域由MCU驱动程序控制,浅色阴影区域由DH11驱动程序控制。

首先,MCU 发送一个启动信号,该信号是一个低脉冲,然后拉高。

然后DH11变低,产生响应信号,然后变高。

接下来是DH11返回的数据。

这些数据总共40 位,最高位在前。

数据格式:8bit 湿度整数数据+ 8bit 湿度小数数据+ 8bit 温度整数数据+ 8bit 温度小数数据+ 8bit 校验和

当前的小数部分将用于将来的扩展,并且将被读取为零。

如果数据传输正确,校验和数据将等于“湿度8位整数数据+湿度8位小数数据+温度8位整数数据+温度8位小数数据”的后8位。

DH11的难点在于前面提到的定时脉冲。必须满足一定的时间,例如启动信号:

e9ddb55b88184c998ca5861d6f2e618d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=5vG2%2B%2FmF6FofFCwa8NSzdQm%2FOHs%3DMCU 必须首先拉低至少18ms,然后拉高20-40 微秒。 DH11 通过拉低80 微秒并最终拉高80 微秒进行响应。

接下来就是发送数据了,但是DH11如何提供这些数据并代表0和1呢?

15a1a081ecc14eb18756f668c41436d1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=gqf9FR7t21sYGBm71ta%2BIPLV2Gs%3D b84f2f69944246c294ea5cf1f3ad519a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732200&x-signature=7fNET5ODqzm4%2BhKc4%2F426IURxN8%3D 可以看到0和1都是从50us的低电平开始的。

如果数据为0,则保持高电平26-28us。

1个数据之后是70us的高电平。

有了以上知识和之前的高精度延迟,你就可以开始编写你的程序了。

复制前面第二个程序,将文件重命名为003_dht11_022_003,在sensor目录下新建dht11目录,并创建dht11.c文件。

我们的目的是控制GPIO并读取DHT11数据。流程如下。

1、主机发送至少18MS的低脉冲:启动信号。 2. 启动信号变高20-40us,然后使总线变高以获得80us: 响应信号。接下来是数据,并向bit0 : 发送一个50us 低脉冲和26-28us 高脉冲。

bit1 : 50us 低脉冲,70us 高脉冲

4、数据包括40bit: 8位湿度整数数据+8位湿度小数数据+8位温度整数数据+8位温度小数数据+8位校验和。 DH11 的DATA 引脚连接到GPG5。

首先,实现基本的GPIO 操作并配置GPIO 模式以实现输出和输入引脚功能。

static void dht11_data_cfg_as_output(void){GPGCON=~(310);GPGCON |=(110);} static void dht11_data_cfg_as_input(void){GPGCON=~(310);} 接下来,设置输出电平或输入引脚数据。

static void dht11_data_set(int val){if (val)GPGDAT |=(15);elseGPGDAT=~(15);}static int dht11_data_get(void){if (GPGDAT (15))return 1;elsereturn 0;} 实现让我们再次执行DHT11读操作。

根据芯片手册,DH11传感器上电后,需要等待1秒来克服不稳定,在此期间不需要发送指令。

因此,首先创建一个跳过这种不稳定状态的初始化函数。

void dht11_init(void){dht11_data_cfg_as_output();dht11_data_set(1);mlay(2000);} 编写一个程序,根据启动时序要求,保持低电平18ms以上,然后释放引脚。可用作输入引脚。

该引脚连接有上拉电阻,因此当MCU 配置为输入时,该引脚的电平由上拉电阻决定。

static void dht11_start(void){dht11_data_set(0);mlay(20);dht11_data_cfg_as_input();} 然后等待40us以上,读取引脚电平,看引脚是否拉低,判断DH11是否响应。

static int dht11_wait_ack(void){ulay(60);return dht11_data_get();}创建一个延迟函数,用于确定何时等待响应信号结束。

static int dht11_wait_for_val(int val, int timeout_us){while (timeout_us--){if (dht11_data_get()==val)return 0; /* ok */ulay(1);}return -1;下一个数据由5 组成字节数。这里我们首先写入和读取1个字节,每个字节必须读取8位。

首先等待高电平,过滤典型延迟50us,然后延迟至少28us,然后再读取引脚上的电平。

如果引脚电平为1,则数据为1,否则为0。

然后循环8次,直到达到低电平并完成读取一个字节的数据。

static int dht11_recv_byte(void){int i;int data=0;for (i=0; i 8; i++){if (dht11_wait_for_val(1, 1000)){printf('dht11 等待高数据错误!\n \ r');return -1;}ulay(40);data=1;if (dht11_data_get()==1)data |=1;if (dht11_wait_for_val(0, 1000)){printf('dht11 低数据等待错误!\n\r');return -1;}}返回数据;} 《新品公告》 STM32MP157开发板现已接受预订。初期产量仅为300套。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢