第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验

news2024/11/29 1:47:41

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949

配套资料获取:https://renesas-docs.100ask.net

瑞萨MCU零基础入门系列教程汇总: https://blog.csdn.net/qq_35181236/article/details/132779862


第33章 DHT11温湿度获取实验

33.1 DHT11简介

33.1.1 产品概述

DHT11是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器,会测量空气中湿度,再根据测量结果决定是否继续加湿。

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,具有超小体积、极低功耗的特点,使用单根总线与主机进行双向的串行数据传输。DHT11测量温度的精度为±2℃,检测范围为-20℃-60℃。湿度的精度为±5%RH,检测范围为5%RH-95%RH,常用于对精度和实时性要求不高的温湿度测量场合。

33.1.2 硬件连接

主机通过一条数据线与DH11连接,主机通过这条线发命令给DHT11,DHT11再通过这条线把数据发送给主机。

33.1.3 通信时序

主控发出开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,并送出40bit的数据,完成一次信号采集。DHT11接收到开始信号后触发一次温湿度采集,如果没有开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

通讯过程如图所示:

  1. 总线空闲状态为高电平;
  2. 主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号;
  3. DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号;
  4. 主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号;

主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。

  • 总线为低电平,说明DHT11发送响应信号;
  • DHT11发送响应信号后,再把总线拉高80us,准备发送数据;
  • 每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1;如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常;
  • 当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态;

33.1.4 数据位格式

  1. 数据‘0’

  1. 数据‘1’

33.2 模块配置

和DS18B20非常相似,DHT11也是一个单总线设备。对于时延函数的精度也达到微秒级,因而配置和DS18B20基本一致。DHT11使用的GPIO是P503。

33.2.1 GPIO配置

33.2.2 GPT配置

33.3 驱动程序

33.3.1 IO驱动

和DS18B20的IO驱动一模一样,参考《32.4.1 IO驱动》。

33.3.2 定时器驱动

和DS18B20的GPT驱动一模一样,参考《32.4.2 定时器驱动》。

33.4 DHT11模块

33.4.1 DHT11设备对象

要操作DHT11,只需要对它进行初始化、然后读取数值。抽象出如下结构体:

typedef struct DHT11Dev{
    unsigned int tempture;
    unsigned int humidity;
    int (*Init)(struct DHT11Dev *ptdev);
int (*Read)(struct DHT11Dev *ptdev);
}DHT11Device;

在drv_dht11.c中实现了一个DTH11Dev结构体,代码如下:

static struct DHT11Dev gDevice = {
    .tempture = 0,
    .humidity = 0,
    .Init = DHT11DevInit,
.Read = DHT11DevRead
};

最后需要向上层应用提供获取DHT11设备的接口:

struct DHT11Dev *DHT11GetDevice(void)
{
    return &gDevice;
}

33.4.2 初始化设备

初始化DHT11即初始化IO:

static int DHT11DevInit(struct DHT11Dev *ptdev)
{
    if(NULL == ptdev)   return -EINVAL;
    gDataDevice = IODeviceFind("DHT11 IO");
    if(NULL == gDataDevice)
    {
        printf("Failed to find DHT11 IO!\r\n");
        return -ENXIO;
    }
    if(ESUCCESS != gDataDevice->Init(gDataDevice))
    {
        printf("Failed to init GPIO!\r\n");
        return -EIO;
    }
    return ESUCCESS;
}

33.4.3 温湿度数据读取

DHT11的数据读取不像DS18B20那样需要发送指令,它完全依靠总线的时延特征来区分信号和数据:

static int DHT11DevRead(struct DHT11Dev *ptdev)
{
    if(NULL == ptdev)   return -EINVAL;
    unsigned int timeout = 100;
    static long long tmp = 0;
    unsigned int tempture_data_inter = 0, tempture_data_dec = 0;
    unsigned int humidity_data_inter = 0, humidity_data_dec = 0;
    unsigned char crc_data = 0;

    tmp = 0;
    // 主机拉低最少18ms
    gDataDevice->Write(gDataDevice, 0);
    mdelay(20);
    // 拉高等待DHT11响应,20-40us
    gDataDevice->Write(gDataDevice, 1);
    udelay(30);
    gDataDevice->Read(gDataDevice);
    while((gDataDevice->value==1) && (timeout!=0))
    {
        gDataDevice->Read(gDataDevice);
        udelay(1);
        timeout--;
    }
……………..(省略,读者自行阅读配套代码原文)
    // 响应DHT11拉低总线80us后再拉高总线80us
    if(crc_data==(tempture_data_inter + humidity_data_inter + tempture_data_dec + humidity_data_dec))
    {
        ptdev->tempture = tempture_data_inter;
        ptdev->humidity = humidity_data_inter;
        return ESUCCESS;
    }
    return -EIO;
}

33.5 测试程序

获取到DHT11设备且初始化后,即可开始读取数据。本次实验每隔1s读取一次,并将结果打印出来:

