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

2023-11-03

本教程基于韦东山百问网出的 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 测试结果

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


本章完
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • PMOS开关电路

    本次项目上需要实现的功能是利用AO3401 PMOS设计一个开关电路 实现一款设备的开关控制 被控设备12V供电 供电电流小于3A即可 且为了提高响应速度 使流过该设备的电流尽可能的大 该设备内阻大约为6ohm AO3401产品参数 VDS
  • HTTP超详细教程

    1 HTTP协议 1 1 HTTP简述 HTTP全称为超文本传输协议 是一种应用比较广泛的应用层协议 那何为超文本 超文本指的是传输的内容不仅仅是文本 比如 html css javaScript 等数据 还可以是一些其他的资源 比如图片
  • AI修复人像

    一 前言 最近闲来无事 翻了翻以前的老照片 看着多年前的老照片 感慨万千 仿佛又回到了以前的青春岁月 只可惜青春易逝 无法重来 意气风发 头角峥嵘的画面只能永远地留存在相片之中了 只叹当时没有多拍几张照片留作纪念 可惜当时设备也不好 照片效
  • 【Linux】低级IO

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 文件的概念 二 C语言文件操作回顾 三 使用系统调用进
  • 山大网安靶场实验平台项目—个人记录(一)

    系列文章专栏地址 山东大学网络安全靶场实验平台 本期内容 完成项目框架设计 学习vue和element ui 了解基本语法 编写前端页面 组件 学习springboot为写后端作准备 项目框架设计 time 3 days 首先我们这个项目是
  • Vue3功能实战 —— 动态路由、路由签权、动态组件 使用示例

    前期回顾 Vue3 TS Vite 大屏可视化 项目实战 vue3可视化大屏 彩色之外的博客 CSDN博客大屏可视化项目实战 vue3可视化大屏https blog csdn net m0 57904695 article details
  • zabbix6.2.4企业微信群机器人告警

    zabbix6 2 4企业微信群机器人告警 基于https blog csdn net stars moon1024 article details 123042369调试 创建媒介 脚本如下 var Wechat token null t
  • linux 怎么样复制文件夹内所有文件到另一个文件夹?

    cp Rf home user1 root temp 将 home user1目录下的所有东西拷到 root temp 下而不拷贝user1目录本身 即格式为 cp Rf 原路径 目的路径
  • 集成底座双K8S集群扩展升级方案

    集成底座方案是应用于企业信息化建设的集成整合阶段 通过建立统一 标准 柔性 可复用 可扩展的IT架构 解决企业信息化建设过程中缺乏整体规划 集成整合难度大 安全管控不到位等问题 强化企业信息化的架构建设 集成整合 数据治理 安全管控的水平
  • 腾讯测开笔试题

    测开笔试题分享 一个数组里面有混序的正负数 按照以下要求重新排列 1 按照正负间隔的顺序排列 2 同一个符号的数相对顺序不变 3 若某一个符号的数较多 按原顺序放在最后 例如输入 1 2 3 7 9 5 3 4 7 8 11 3 2 期望输
  • .Net WinForm 中关于输入法打开却无法输入中文总结

    根据前面的兄弟们解决方法我做了下总结 希望对以后遇到此问题的同行提供点帮助 大家如果还有好的方法也请回复提供我 共同学习 出现这个问题时我的输入法设置为 注意我这里使用简体中文美式键盘 然后我删除了简体中文美式键盘 添加了英语 美国 美式键
  • Git命令语句

    一 关于Git 1 Git介绍 Git是一个开源的分布式版本控制系统 用于敏捷高效的处理任何或大或小的项目 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件 版本控制 版本控制是一种在开发
  • Android ActionBar的基本用法

    本文翻译了这篇文章 Using the Android action bar ActionBar Tutorial 1 ActionBar的简介 ActionBar位于Activity的顶部 可用来显示activity的标题 Icon Ac
  • 一周AI看点

    本期一周AI看点包括 技术前沿 行业 观点 应用以及投融资等方面 技术前沿 CCAI 2017 香港科技大学计算机系主任杨强 论深度学习的迁移模型在7月22 23日举办的CCAI 2017上 香港科技大学计算机与工程系主任 AAAI Fel
  • 案例:使用seaborn分析泰坦尼克号生还者数据

    目录 一 数据来源 数据的导入 二 主要分析的内容 定义问题 泰坦尼克号乘客基本信息分布情况 乘客的信息与生还数据是否有关联 三 数据清洗 3 1 查看是否有缺失值 3 2 查看数据基本信息 3 3 绘制年龄分布图 通过seaborn的di
  • 学习笔记-架构的演进之k8s的存储生态系统-3月day11

    文章目录 前言 块存储 文件存储 对象存储 总结 附 前言 随着 Kubernetes 的 CSI 规范成为容器业界统一的存储接入标准 现在几乎所有的云计算厂商都支持自家的容器通过 CSI 规范去接入外部存储 能够应用于 CSI 与 Fle
  • 获取JSON里面result的值 以及将里面的(List数组或对象)转换出来并读取到

    前言 记录一下今天的问题 首先我是在定时任务了 每次当项目启动时都需要调用别人的接口他来返回我数据 我并获取到他的数据进行同步更新 到我的数据库表里 那么怎么获取到呢 下面废话不多说 这是我打印出 返回给我的数据 为虚构数据 仅参考 suc
  • 2.深入了解bind函数

    bind函数 1 查看方法 2 详细解说 中文 bind函数 3 bind文档 1 查看方法 使用指令 man bind 2 详细解说 中文 bind函数 1 功能 bind函数把一个本地协议地址赋予一个套接字 对于网际网协议 协议地址是3
  • C# 集合总结

    1 Array ArrayList List lt 类型 gt 数组 连续分配的 查询速度快 但增删不方便 region 链表 2 LinkedList lt 类型 gt LinkedListNode lt 类型 gt 链表 非连续分配 每
  • 第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do