【STM32单片机-库函数】DHT22温湿度采集

【完整工程源码】↓:STM32单片机DHT22温湿度数据采集实验项目_温湿度实验keil-嵌入式文档类资源-CSDN下载基于STM32单片机的DHT22模块温湿度数据采集的Keil工程,串口1间隔1s实时打印温湿度温湿度实验keil更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_42605300/16604900

【DHT22】

DHT22温湿度模块

【0——操作演示】

模块I/O口接PG11引脚,通过USART1串口1,打开电脑串口调试助手,再开启串口,最后会看见温湿度数据按行输出,如下图:

【main.c】温湿度采集
实验现象

【1——头文件】dht22.h

#ifndef __DHT22_H
#define __DHT22_H 
#include "sys.h"  
#include "delay.h"

/************************************************************
**> File Name: 			dht22.c																	
**> Description:		DHT22/AM2302 GPIO - hardware driver
**> Author: 				xinso
**> blog:  					xinso.blog.csdn.net
**> Created Time: 	2021.04.06
**--------------------------------------------------------
**> 本程序只供学习使用,未经作者许可,不得用于其它任何用途
*************************************************************/

/* DHT22 I/O引脚定义 */
#define RCC_GPIO_AM2302   RCC_APB2Periph_GPIOG
#define GPIO_AM2302       GPIOG
#define PIN_AM2302        GPIO_Pin_11

#define	DHT22_DQ_OUT 			PGout(11) 		//PG11_out  
#define	DHT22_DQ_IN  			PGin(11)   		//PG11_in

/* DHT22 I/O口方向设置 */
#define DHT22_IO_IN()  {GPIOG->CRH&=0xFFFF0FFF;GPIOG->CRH|=4<<12;}	//PG11_in		 Floating 	input
#define DHT22_IO_OUT() {GPIOG->CRH&=0xFFFF0FFF;GPIOG->CRH|=3<<12;}	//PG11_out	 Pull-Push output
			

extern u8 DHT22_Init(void); 			//Init DHT22
extern u8 DHT22_Read_Data(float *temperature,float *humidity); //Read DHT22 Value
static u8 DHT22_Read_Byte(void);	//Read One Byte
static u8 DHT22_Read_Bit(void);	//Read One Bit
static u8 DHT22_Check(void);	//Chack DHT22
static void DHT22_Rst(void);	//Reset DHT22 

#endif

【2——源文件】dht22.c

#include "dht22.h"

/************************************************************
**> File Name: 			dht22.c																	
**> Description:		DHT22/AM2302 GPIO - hardware driver
**> Author: 				xinso
**> blog:  					xinso.blog.csdn.net
**> Created Time: 	2021.04.06
**--------------------------------------------------------
**> 本程序只供学习使用,未经作者许可,不得用于其它任何用途
*************************************************************/

//GPIO_Init DHT22/
u8 DHT22_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_GPIO_AM2302 , ENABLE);	 
	
 	GPIO_InitStructure.GPIO_Pin = PIN_AM2302 ;				 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIO_AM2302, &GPIO_InitStructure);				 
 	GPIO_SetBits(GPIO_AM2302,PIN_AM2302 );						 
			    
	DHT22_Rst();  
	return DHT22_Check();
} 

//Reset DHT22
void DHT22_Rst(void)	   
{                 
    DHT22_IO_OUT(); 	//输出模式
    DHT22_DQ_OUT=0; 	//拉低
    delay_ms(30);    	//Pull down Least 800us
    DHT22_DQ_OUT=1; 	//拉高 
		delay_us(30);     	//Pull up 20~40us
}

u8 DHT22_Check(void) 	   
{   
	u8 retry=0;
	DHT22_IO_IN();      //输入模式 
  while (DHT22_DQ_IN&&retry<100)   //DHT22 Pull down 40~80us
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)
	{
		return 1;	
	}
	else 
		retry=0;
  while (!DHT22_DQ_IN&&retry<100) //DHT22 Pull up 40~80us
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)
  {
		return 1;   //check error	
				
  }        
	return 0;
}

u8 DHT22_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT22_DQ_IN&&retry<100)//wait become Low level
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT22_DQ_IN&&retry<100)//wait become High level
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);         //wait 40us
	if(DHT22_DQ_IN)
		return 1;
	else 
		return 0;		   
}

u8 DHT22_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT22_Read_Bit();
    }						    
    return dat;
}

u8 DHT22_Read_Data(float *temperature,float *humidity)    
{        
 	u8 buf[5];
	u8 i;
	u8 sum;
	*humidity=0;
	*temperature=0;
	DHT22_Rst();
	if(DHT22_Check()==0)
	{
		for(i=0;i<5;i++)
		{
			buf[i]=DHT22_Read_Byte();
		}
		sum = buf[0]+buf[1]+buf[2]+buf[3];
		if(sum == buf[4])
		{
			*humidity=(float)((buf[0]<<8)+buf[1])/10;
			*temperature=(float)((buf[2]<<8)+buf[3])/10;
		}
		else
		{
			*humidity=(float)((buf[0]<<8)+buf[1])/10;
			*temperature=(float)((buf[2]<<8)+buf[3])/10;
		}
	}
	else 
	{
		return 1;
	}
	return 0;	    
}

