在这里插入图片描述


👨‍💻个人主页:@开发者-削好皮的Pineapple!

👨‍💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 削好皮的Pineapple! 原创

👨‍💻 收录于专栏:C语言到基于STM32 的智能矿探小车


请添加图片描述

请添加图片描述

文章目录

    • 前言
    • 🎶一、DHT11模块硬件连接
    • 🎶二、DHT11模块工作原理及数据格式
      • 1. 工作原理
      • 2. 数据传输时序
        • (1)整体时序
        • (2)响应与数据准备阶段
        • (3)数据位表示方法
      • 3. 数据格式
    • 🎶三、DHT11获取温湿度代码实现
      • 1. 头文件(dht11.h)
      • 2. 源文件(dht11.c)
        • 结束语🥇


前言

在嵌入式开发中,温湿度检测是许多项目的基础功能,DHT11模块因其操作简便、成本较低等特点,常被用于温湿度数据的采集。本文将围绕基于STM32的DHT11模块温湿度检测展开介绍,帮助开发者了解相关硬件连接、工作原理、数据格式及代码实现。


🎶一、DHT11模块硬件连接


DHT11模块与开发板的连接较为简单,具体接线方式如下:

  • vcc(+) --------- 3v3 / 5v:模块电源引脚,可连接开发板的3.3V或5V电源
  • GND(-) --------- GND:模块接地引脚,连接开发板的GND
  • DAT(out) ------- GPIO引脚上:模块数据输出引脚,开发板上自带的DHT11模块的DATA接在PG9上

通过以上连接,可实现DHT11模块与开发板之间的通信,为后续的数据采集做好硬件准备。有关更详细的硬件参数等信息,可参考手册《DHT11说明书最新版.pdf》。

在这里插入图片描述


🎶二、DHT11模块工作原理及数据格式


1. 工作原理

总线空闲状态为高电平,当主机需要获取温湿度数据时,会把总线拉低,且拉低时间必须大于18毫秒,以保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,会等待主机开始信号结束,然后发送80us低电平响应信号。
主机发送开始信号结束后,延时等待20-40us,之后就可以读取DHT11的响应信号。主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,此时总线由上拉电阻拉高。

2. 数据传输时序

(1)整体时序

一次完整的数据传输包含起始信号、响应信号及数据传输阶段,时序图如下:
在这里插入图片描述

总线空闲状态为高电平,主机拉低总线>18ms发送起始信号;DHT11收到后,先发送80us低电平响应,再拉高80us准备发送数据。

(2)响应与数据准备阶段

在这里插入图片描述

  • 总线为低电平时,说明DHT11发送响应信号;
  • 响应后总线拉高80us,进入数据发送准备阶段;
  • 每一bit数据以50us低电平时隙开始,高电平持续时间决定数据位是0还是1;
  • 若读取响应信号为高电平,说明DHT11无响应,需检查线路;
  • 最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
(3)数据位表示方法
  • 数字0信号:低电平50us后,高电平持续26-28us,时序图如下:
    在这里插入图片描述

  • 数字1信号:低电平50us后,高电平持续70us,时序图如下:
    在这里插入图片描述

3. 数据格式

一次完整的数据传输为40bit,高位先出,格式为:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验和

  • 校验和 = 湿度整数 + 湿度小数 + 温度整数 + 温度小数
  • 通过校验和可验证数据传输的正确性。

🎶三、DHT11获取温湿度代码实现


1. 头文件(dht11.h)

#ifndef __DHT11_H_
#define __DHT11_H_//dht11初始化接口
void dht11_init(void);extern unsigned char  dht11_data[5];
void dht11_read_data(void);#endif

2. 源文件(dht11.c)

