【STM32(HAL库)--DHT11温湿度传感器】

这篇具有很好参考价值的文章主要介绍了【STM32(HAL库)--DHT11温湿度传感器】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

stm32控制DHT11温湿度传感器,进行温湿度的读取.以下是自己的一点学习过程和心得,若有不妥之处,还望各位大佬指正,在下感激不尽.

一.DHT11产品概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每DHT1传感器都在极为精确的湿度校验室中进行校准,校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口, 使系统集成变得简易快捷。超小的体积、极低的功耗, 信号传输距离可达20米以上, 使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

二.数据访问

串行接口 (单线双向)

微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+ 8bit湿度小数数据+ 8bi温度整数数据+ 8bit温度小数数据+ 8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据” 所得结果的末8位
可见其数据读取是很简单的,下面来看看其时序图:
1.通讯过程如图1所示使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

图1

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒(代码中一般为20毫秒),主机把总线拉高20-40毫秒,保证DHT11能检测到起始信号。 DHT11接收到主机的开始信号后,等待主机开始信号结束,由于是单总线,在主机发送起始信号要将DHT11的data引脚配至为输出模式,主机开始信号结束后,就要开始读数据,将DHT11的data引脚配至为输入模式.然后DHT111发送80us低电平响应信号.又发送80us高电平响应信号,即读取DHT11的响应信号,(主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高)使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.也就是通过读取电平是高,还是低且持续时间的长短来判断.

格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后, DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

数字0信号表示方法如图4所示
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

数字1信号表示方法.如图5所示
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

三.CubeMX配置

(1)时钟配置

如下图分别为设置HSE(高速外部时钟)以及时钟树的配置。选定HSE之后芯片会自动选定两个引脚用来连接外部晶振,设置LSE之后配置时钟树,设置HCLK为72MHz(最高72MHz,也可以配置其他),其配置图如图所示。
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

(2)调试接口配置

如图所示,将调试接口设置的设置为SW模式,占用芯片两个引脚。

使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

(3)GPIO配置

如图,在CubeMX中芯片的引脚中点击鼠标左键可以给引脚设置功能。这里将pPF0设置为输出模式(由于DHT11只有一根数据线,所以其交互方式是半双工,也就是在运行时候需要动态改变该引脚的输入与输出方向,在这里只做简单的配置,其具体配置需要在代码里修改)。
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

(4)串口配置

为显示结果,用串口将转换结果传到电脑上,设置为异步模式,波特率为115200Bits/s,其UART配置如下图所示。设置完成之后会自动引出两个引脚用于串口通信。使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机
这里的串口,我在代码中进行了重定义,参考代码.

(5)TIM定时器配置

由于HAL库中没有微秒级延时函数,所以这里采用定时器取计数,达到微秒级延迟。设置定时器为内部时钟,由于设置的MCU主频为72MHz,所以这边设置(72-1)分频,这样就刚好是1MHz,也就达到了1us的时间,后续就由软件实现延时函数。
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

(6)引脚使用情况

本次除了调试接口和外部震荡接口外,还有PF0连接DHT11传感器的数据传输引脚.
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

四.CubeMX–HAL库代码

(1)TIM定时器实现us级延时,实现us级延迟

void delay_us(uint16_t nus)
{
	__HAL_TIM_SET_COUNTER(&htim1, 0);
	__HAL_TIM_ENABLE(&htim1);
	while (__HAL_TIM_GET_COUNTER(&htim1) < nus)
	{
	}
	__HAL_TIM_DISABLE(&htim1);
}

(2) 数据引脚方向

void DHT11_OUT(void )//输出引脚
{
	GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
void DHT11_IN(void )//输入引脚
{
	GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT ;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}

(3) DHT11的驱动函数(根据时序图来实现)

dht11.c文件


void DHT11_REST(void ) //主机发出起始信号
{
	DHT11_OUT();
	HAL_GPIO_WritePin (GPIOF ,GPIO_PIN_0 ,GPIO_PIN_RESET );
	HAL_Delay (20);
	HAL_GPIO_WritePin (GPIOF ,GPIO_PIN_0 ,GPIO_PIN_SET );
	delay_us (30);
}

//gpio端口为输入模式时,配置为上拉输入或者浮空输入,因外接上拉电阻,默认为高电平
//当有负信号输入时,gpio端口为1.
//若有负信号输入,当信号引脚连接到GND或者其他低电平信号时,GPIO端口会检测到低电平并显示为0。
//这是因为负信号的优先级高于上拉电阻的电平设置。


uint8_t DHT11_Check(void)
{
    uint8_t retry = 0;

    DHT11_IN();  // 设置数据引脚为输入模式

    while (HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_0) == 1 && retry < 80)
    {
        retry++;
        delay_us(1);  // 延迟1微秒
    }

    if (retry >= 80)
        return 1;  // 如果在规定时间内引脚仍为高电平,表示传感器未响应,返回错误代码 1
    else
        retry = 0;

    while (HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_0) == 0 && retry < 80)
    {
        retry++;
        delay_us(1);  // 延迟1微秒
    }

    if (retry >= 80)
        return 1;  // 如果在规定时间内引脚仍为低电平,表示传感器未响应,返回错误代码 1

    return 0;  // 传感器响应正常,返回成功代码 0
}
//读取一个位,参考高低电平的时序
uint8_t DHT11_Read_Bit(void)
{
	uint8_t retry=0;
	while((HAL_GPIO_ReadPin (GPIOF ,GPIO_PIN_0)==1) && (retry <100))
	{
		retry ++;
		delay_us (1);
	}
	retry=0;
	while((HAL_GPIO_ReadPin(GPIOF ,GPIO_PIN_0)==0) && (retry <100))
	{
		retry ++;
		delay_us (1);
	}
	delay_us (40);
	if(HAL_GPIO_ReadPin (GPIOF ,GPIO_PIN_0 )==1)
		return 1;// 返回读取到的位为高电平
	else 
		return 0;// 返回读取到的位为低电平
}

