STM32cubemx配置驱动DHT11模块

news2024/12/24 2:37:02

文章目录

  • 前言
  • 一、DHT11模块介绍
  • 二、DHT11引脚连接及cubemx配置
  • 三、DHT11时序分析
  • 四、DHT11代码编写
  • 总结


前言

本篇文章将带大家学习使用DHT11湿温度模块,使用这个模块可以获取当前的温度和湿度数据。DHT11可以用于智能家居,蔬菜大棚等项目当中适用范围广。

一、DHT11模块介绍

DHT11 是一种数字式温湿度传感器,由杜邦公司推出。它可以测量环境中的温度和湿度,并将测量结果以数字形式传输给微控制器或其他电子设备,适用于通过数字信号读取环境温湿度的应用场景。

DHT11 传感器使用单总线数据交换协议,可以通过一个 I/O 引脚进行控制和数据传输。它的测量精度为±2℃(在 0℃~50℃ 温度范围内)和±5%RH(在 20%~80%RH 湿度范围内),在低功耗和成本方面也表现优异。DHT11 传感器适用于许多应用场景,比如室内恒温恒湿、气象站、温室农业以及测量仓库、办公室等场所的温湿度等。

使用 DHT11 传感器的过程中需要注意一些事项。首先,DHT11 传感器测量时间较长,一般需要 1~2 秒左右才能完成一次温湿度测量。另外,传感器的电源电压范围必须在 3V~5V 之间,而且传感器的输出信号是串行数字信号,需要使用微控制器或其他数字电路进行采集和解析。因此,在接入 DHT11 传感器之前,需要对其进行一些电路设计和通信协议的处理才能正常使用。

二、DHT11引脚连接及cubemx配置

VCC----5V
GND----GND
S------信号引脚(接一个GPIO)
在这里插入图片描述
cubemx配置:
这里只需要配置一个定时器当作us级延时定时器来使用。GPIO的初始工作放到代码中实现。
在这里插入图片描述
配置一个串口来打印温度湿度数据:
在这里插入图片描述

三、DHT11时序分析

DHT11只需要通过一根数据闲就可以实现和单片机的通信:
在这里插入图片描述
根据时序图我们可以知道驱动DHT11首先需要发送一个起始信号,发送完毕后等待应答信号。

起始信号:引脚发送至少18ms低电平,然后再发送20-40us的高电平。
应答信号:低电平持续80us,高电平持续80us。
在这里插入图片描述
接收数据:
当等待到应答信号后就可以开始接受DHT11的数据了。

通过观察可以得知数据1和数据0起始部分都是50us的低电平,数据0高电平时间为26-28us之间,数据高电平时间为70us。我们主要就是根据高电平时间来区分到底是数据0还是数据1。

数据0:
在这里插入图片描述
数据1:
在这里插入图片描述
通过手册我们可以知道数据由小数部分和整数部分组成。完整的数据传输是40位,并且传感器首先发送更高的数据位。

这 40 位二进制数的组成如下:

8 位湿度整数数据位。

8 位湿度小数数据位。

8 位温度整数数据位。

8 位温度小数数据位。

8 位校验和数据位。

在这里插入图片描述

四、DHT11代码编写

有了上面时序图的分析我们就可以开始编写代码部分了。

代码部分需要注意的就是在发送完起始信号后对应数据线的GPIO要配置为输入模式,等待DHT11传输过来的应答信号和数据。在每次发送开始信号的时候都需要重新将数据引脚配置为输出引脚。

dht11.h

#ifndef _DH11_H_
#define _DH11_H_

#include"main.h"

#define u8 unsigned char 
#define u16 unsigned short
#define u32 unsigned int

//DATA IO的定义
#define DATA_SET() HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, GPIO_PIN_SET)
#define DATA_RESET() HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, GPIO_PIN_RESET)

#define DATA_READ() HAL_GPIO_ReadPin(DATA_GPIO_Port,DATA_Pin)

