【DHT22】

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


【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);
}
}
附件代码文件:
谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号2974278195有问题可添加看到必回。,免费领取更多STM32库函数代码,迅速解决疑惑问题
请问,我用的是不同GPIO引脚,怎么改?