DHT22温湿度传感器

news2024/11/18 5:43:30

        DHT22 是一种常见的温湿度传感器,能够测量环境的温度和相对湿度,并通过单总线协议传输数据。它工作原理简单可靠,适合应用于环境监测领域。

        如何启动DHT22传感器,使用什么通信协议。

DHT22 的工作原理

1. 传感器结构
  • 湿度检测:通过电容式湿度传感器测量空气中水汽含量。
  • 温度检测:通过NTC热敏电阻测量温度。
  • 数据处理:传感器内部包含一个 8 位微控制器,用于处理温湿度信号并将其编码为数字信号。
  • 通信接口:单总线协议(One-Wire),通过一个数据引脚传输所有信息。

2. 工作流程
  1. 初始化阶段

    • MCU 向 DHT22 发送启动信号:通过拉低数据线(通常 1ms 以上)并随后释放。
    • DHT22 响应一个握手信号:先输出一个低电平(80us),再输出一个高电平(80us)。
  2. 数据传输阶段

    • DHT22 开始以时序形式发送 40 位数据(湿度和温度)。
    • 数据以位为单位传输,每个位的时序如下:
      • 起始低电平:50us。
      • 高电平持续时间表示位值:
        • 低于 30us:逻辑 0。
        • 高于 70us:逻辑 1。
  3. 数据内容

    • 40 位数据分为 5 个字节:
      • 前 16 位:湿度数据(高 8 位和低 8 位)。
      • 中间 16 位:温度数据(高 8 位和低 8 位)。
      • 最后 8 位:校验和(用于验证数据正确性)。
    • 温度和湿度均为 16 位整数(带符号的温度值)。
  4. 数据结束阶段

    • DHT22 拉低数据线,标志通信结束。

3. 通信时序

以下是关键时序:

  • 初始化信号:MCU 拉低数据线 1~20ms。
  • 响应信号
    • DHT22 发送低电平 80us。
    • 随后发送高电平 80us。
  • 数据时序
    • 每一位的数据由一个 50us 的低电平起始。
    • 逻辑 0:低电平后高电平持续约 26~28us。
    • 逻辑 1:低电平后高电平持续约 70us。

4. 数据格式
  • 湿度数据(16 位):

    • 高 8 位 + 低 8 位,单位为 0.1% RH。
    • 例如:0x02 0x58 表示湿度为 60.0% RH。
  • 温度数据(16 位):

    • 高 8 位 + 低 8 位,单位为 0.1°C。
    • 例如:0x01 0x2C 表示温度为 30.0°C。
    • 温度为负值时,高 8 位的最高位为 1。
    • 例如:0xFF 0x9C 表示温度为 -10.0°C。
  • 校验和

    • 校验和 = (湿度高 8 位 + 湿度低 8 位 + 温度高 8 位 + 温度低 8 位)取低 8 位。
#include "main.h"
#include <stdint.h>

#define DHT22_PORT GPIOA
#define DHT22_PIN GPIO_PIN_1

uint8_t DHT22_data[5]; // 存储从 DHT22 接收的 5 字节数据

// 设置 GPIO 为输出模式
void DHT22_SetPinOutput() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = DHT22_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);
}

// 设置 GPIO 为输入模式
void DHT22_SetPinInput() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = DHT22_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);
}

// 读取 DHT22 数据
uint8_t DHT22_ReadData(uint8_t *humidity, uint8_t *temperature) {
    uint8_t i, j;
    uint16_t raw_data = 0;

    // 初始化传感器
    DHT22_SetPinOutput();
    HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_RESET); // 拉低电平 1ms
    HAL_Delay(1); 
    HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_SET);   // 拉高电平 20-40us
    delay_us(30);
    DHT22_SetPinInput(); // 切换到输入模式

    // 检测 DHT22 的响应信号
    uint32_t timeout = 1000;
    while (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_SET) {
        if (--timeout == 0) return 1; // 超时返回
    }

    // 等待低电平结束
    timeout = 1000;
    while (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_RESET) {
        if (--timeout == 0) return 1;
    }

    // 等待高电平结束
    timeout = 1000;
    while (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_SET) {
        if (--timeout == 0) return 1;
    }

    // 读取 40 位数据
    for (j = 0; j < 5; j++) {
        for (i = 0; i < 8; i++) {
            // 等待数据起始信号
            while (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_RESET);

            // 计算高电平持续时间
            delay_us(40);
            if (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_SET) {
                raw_data |= (1 << (7 - i)); // 如果高电平持续超过 40us,则为 1
                while (HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN) == GPIO_PIN_SET);
            }
        }
        DHT22_data[j] = raw_data;
        raw_data = 0;
    }

    // 校验和检测
    if (DHT22_data[4] != (DHT22_data[0] + DHT22_data[1] + DHT22_data[2] + DHT22_data[3])) {
        return 2; // 校验和错误
    }

    // 数据解析
    *humidity = DHT22_data[0];
    *temperature = DHT22_data[2];
    return 0; // 成功
}

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

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

相关文章

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

游戏引擎学习第八天

