0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第二十四讲 DHT11温湿度传感器检测实验

聚沃科技 2024-06-24 10:03 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

24.1实验内容

通过本实验主要学习以下内容:

  • DHT11操作原理
  • 单总线GPIO模拟操作原理

24.2实验原理

HT11是一款已校准数字信号输出的温湿度一体化数字传感器。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点信号,传输距离可达20米以上。

其具体参数如下:

  • 工作电压:3.3V-5.5V
  • 工作电流:0.5mA
  • 控制方式:单总线
  • 输出方式:数字量
  • 湿度精度:±5%
  • 温度精度:±2℃
  • 湿度量程:5%~95%
  • 温度量程:-20℃~+60℃
    DHT11引脚定义和封装如下图所示
wKgZomZ402KADlFPAAFamDCAOm4443.png

DHT11采用单总线的方式进行数据传输,下面对其通信时序以及传输数据构成进行介绍。

DHT11通信时序可分为:建立连接、数据接收两部分。

建立连接部分时序如下图所示,共包括:主机动作和从机响应两部分。主机动作:DHT11温湿度传感器上电后,数据线处于空闲状态(配置数据线空闲状态为高电平)。主机发送建立连接动作,动作内容为:拉低数据线再拉高数据线(数据线拉低时间>18ms、拉高时间在20-40us之间)然后释放总线。从机响应:从机接收到主句发送的建立连接动作后,先拉低数据线,再拉高数据线,表示连接建立成功(拉低数据线40-50us,拉高数据线40-50us)。

wKgaomZ4026AOeBMAAGDlDp8F4o462.png

在连接成功建立后,从机发送数据,主机进行数据的接收。数据接收:每一bit数据都以50us低电平开始,通过判断低电平后的高电平时间来决定接收数据的种类。接收高电平时间为26us-28us表示0,接收高电平为70us表示1。当最后一bit数据传送完毕后,从机拉低数据线50us,随后从机释放总线,总线进入空闲状态(高电平)。

wKgaomZ403qAe0R3AATWJovsvko911.png

主机一次接收40bit数据,共5字节,每个字节的含义如下图所示。从高到低依次为:湿度整数h(0)、湿度小数h(1)、温度整数h(2)、温度小数h(3)、校验和h(4)。检验和等于前四字节数据之和。在一次数据接收完成后,验证h(4)是否等于h(1)+h(2)+h(3)+h(4)。若等式成立则表示数据成功接收,然后进行数据更新,否则不进行数据更新。

wKgaomZ404aATrZXAABfQIMhC6U316.png

DHT11数据格式举例如下。

wKgZomZ404-AXqtHAAJ6I9d_3Z0170.png

24.3硬件设计

DHT11硬件电路图如下所示。DHT11为单信号线通信,因而仅使用了一个IO进行数据通信,且该IO使用了RC进行滤波并采用4.7K进行上拉,保证了数据通信的稳定性,电源地通过100nf电容滤波

wKgaomZ405mABLgjAADA3bvezno928.png

24.4代码解析

24.4.1DHT11初始化

DHT11初始化函数实现如下,主要包括DHT11数据通信引脚的初始化以及DHT11 reset和check操作。

C
uint8_t dht11_init(void)
{
driver_gpio_general_init(&DHT11_DA);
/* DHT11_DQ引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的时候(=1), 也可以读取外部信号的高低电平 */
dht11_reset();
return dht11_check();
}

在该函数中,将DHT11数据引脚配置为开漏模式,使用上可以不用切换引脚模式以及方向,使用比较方便。

dht11_reset()为复位DHT11操作函数,其实现如下,如原理中介绍,首先拉低数据引脚20ms,之后拉高30us,实现对DHT11的复位操作。

C
static void dht11_reset(void)
{
DHT11_DA_OUT(0); /* 拉低DQ */
delay_ms(20); /* 拉低至少18ms */
DHT11_DA_OUT(1); /* DQ=1 */
delay_us(30); /* 主机拉高10~35us */
}

dht11_check()为check DHT11是否正常连接以及工作,其实现如下,其主要通过判断DHT11是否能够响应主机的复位请求操作来判断DHT11是否连接以及工作正常,如果工作正常,该函数返回值为0,否则返回1.

C
uint8_t dht11_check(void)
{
uint8_t retry = 0;
uint8_t rval = 0;

while (DHT11_DA_IN && retry < 100)  /* DHT11会拉低83us */
{
retry++;
delay_us(1);
}

if (retry >= 100)
{
rval = 1;
}
else
{
retry = 0;

while (!DHT11_DA_IN && retry < 100) /* DHT11拉低后会再次拉高87us */
{
retry++;
delay_us(1);
}
if (retry >= 100) rval = 1;
}

return rval;
}

24.4.2DHT11温湿度读取