typedef struct
{
  u8 Data[5];//数据存放数组
  u8 index;
  u8 temp;//温度
  u8 humidity;//湿度
  
}DH11_DATA;

extern DH11_DATA DH11_data;//DH11属性封装

void DH11_Task(void);//后台轮询调用

#define DATA_Pin GPIO_PIN_7
#define DATA_GPIO_Port GPIOA


#endif


dht11.c

#include "dht11.h"

extern TIM_HandleTypeDef htim1;

static void DATA_OUTPUT(u8 flg);//DATA输出
static u8 DATA_INPUT(void);//DATA输入
static u8 DH11_Read_Byte(void);//DH11读信号

u8 DH11_Read(void);//读取DH11温度和湿度

static void Test(void);//测试程序

DH11_DATA DH11_data;

void Delay_us(uint16_t us)
{     //微秒延时
	uint16_t differ = 0xffff-us-5;				
	__HAL_TIM_SET_COUNTER(&htim1,differ);	//设定TIM1计数器起始值
	HAL_TIM_Base_Start(&htim1);		//启动定时器	
	
	while(differ < 0xffff-5){	//判断
		differ = __HAL_TIM_GET_COUNTER(&htim1);		//查询计数器的计数值
	}
	HAL_TIM_Base_Stop(&htim1);
}


void DATA_OUTPUT(u8 flg)
{
  	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.Pin = DATA_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(DATA_GPIO_Port, &GPIO_InitStruct);

	if(flg==0)
	{
		DATA_RESET();
	}
	else
	{
		DATA_SET();
	}
}

u8 DATA_INPUT(void)
{
  	GPIO_InitTypeDef GPIO_InitStruct = {0};
	u8 flg=0;
	
	GPIO_InitStruct.Pin = DATA_Pin;
  	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  	GPIO_InitStruct.Pull = GPIO_PULLUP;
  	HAL_GPIO_Init(DATA_GPIO_Port, &GPIO_InitStruct);

	if(DATA_READ()==GPIO_PIN_RESET)
	{
		flg=0;
	}
	else 
	{
		flg=1;
	}

	return flg;
}

u8 DH11_Read_Byte(void)
{
    u8 ReadDat=0;
    u8 temp=0;
    u8 retry=0;
    u8 i=0;
    
    for(i=0;i<8;i++)
    {
      while(DATA_READ()==0&&retry<100)//等待直到DHT11输出高电平
      {
        Delay_us(1);
        retry++;
      }
      retry=0;
      Delay_us(40);
      if(DATA_READ()==1)
      {
        temp=1;
      }
      else
      {
        temp=0;
      }
      while(DATA_READ()==1&&retry<100)//等待直到DHT11输出低电平,表示退出。本轮1bit信号接收完毕。
      {
        Delay_us(1);
        retry++;
      }
      retry=0;
      ReadDat<<=1;
      ReadDat|=temp;
    }
    
    return ReadDat;
}

u8 DH11_Read(void)
{
  u8 retry=0;
  u8 i=0;
  
  DATA_OUTPUT(0);//设置为输出模式MCU向DH11发送信号
  HAL_Delay(18);
  DATA_SET();
  Delay_us(20);
  
  DATA_INPUT();//设置为输入模式DH11向MCU发送信号
  Delay_us(20);
  if(DATA_READ()==0)
  {
    while(DATA_READ()==0&&retry<100)
    {
      Delay_us(1);
      retry=0;
    }
    retry=0;
    while(DATA_READ()==1&&retry<100)
    {
      Delay_us(1);
      retry++;
    }
    retry=0;
    
    for(i=0;i<5;i++)//Data[0]湿度, Data[2]温度。Data[1]和Data[3]分别为0和2的小数位。Data[4]用于校验。
    {
      DH11_data.Data[i]=DH11_Read_Byte();
    }
    Delay_us(50);
  }
  u32 sum=DH11_data.Data[0]+DH11_data.Data[1]+DH11_data.Data[2]+DH11_data.Data[3];//校验
  if((sum)==DH11_data.Data[4])
  {
    DH11_data.humidity=DH11_data.Data[0];//获取湿度
    DH11_data.temp=DH11_data.Data[2];//获取温度
    return 1;    
  }
  else
  {
    return 0;
  }
}