#include "stm32f4xx.h"
#include "dht11.h"
#include "delay.h"//DHT11的data引脚接在PG9上
#define DHT11_RCC RCC_AHB1Periph_GPIOG
#define DHT11_PORT GPIOG
#define DHT11_PIN GPIO_Pin_9 //GPIO引脚模式切换
//m=1:输出模式;m=0:输入模式
void gpio_mode_changed(int m)
{//使能时钟RCC_AHB1PeriphClockCmd(DHT11_RCC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;if(m) //输出模式配置{GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = DHT11_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;}else //输入模式配置{GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Pin = DHT11_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;}GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}//dht11初始化接口
void dht11_init(void)
{gpio_mode_changed(1) ; //初始化为输出模式GPIO_SetBits(DHT11_PORT, DHT11_PIN); //DATA引脚默认拉高
}//dht11发送起始信号
void dht11_start(void)
{gpio_mode_changed(1); //配置为输出模式GPIO_ResetBits(DHT11_PORT, DHT11_PIN); //拉低总线>18msdelay_ms(18);GPIO_SetBits(DHT11_PORT, DHT11_PIN); //释放总线delay_us(30); //等待20-40usgpio_mode_changed(0); //切换为输入模式//等待DHT11响应while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);//等待响应结束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET);//等待数据发送开始while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);
}//读取一个字节数据
unsigned char dht11_read_byte(void)
{gpio_mode_changed(0); //配置为输入模式unsigned char d = 0; //存储读取到的字节for(int i = 0; i < 8; i++){//等待50us低电平时隙结束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET);//延时35us:区分0和1(0的高电平≤28us,1的高电平≈70us)delay_us(35);//若仍为高电平,则为1if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET){d |= (1 << (7 - i)); //高位先存}//等待当前bit的高电平结束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);}return d;
}//读取温湿度数据
unsigned char dht11_data[5] = {0}; //存储:湿度整+湿小小+温度整+温度小+校验和
void dht11_read_data(void)
{dht11_start(); //发送起始信号//读取40bit数据(5个字节)for(int i = 0; i < 5; i++){dht11_data[i] = dht11_read_byte();}
}
结束语🥇

🔥 订阅专栏持续学习:C语言到基于STM32的智能矿探小车
💬 欢迎点赞、收藏、留言讨论,一起攻克嵌入式开发!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言初识--标识符 可见性

Go语言初识–标识符 可见性 和C语言相似&#xff0c;go语言的基本组成有&#xff1a; 包声明&#xff0c;编写源文件时&#xff0c;必须在非注释的第一行指明这个文件属于哪个包&#xff0c;如package main。引入包&#xff0c;其实就是告诉Go 编译器这个程序需要使用的包&…

Python实例之画小猪佩奇

效果图&#xff1a;python代码以及解释&#xff0c;没有运用模块。 """ 绘制小猪佩奇 """ from turtle import *def nose(x,y):"""画鼻子"""penup()# 将海龟移动到指定的坐标goto(x,y)pendown()# 设置海龟的方向&…

Unity笔记——事件中心

事件中心是什么事件中心是 Unity 游戏开发中常用的架构设计&#xff0c;它基于观察者模式 或 发布-订阅模式&#xff0c;通过委托和事件构建的一种消息管理系统。主要用于降低代码耦合度&#xff0c;实现模块间的松耦合通信的消息处理系统能大幅提升代码的可维护性和扩展性&…

Java: 反射机制的 ParameterizedType(参数化类型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一个接口&#xff0c;属于反射 API 的一部分&#xff0c;主要用于表示参数化类型&#xff08;即带有类型参数的泛型类型&#xff09;。它是 Java 反射机制中处理泛型类型信息的关键接口之一。 一、什么是参…

OkHttp 与 Retrofit 完美结合:打造高效的 Android 网络请求

前言在现代 Android 开发中&#xff0c;网络请求是几乎每个应用都必不可少的功能。OkHttp 和 Retrofit 作为当前最流行的网络请求库组合&#xff0c;为开发者提供了简洁高效的解决方案。本文将详细介绍如何将这两者结合使用&#xff0c;充分发挥它们的优势。一、OkHttp 和 Retr…

系统辨识建模

系统辨识建模 一、系统辨识建模的作用 1. 建立真实物理系统的数学模型 2. 为后续控制器/强化学习算法提供仿真环境 3. 提高控制精度和安全性 二、本文的系统辨识是怎么做的 1. 实验采集 2. 数学建模 3. 在控制系统中的作用 三、实际用法流程(简化版) 1. 系统辨识阶段 2. 强化…

Android开发:Java与Kotlin深度对比

1. 语言特性与现代性 Java (特别是 Android 主要使用的 Java 8 及之前版本): 相对冗长&#xff1a; 需要编写更多的样板代码&#xff08;如 getter/setter、findViewById 的显式类型转换、匿名内部类等&#xff09;。空指针异常 (NPE)&#xff1a; 类型系统默认允许 null&#…

米家打印机驱动:Wi-Fi 无线打印丝滑顺畅不卡顿,从此告别对打印机干瞪眼

各位小米家居控们&#xff0c;你们有没有过这种经历&#xff0c;新买的打印机回家&#xff0c;结果电脑跟它像俩傲娇的小情侣&#xff0c;死活不搭话&#xff1f;急得你想当场表演一个“打印机抱头痛哭”&#xff1f;别急&#xff0c;今天就给你们安利个神队友——米家打印机驱…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(7):自動詞 & 他動詞

日语学习-日语知识点小记-构建基础-JLPT-N3阶段&#xff08;7&#xff09;&#xff1a;自動詞 &#xff06; 他動詞1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰2、知识点&#xff08;&#xff11;&#xff09;自動詞 &#xff06; 他動…

深入理解设计模式:访问者模式详解

在软件开发中&#xff0c;我们经常会遇到需要对一个复杂对象结构进行操作的情况。随着需求的不断变化&#xff0c;我们可能需要在这个对象结构上添加各种新的操作。如果直接在对象结构中添加这些操作&#xff0c;会导致类的职责过重&#xff0c;且每次添加新操作都需要修改原有…

Linux timerfd 定时器封装

使用 timerfd epoll() 实现&#xff0c;简洁精确。没定义 MU_ERROR 宏的话替换为 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【样式效果】Vue3实现仿制iOS按钮动态效果

iOS开关效果定义变量&#xff1a; <style scoped lang"scss">.layout {// 按钮宽度$button-width: 500px;// 按钮高度$button-height: 250px;// 按钮里面圆形直径$circle-diameter: 200px;// 按钮背景与里面圆形间距$button-circle-offset:calc(($button-he…

京东疯狂投资具身智能:众擎机器人+千寻智能+逐际动力 | AI早报

每日分享全球最新AI资讯【应用商业八卦技术】&#xff0c;&#x1f30f;&#xff1a;未来世界2099应用 1、马斯克推出儿童AI"Baby Grok"引热议&#xff1a;安全性能否经受考验&#xff1f; 2、蚂蚁AQ健康应用霸榜苹果商店&#xff0c;或将联手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准

AI时代SEO技术革命&#xff1a;企业如何突破流量增长瓶颈&#xff1f;随着Google算法升级至MUM模型&#xff0c;传统SEO工具已难以应对多模态内容优化需求。在搜索引擎日均处理120亿次查询的生态中&#xff0c;企业官网平均自然流量转化周期长达6-8个月&#xff0c;因此诸如Jia…

Docker-compose:服务编排

Docker-compose 介绍 服务编排:按照一定的业务规则批量管理容器 在微服务架构的应用系统中,一般包含 N 个微服务,且每个微服务一般都会部署多个实例。此时,如果每个微服务都要手动启停,维护的工作量会很大。 要从 Dockerfile build image 或者去 docker hub 拉取 image …

异地服务器备份Mysql数据

前言异地服务器备份Mysql数据即Mysql的server端与备份服务器不是同一个。Mysql服务端安装在192.168.3.36中&#xff0c;现在需要在IP为192.168.209.129的服务器中使用mysqldump命令备份指定数据库数据;192.168.209.129没有装过Mysql客户端;1.安装Mysql客户端不安装Mysql客户端就…

NGINX 高级配置解析:`proxy_request_buffering` 使用详解

在使用 NGINX 作为反向代理服务器时&#xff0c;处理客户端请求体&#xff08;如上传文件或大体积 POST 请求&#xff09;的方式会直接影响应用性能与资源使用。其中&#xff0c;proxy_request_buffering 是一个非常关键但容易被忽略的配置项。 本文将详细介绍该指令的作用、典…

增加交叉验证和超参数调优

前文中&#xff0c;只是给了基础模型&#xff1a; PyTorch 实现 CIFAR-10 图像分类&#xff1a;从数据预处理到模型训练与评估-CSDN博客 今天我们增加交叉验证和超参数调优&#xff0c; 先看运行结果&#xff1a; 在测试集上评估最终模型 最终模型在测试集上的准确率&…

解决pip指令超时问题

用pip指令&#xff0c;在安装Django3.2时报错&#xff0c;询问ChatGpt后得到的解决方案pip 下载超时 —— 是 当前网络连接到 PyPI 官方源太慢或不稳定&#xff0c;甚至可能连不上了&#xff0c;而 pip 默认的超时时间又太短&#xff0c;就导致了中途失败&#xff1a;ReadTimeo…

Oracle定时清理归档日志

线上归档日志满了&#xff0c;系统直接崩了&#xff0c;为解决这个问题&#xff0c;创建每月定时清理归档日志。 创建文件名 delete_archivelog.rman CONFIGURE ARCHIVELOG DELETION POLICY CLEAR; RUN {ALLOCATE CHANNEL c1 TYPE DISK;DELETE ARCHIVELOG ALL COMPLETED BEFORE…