void DeviceTest(void)
{
    UartDevicesRegister();
    TimerDevicesRegister();
    IODevicesRegister();
    
    DHT11Device *pDevice = DHT11GetDevice();
    if(NULL == pDevice)
    {
        printf("Error. There is no DHT11 device!\r\n");
        return;
    }
    pDevice->Init(pDevice);
    printf("\r\n");
    while(1)
    {
        if(pDevice->Read(pDevice) == ESUCCESS)
        {
            printf("环境温度:%d℃ \t 环境湿度:%d℃ \r", pDevice->tempture, pDevice->humidity);
        }
        delay(1);
    }
}

33.6 测试结果

将程序烧录到开发板运行,可以观察到如下结果:


本章完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据采集:数据挖掘的基础

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

解决gyp verb `which` failed python2 Error: not found: python2

运行老项目遇到如下报错 PS C:\Users\demo02> yarn install yarn install v1.22.19 info No lockfile found. [1/5] Validating package.json... [2/5] Resolving packages... warning axios0.18.1: Critical security vulnerability fixed in v0.21.1. For more informati…

4.1.8- Web 应用程序使用的组件进行指纹识别

Web 应用程序使用的组件进行指纹识别 IDWSTG-INFO-08 总结 毫不夸张地说,几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署,应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架…

vue cli npm run build打生产环境包报错Cannot read property ‘pop‘ of undefined

问题出在webpack配置的代码拆分splitChunks 解决办法:每个cacheGroups中配置enforce: true;

数据结构——排序算法——快速排序

快速排序算法的基本思想是 1.从数组中取出一个数,称之为基数(pivot) 2.遍历数组,将比基数大的数字放到它的右边,比基数小的数字放到它的左边。遍历完成后,数组被分成了左右两个区域 3.将左右两个区域视为两…

巧用Lambda表达式获取对象属性名告别魔法值

在我们日常开发中,使用 MyBatis-Plus 写 SQL 执行的时候,难免会用到表字段,虽然 MyBatis-Plus 提供了 LambdaQueryWrapper 帮助我们使用 Lambda 方式调用对象属性名,但有的时候还是不免用到魔法值,当对象的属性名更改了…

检索技术核心学习总结

一、学习检索技术的必要性分析 (一)关键原因分析 学习检索技术(Information Retrieval,IR)具有多种重要的原因,特别是在今天信息爆炸的数字化时代。 总的来说,学习检索技术有助于提高信息处理…

基于Python和mysql开发的商城购物管理系统分为前后端(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的商城购物管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过…

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释(基本): 生成式人工智能是一种可以创造新的原创内容的技术,例如艺术、音乐、软件代码和写作。 当用户输入提示时,人工智能会根据从互联网上现有示例中学到的知识生成响应,…

记一次线上BUG排查过程

1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回…

业务中如何拓展微前端架构

站在整体架构的角度,微前端可以分为以下几类拓展迭代方向。 注册更多微应用 随着业务的扩展,我们可以在主应用中注册更多的微应用。每个微应用是一个独立的子系统,只需要在主应用的注册列表中添加新的项,配置微应用的名称、入口、活动规则等信息即可。 集成微应用…

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

借助工业PoE交换机实现智慧停车场管理

停车场是现代城市的重要基础设施&#xff0c;而且随着汽车保有量的持续增长&#xff0c;城市中也出现了数百甚至上千停车位的大型、超大型停车场&#xff0c;而这些大型停车场的管理和服务也是一个难题。 针对大型停车场的管理&#xff0c;可以借助工业PoE交换机&#xff0c;快…

postman和node.js的使用、YApi 新版如何查看 http 请求数据

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2303.03595 论文代码&#xff1a;https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的&#xff0c;无法提供足够的上下文来区分远处的区域&#xff0c;从而造成性能次优。 激光雷达-摄像机融合方法在三…

html网页制作期末大作业-网上花店商城html+css+javascript

一、简介 html网页制作期末大作业-网上花店商城htmlcssjavascript 8个页面适用学生作业 课程设计花店、期末作业花店、毕业设计花店 ​ 二、部分网页截图 三、部分网页源码 1. 首页代码 <!DOCTYPE html> <html lang"en"> <head><meta charse…

耐蚀合金连续油管制造工艺 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 5 制造工艺 5.1 通则 本文件所包含的合金应采用吹氧转炉冶炼或电炉冶炼或高炉冶炼(仅对马氏体或马氏体/铁素体不 锈钢)或真空感应熔化工艺&#xf…

LVS负载均衡集群--nat模式

一、集群含义&#xff1a; 由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一个访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机。 二、群集的类型&#xff1a; 1&#xff09;负载均衡群集 LB&#xff1a; 提高系统响应效率&#xff0c;处理…

通过bid爬取b站视频内容

1.B站的视频&#xff1a;音频内容和视频内容是分开的&#xff0c;爬完之后需要进行视频合成。 2.每个b站视频的bid号都是唯一的。 3.合成视频使用ffmpeg&#xff0c;通过官网下载&#xff0c;并且pip安装对应的python包&#xff0c;pip install ffmpeg-python。 win10系统下…