【3.实验测试】main.c

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "dht22.h"

 int main(void)
 {	
	float temperature = 0;  	    
	float humidity = 0;  
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600);        //串口1,波特率9600
	delay_ms(1000);
	delay_ms(1000);
	while(DHT22_Init())    //DHT22初始化,模块I/O检测
	{
		printf("DHT22_Check Error!\r\n");
	}		
	DHT22_Read_Data(&temperature,&humidity);	//DHT22的初次温湿度采集
  while(1)
	{
		/* 间隔2秒采集 */
		delay_ms(1000);	
		delay_ms(1000);
		/* 温湿度间隔采集 */
		DHT22_Read_Data(&temperature,&humidity);	
		/* 温湿度数据打印串口(print重定向到串口1输出) */
		printf("\r\ntemperature =  %.2f\r\n",temperature);	
		printf("humidity    =  %.2f\r\n",humidity);
	}
 }

附件代码文件:

【delay.h】、【sys.h】、【usart.h】

谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号2974278195有问题可添加看到必回。,免费领取更多STM32库函数代码,迅速解决疑惑问题

请问,我用的是不同GPIO引脚,怎么改?

答案:STM32 I/O方向寄存器语句生成

### 回答1: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现以下功能: 首先,需要连接STM32单片机与DHT11温湿度传感器以及OLED显示屏。 然后,编写程序读取DHT11传感器的温湿度数值。可以通过引脚连接和使用相应的库函数来实现数据读取。 接下来,使用OLED显示屏库函数温湿度数据显示在OLED屏幕上。可以在屏幕上创建相应的文本框或者图标来显示温湿度值。可以使用合适的库函数调用,将温湿度数据转换为字符串格式并在屏幕上显示出来。 同时,可以设计一个定时器来定时更新温湿度数据的显示。可以设置一个适当的时间间隔来实现数据的定时更新,并使用相应的库函数来控制定时器的启动和停止。 此外,为了增加用户体验,还可以添加一些额外的功能,比如在某个温湿度阈值超过一定值时,显示警告信息或者触发报警器等。 最后,将编写好的程序下载到STM32单片机中进行测试。通过观察OLED显示屏是否能够正确显示温湿度数值,以及数据是否能够定时更新,来验证程序的正确性。 总体来说,基于STM32单片机的DHT11温湿度传感器OLED显示程序需要通过串口和I2C总线连接硬件设备,并使用相应的库函数来读取传感器数据和控制OLED显示屏,以实现温湿度数据的实时显示。 ### 回答2: 基于STM32单片机的DHT11温湿度传感器和OLED显示程序可以实现如下功能。 首先,我们需要连接DHT11温湿度传感器到STM32单片机的GPIO口。DHT11传感器的信号线接到单片机的输入GPIO口,供电线接到单片机的5V电源口,接地线接到单片机的地线。 接着,需要通过STM32的GPIO口读取DHT11传感器发送的温湿度数据。通过向DHT11传感器发送一个读取请求信号,然后在适当的时间间隔后读取传感器发送的数据,包括温度和湿度值。 接下来,我们需要将读取到的温湿度数据通过I2C或SPI协议发送到连接的OLED显示屏上显示出来。首先,需要初始化I2C或SPI接口,然后将温湿度数据传送到OLED显示屏的适当位置进行显示。可以使用相应的OLED显示屏库函数来帮助实现这一功能。 此外,为了更好地呈现温湿度数据,还可以添加一些额外的功能。例如,可以设置一个温度和湿度的阈值,当温度或湿度超过阈值时,通过OLED显示屏进行警告或提示。还可以添加一个实时钟表显示当前的时间,并将当前温湿度数据显示在时钟表上。 需要注意的是,在编写程序时,应根据单片机型号和开发环境选择相应的库函数和配置参数,确保程序正确运行。 以上是基于STM32单片机的DHT11温湿度传感器和OLED显示程序的简要说明。具体的实现细节和代码可以根据具体的需求和硬件平台进行调整和开发。 ### 回答3: 基于STM32单片机的DHT11温湿度传感器OLED显示程序主要实现了以下功能。 首先,我们需要通过STM32单片机与DHT11传感器进行通信。我们可以通过引脚连接和编程设置来实现数据的读取。在程序中,我们需要配置引脚输入/输出模式,并通过适当的延时来与DHT11发送和接收数据。 接下来,我们需要解析从DHT11传感器接收到的数据。DHT11传感器会发送40位二进制数据,其中包含温度和湿度信息。我们可以根据协议来解析这些数据,并将其存储到相应的变量中。 然后,我们需要将解析后的数据通过OLED显示屏进行显示。在STM32单片机中,我们可以使用相应的库函数来控制OLED显示屏。我们需要将温度和湿度信息转换为字符串,并使用适当的字符函数来显示在OLED屏幕上。 最后,我们可以通过循环来实现数据的持续更新和显示。以一定的时间间隔读取DHT11传感器的数据,并将其显示在OLED屏幕上。这样,我们就实现了基于STM32单片机的DHT11温湿度传感器OLED显示程序。 需要注意的是,为了确保程序的正常运行,我们还需要根据实际情况对程序进行优化和调试。这可能包括校准温湿度传感器、处理错误情况和调整程序逻辑等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜半少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值