//读取一个字节,接收数据
uint8_t DHT11_Read_Byte(void)
{
	uint8_t dat=0;
	for(uint8_t i=0;i<8;i++)
	{
		dat <<= 1;
		dat |= DHT11_Read_Bit();
	}
	return dat;

}
//更据上面的数据格式,解码数据
uint8_t DHT11_Read_Data(uint8_t* humi, uint8_t* temp)
{
    uint8_t buf[5];  // 存储读取到的5个字节数据的缓冲区

    DHT11_REST();  // 初始化传感器通信

    if (DHT11_Check() == 0)  // 检查传感器是否正常响应
    {
        for (uint8_t i = 0; i < 5; i++)
            buf[i] = DHT11_Read_Byte();  // 逐个字节读取传感器发送的数据

        if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])  // 校验数据的准确性
        {
            *humi = buf[0];  // 将湿度值存储到指定的变量中
            *temp = buf[2];  // 将温度值存储到指定的变量中
        }
    }
    else
    {
        return 1;  // 传感器响应异常,返回错误代码
    }

    return 0;  // 读取数据成功,返回正常代码
}

(4) 函数的声明

dht11.h文件

#ifndef __dht11_h
#define __dht11_h

#include "main.h"

void DHT11_REST(void);                            //复位DHT11
uint8_t DHT11_Check(void);                       //DHT11状态反馈
uint8_t DHT11_Read_Bit(void);                    //读DHT11一位数据
uint8_t DHT11_Read_Byte(void);                   //读DHT11一字节数据
uint8_t DHT11_Read_Data(uint8_t* humi,uint8_t* temp);     //DHT11数据显示

#endif /*__dht11_h*/

(5) main中声明

	uint8_t temperature = 1;      //给一个初始化,用与判断               
	uint8_t humidity = 1; 
//上电先检测,电路是非有问题
DHT11_REST();                 //复位DHT11
  while(DHT11_Check())                           //检测DHT11连接
  {
	  printf ("No Connect!\r\n");
	  HAL_Delay(500);
  }
	printf ("Success!\r\n");

(6) 主函数

在while中

DHT11_Read_Data(&humidity,&temperature);
	
printf("temperature : %d ^C\r\n ",temperature) ;
printf ("humidity : %d %% \r\n",humidity);
HAL_Delay(100);

五.printf()函数重定义

在串口函数中加入下列代码,并在main()中加入#include “stdio.h”.

typedef struct __FILE FILE;

int fputc(int ch,FILE*stream)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
	return ch;	
}

且要按下图操作,即可重定义完成
使用hal库对dht11进行采集,stm32,嵌入式硬件,单片机

(六)声明

由于个人能力有限,若有不对之处,还望各位指正,在下感激不尽.文章来源地址https://www.toymoban.com/news/detail-851704.html

到了这里,关于【STM32(HAL库)--DHT11温湿度传感器】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(38)
  • stm32连接DHT11温湿度传感器

    目录 1. DHT11简介 1.1. 连接电路  1.2. 串行接口 (单线双向)  2. cubeMX设置 3. 代码开发  3.1. 实现定时函数 3.2. 打开串口调试 3.4. 测试代码实现 4. 运行效果 信息如下: 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使 用合适的上拉电阻  DHT11的供电电压为 3-5

    2023年04月16日
    浏览(37)
  • STM32+DHT11采集温湿度传感器数据

            DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅

    2024年02月07日
    浏览(34)
  • 玩转传感器——DHT11温湿度传感器(STM32版)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产

    2024年02月03日
    浏览(42)
  • 【STM32】DHT11温湿度模块传感器详解&代码

    DHT11是数字温湿度传感器,测量范围:湿度20%-95%,温度0-50℃,广泛应用于加湿器、温湿度计、空调、汽车等领域。 如上图DATA引脚用于MCU与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右(超时时间的判断)。一次完整的数据传输为40bit,高位先出(MSB最高

    2024年02月12日
    浏览(44)
  • STM32+DHT11温湿度传感器(含完整代码)

    前言 DHT11数字温湿度传感器是一种数字信号输出的温湿度传感器,具有高可靠性和长期稳定性。它采用专用的数字模块和温湿度传感技术,提供准确的温湿度数据。传感器内部包含感湿元件和测温元件,并与高性能单片机连接。因此,该传感器具有优异的品质、快速响应、抗

    2024年04月08日
    浏览(62)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(36)
  • STM32F4_DHT11数字温湿度传感器

    目录 前言 1. DHT11简介 2. DHT11数据结构 3. DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h         DHT11数字温湿度传感器 不但能测温度

    2024年02月08日
    浏览(33)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(47)
  • ESP32单片机使用DHT11温湿度传感器的实践与代码解析

    摘要:本文将介绍如何使用ESP32单片机与温湿度传感器进行连接和数据读取。通过实例代码的解析,帮助读者了解实现温湿度检测的原理和方法。 一、引言 ESP32是一款功能强大的微控制器,广泛应用于物联网、智能家居等领域。在许多应用场景中,温湿度传感器是不可或缺的

    2024年02月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包