void Test(void)
{
  if(DH11_Read())
  {
    DH11_data.index++;
    if(DH11_data.index>=128)
    {
      DH11_data.index=0;
    }
  }
   
}


void DH11_Task(void)
{
     Test();
}

main函数测试代码:
这里需要注意的就是DHT11的数据读取不要太快了,因为DHT11数据转换也是需要一定时间的。

	DH11_Task();
	printf("Temp is %d\r\n", DH11_data.temp);
	printf("Hum is %d\r\n", DH11_data.humidity);
	
    HAL_Delay(3000);

总结

本篇文章就介绍到这里,大家可以自己尝试进行DHT11的驱动程序编写。
源码将放到公众号中:回复数字8即可得到源码。

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

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

相关文章

SpringBoot+layUI实现表格的某一列数据刷新功能案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

mysql执行计划explain

mysql 执行计划 explain 介绍 mysql8.0为例&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/explain-output.html EXPLAIN为语句中使用的每个表返回一行信息 SELECT。它按照 MySQL 在处理语句时读取它们的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行&…

四维轻云平台常见问题及解决方法

1、在地图中看不见加载的点云或倾斜摄影模型数据&#xff1f; 若点云或模型数据加载后&#xff0c;在地图中看不见&#xff0c;可能是地形的高度高于倾斜模型的高度&#xff0c;导致数据漂浮在空中或者在地形以下&#xff0c;可通过增加数据的移动值Y来调整点云或者模型数据的…

《Java并发编程实战》课程笔记(一)

并发领域的全景图 并发编程的三个核心问题 并发编程可以总结为三个核心问题&#xff1a;分工、同步、互斥。 分工指的是如何高效地拆解任务并分配给线程&#xff1b; Java SDK 并发包里的 Executor、Fork/Join、Future 本质上都是⼀种分工方法。除此之外&#xff0c;并发编程…

吉时利 Keithley 2700数据采集器技术参数

概述&#xff1a; 每个 2700 系列系统均将精密测量、开关和控件集于一个紧凑集成的机箱中&#xff0c;适用于机架安装或台式应用。虽然所有三个系统的核心功能和编程是相同的&#xff0c;但各个主机都具有独特的功能。例如&#xff0c;2701 型具有 10/100BaseTX 以太网接口&am…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月24日论文合集)

文章目录 一、检测相关(7篇)1.1 Learning Remote Sensing Object Detection with Single Point Supervision1.2 Online Open-set Semi-supervised Object Detection via Semi-supervised Outlier Filtering1.3 Generalizable Synthetic Image Detection via Language-guided Co…

代码随想录训练营Day51| 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结

目录 目录 学习目标 学习内容 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 学习目标 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结 学习内容 309.最佳买卖股票时机含冷冻期 309. 最佳买卖股票时机含冷冻期 - 力扣&#xff0…

大模型知识Out该怎么办?浙大团队探索大模型参数更新的方法—模型编辑

夕小瑶科技说 原创 作者 | 小戏、Python 大模型在其巨大体量背后蕴藏着一个直观的问题&#xff1a;“大模型应该怎么更新&#xff1f;” 在大模型极其巨大的计算开销下&#xff0c;大模型知识的更新并不是一件简单的“学习任务”&#xff0c;理想情况下&#xff0c;随着世界…

网络协议 — IPSec 安全隧道协议族