视频参考: https://www.bilibili.com/video/BV1ouUPYAErK/ 理解下面的代码 关于虚函数 代码分解 结构体 foo 的定义&#xff1a; struct foo {int32 X;int64 Y;virtual void Bar(int c); };foo 结构体有两个成员变量&#xff1a;X&#xff08;int32 类型&#xff09;和 Y&…

Vue2教程002:Vue指令

文章目录 2、Vue指令2.1 开发者工具2.2 v-html2.3 v-show和v-if2.4 v-else和v-else-if2.5 v-on2.5.1 内联语句2.5.2 methods 2、Vue指令 2.1 开发者工具 通过谷歌应用商店安装&#xff08;需要科学上网&#xff09;通过极简插件安装 2.2 v-html Vue会根据不同的指令&#x…

计算机视觉 ---图像模糊

1、图像模糊的作用&#xff1a; 减少噪声&#xff1a; 在图像获取过程中&#xff0c;例如通过相机拍摄或者传感器采集&#xff0c;可能会受到各种因素的干扰&#xff0c;从而引入噪声。这些噪声在图像上表现为一些孤立的、不符合图像主体内容的像素变化&#xff0c;如椒盐噪声&…

[JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)

假设我们要查询数据库的用户信息&#xff0c;在MyBatis框架中&#xff0c;首先需要通过SqlSessionFactory创建SqlSession&#xff0c;然后才能使用SqlSession获取对应的Mapper接口&#xff0c;进而执行查询操作 在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xm…

node.js下载安装步骤整理

>> 进入node.js下载页面下载 | Node.js 中文网 >>点击 全部安装包 >>删除网址node后面部分&#xff0c;只保留如图所示部分&#xff0c;回车 >>点击进入v11.0.0/版本 >>点击下载node-v11.0.0-win-x64.zip(电脑是windows 64位操作系统适用) >…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

解决Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题

Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题 项目问题问题描述解决方案具体实现 项目问题 在 Jenkins 中使用 Git 参数插件 进行参数化构建&#xff0c;具有多方面的重要性和好处。这不仅提高了构建的灵活性和透明度&#xff0c;还能大大提升开发和运维效率。以下是使用…

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数

Pytest-Bdd-Playwright 系列教程&#xff08;9&#xff09;&#xff1a;使用 数据表&#xff08;DataTable 参数&#xff09; 来传递参数 前言一、什么是 datatable 参数&#xff1f;Gherkin 表格示例 二、datatable 参数的基本使用三、完整代码和运行效果完整的测试代码 前言 …

Windows内核编程准备

Windows内核编程 驱动 本课程涉及的驱动&#xff0c;是利用驱动程序的高级权限&#xff0c;去做一些用户层不能做的工作&#xff0c;严格来说&#xff0c;这些写出来的东西不能算是驱动&#xff0c;因为它不会驱动任何设备 权限 内核程序是运行在R0级的&#xff0c;因此比应…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

【代码大模型】Compressing Pre-trained Models of Code into 3 MB论文阅读

Compressing Pre-trained Models of Code into 3 MB key word: code PLM, compression, GA算法 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3551349.3556964 代码&#xff1a;https://github.com/soarsmu/Compressor.git 【why】 1.问题描述&#xff1a; code LLM …

论文《基于现实迷宫地形的电脑鼠设计》深度分析——智能车驱动算法

论文概述 《基于现实迷宫地形的电脑鼠设计》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实迷宫地…

PG-DERN 解读:少样本学习、 双视角编码器、 关系图学习网络

本文提出了一种用于 分子属性预测 的 少样本学习&#xff08;Few-shot Learning&#xff09; 模型—— PG-DERN&#xff0c;该模型结合了 双视角编码器&#xff08;Dual-view Encoder&#xff09; 和 关系图学习网络&#xff08;Relation Graph Learning Network&#xff09; 双…

w039基于Web足球青训俱乐部管理后台系统开发

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…

[2024最新] java八股文实用版(附带原理)---java集合篇

介绍一下常见的list实现类&#xff1f; ArrayList 线程不安全&#xff0c;内部是通过数组实现的&#xff0c;继承了AbstractList&#xff0c;实现了List&#xff0c;适合随机查找和遍历&#xff0c;不适合插入和删除。排列有序&#xff0c;可重复&#xff0c;当容量不够的时候…

python 异步编程之协程

最近在学习python的异步编程&#xff0c;这里就简单记录一下&#xff0c;免得日后忘记。 首先&#xff0c;python异步实现大概有三种方式&#xff0c;多进程&#xff0c;多线程和协程&#xff1b;多线程和多进程就不用多说了&#xff0c;基本上每种语言都会有多进行和多线程的…

20241112-Pycharm使用托管的Anaconda的Jupyter Notebook

Pycharm使用托管的Anaconda的Jupyter Notebook 要求 不要每次使用 Pycharm 运行 Jupyter 文件时都要手动打开 Anaconda 的 Jupyter Notebook 正文 pycharm中配置好会自动安装的&#xff0c;有的要自己配置 Pycharm中配置 文件 ——> 设置 ——> 语言和框架……&am…