DHT11温湿度读取函数如下,通过该函数将会连续读取5个字节数据,前两个为湿度数据,之后两个为温度数据,最后一个数据为校验和。读取正确且校验完成后相关湿度数据将会放在对应的形参指定的变量内,该函数将会返回0.

C
uint8_t dht11_read_data(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
dht11_reset();

if (dht11_check() == 0)
{
for (i = 0; i < 5; i++)     /* 读取40位数据 */
{
buf[i] = dht11_read_byte();
}

if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
}
else
{
return 1;
}

return 0;
}

24.4.3主函数

DHT11温湿度检测实验主函数如下所示,首先对systick延迟函数进行初始化,之后对DHT11初始化,最后在主循环中没间隔1s读取一次温湿度数据。

C
int main(void)
{
uint8_t temperature;
uint8_t humidity;

delay_init();

while (dht11_init()) /* DHT11初始化 */
{
}

while (1)
{
dht11_read_data(&temperature, &humidity); /* 读取温湿度值 */
delay_ms(1000);
}
}

24.5实验结果

将DHT11温湿度读取实验烧录到红枫派开发板中,并连接串口,运行程序会,将会每秒钟打印一次温湿度数据。向着DHT11吹口热气,将会观察到打印的温湿度数值都将会增加。

wKgZomZ406mAew3cAABOgz4Dx9k925.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6011

    文章

    44158

    浏览量

    624436
  • 开发板
    +关注

    关注

    25

    文章

    4606

    浏览量

    95127
  • 温度器
    +关注

    关注

    0

    文章

    3

    浏览量

    8566
  • GD32
    +关注

    关注

    7

    文章

    365

    浏览量

    23842
  • DH11
    +关注

    关注

    0

    文章

    3

    浏览量

    2467
收藏 人收藏

    评论

    相关推荐

    【众拳】基于STM8的DHT11温湿度传感器实验 附代码

    ~50us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。DHT11 温湿度传感器时序图【众拳】剑齿虎STM8
    发表于 12-07 09:14

    GD32330C-START开发板申请】GD32330C传感器测试及温湿度控制

    结构,准备实验相关软硬件材料③在GD32330C开发板上集成相关传感器进行单项测试(LCD1602,HS0038,DS18B20,DHT11
    发表于 09-10 09:21

    GD32330C-START开发板试用体验】DHT11温湿度测量

    实验目的: 在GD32330C-START开发板上通过DHT11模块测量环境温湿度并在OLED屏上显示
    发表于 09-24 15:01

    「正点原子NANO STM32F103开发板资料连载」第二十七章 DHT11 数字温湿度传感器实验

    七章 DHT11 数字温湿度传感器实验上一章,我们介绍了数字温度传感器 DS18B20 的使用,本章我们将介绍数字
    发表于 05-06 15:25

    Arduino开发板使用DHT11温湿度传感器的方法 精选资料分享

    在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备。简单地说,我们将使
    发表于 07-13 09:35

    Arduino开发板使用DHT11温湿度传感器的方法 精选资料分享

    在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备。简单地说,我们将使
    发表于 07-13 06:58

    DHT11温湿度传感器介绍

    DHT11温湿度传感器介绍,1.实物原理图2.模块说明2.1 DHT11产品概述DHT11数字温湿度
    发表于 07-21 09:04

    使用DHT11温湿度传感器

    STM32F407ZGT6开发板进行项目开发,选用的传感器为常见通用的DHT11温湿度
    发表于 08-10 06:14

    DHT11温湿度传感器

    一、实验目的采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板进行项目开发,选用的传感器为常见通用
    发表于 08-10 07:36

    基于STM32开发板实现传感数据采集-DHT11温湿度采集

    STM32F407ZGT6开发板进行项目开发,选用的传感器为常见通用的DHT11温湿度
    发表于 08-10 07:41

    如何使用nodemcu开发板DHT11温湿度传感器获取温湿度数值?

    如何使用nodemcu开发板DHT11温湿度传感器获取温湿度数值?
    发表于 10-28 06:12

    如何使用STM32F4来读取DHT11数字温湿度传感器

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微
    发表于 02-09 07:50

    DHT11温湿度传感器简介

    DHT11温湿度传感器1、DHT11简介DHT11数字温湿度
    发表于 02-16 06:55

    DHT11温湿度传感器使用手册电子版下载

    DHT11温湿度传感器使用手册电子版下载
    发表于 03-27 11:20 0次下载
    <b class='flag-5'>DHT11</b><b class='flag-5'>温湿度</b><b class='flag-5'>传感器使用手册</b>电子版下载

    stm32温湿度传感器报告_「正点原子NANO STM32开发板资料连载」第二十八章 DHT11 数字温湿度传感器实验...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子第二十八章
    发表于 12-05 16:36 14次下载
    stm32<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>报告_「正点原子NANO STM32<b class='flag-5'>开发板</b>资料连载」<b class='flag-5'>第二十</b>八章  <b class='flag-5'>DHT11</b> 数字<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b><b class='flag-5'>实验</b>...