目录 文章目录 目录IPSec 安全隧道协议族封装协议Authentication HeaderEncapsulating Security Payload 封装模式传输模式隧道模式 安全偶联协商Security AssociationInternet Key ExchangeIKE 的交换过程 IPSec Virtual Private NetworkIPSec NAT-TTransport 模式Tunnel 模式…

mjpg-streamer框架分析

mjpg-streamer框架分析 文章目录 mjpg-streamer框架分析框架maininput_initinput_runoutput_init 框架 main 这个函数是一个C程序的主函数&#xff0c;接受命令行参数并执行相应的操作。下面是这个函数的要点&#xff1a; 定义了一些变量&#xff0c;包括输入插件数组input、输…

知识点滴 - dBm和mW的转换

分贝毫瓦dBm&#xff0c;decibel-milliwatts&#xff0c;全写为“decibel relative to one milliwatt”&#xff0c;为一个指代功率的绝对值&#xff0c;而不同于dB只是一个相对值。 dBm或dBmW&#xff08;分贝-毫瓦&#xff09;用于表示功率的水平或级别&#xff0c;以分贝&am…

Android | 关于 OOM 的那些事

前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量的对象无法被释放)导致…

精准数据分析,TeeChart为企业量身定制可视化退休预估方案

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 点击立即下载最新版Tee…

docker下不同容器的网络互相访问问题

目录 背景 ​编辑 docker网络模式 解决方法 mysql下 docker-compose下网络设置 nacos 效果 背景 我这边有两个容器&#xff0c;宿主机ip为 192.168.1.115&#xff0c;一个mysql&#xff0c;一个nacos&#xff0c;部署在主机上&#xff0c;使用的默认网络bridge&#xff…

学习SpringBoot入门知识,附带教程源码分享,快速掌握开发技巧-【imooc-java2021】体系课-Java工程师 2022版

学习SpringBoot入门知识&#xff0c;附带教程源码分享&#xff0c;快速掌握开发技巧 目录福利&#xff1a;文末有分享SpringBoot教程及源码哦 一、Spring Boot 是什么二、为什么要使用 Spring Boot三、快速入门3.1 创建 Spring Boot 项目3.1.1 通过 Spring Initializr 来创建1、…

微信小程序入门开发懂你找图小程序

文章目录 搭建 tabbar页面路径 首页模块tabs组件需求推荐组件精选大图月份热门分类模块需求 分类详情业务 首页模块专辑模块需求 专辑详情精美视频需求 视频详情需求 图片详情需求 搭建 tabbar 页面路径 页面名称路径首页index横屏horizontal精美视频video搜索search我的mine …

MySQL——存储引擎于索引应用

文章目录 一、 存储引擎1.1 MySQL结构1.2 存储引擎简介1.3 存储引擎特点1.3.1 InnoDB1.3.1.1 InnoDB 基本介绍1.3.1.2 InnoDB 逻辑存储结构 1.3.2 MyISAM1.3.3 Memory 1.4 三种引擎特点及区别1.5 存储引擎选择 二、 索引 - 重点2.1 介绍2.2 索引结构2.2.1 B-Tree 多路平衡二叉树…

【Linux:动态库与静态库】

1 动态库与静态库的概念 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使…

企业微信4.1.6 版本新功能介绍

一、效率工具与基础体验优化 文档 文档增加了丰富的模板&#xff0c;包含项目管理、日报周报、信息收集等多种场景&#xff0c;帮助了解更多文档功能&#xff0c;助力日常工作。 权限管理新增了「成员加入确认」开关&#xff0c;开启后需要管理员确认才能添加成员&#xff0…

相爱相杀的在线帮助文档语雀、Baklib、石墨文档,到底有何区别?

在线帮助文档是现代企业不可或缺的一部分&#xff0c;它提供了针对特定产品或服务的详细说明和指南&#xff0c;以帮助用户更好地理解产品或服务并解决问题。目前市面上有许多在线帮助文档工具&#xff0c;其中语雀、Baklib和石墨文档是比较受欢迎的三种&#xff0c;本文将对它…