实验 AHT20模块驱动

1、项目说明

该项目使用单片机驱动AHT20,目前程序使用官网提供的源代码,但是不能直接拿来用,需进行部分修改。

2、源文件修改

2.1 原文件中关于AHT20_Clock_Init函数的初始化。

void AHT20_Clock_Init(void)		
{
	RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
}

修改为

void AHT20_Clock_Init(void)		
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
}

注:区别为原 CC_APB2Periph_GPIOB,修改为 RCC_APB2Periph_GPIOB

2.2 原文件中关于Init_I2C_Sensor_Port的函数

void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
{	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ
	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ	
}

修改为

void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
{	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ	
}

注:区别为删掉GPIO_InitTypeDef GPIO_InitStruct;

2.3 将最后的main函数删除或者注释掉,防止与主函数重复

这部分函数其实可以放在main.c中使用。

微信截图_20240430160441

2.4 修改控制引脚

根据实际情况修改相应引脚,在案例中采用的是SDA对应的引脚是GPIO_Pin_15和SCL对应的引脚是GPIO_Pin_14,但是在我们使用的项目中,SDA对应的引脚是GPIO_Pin_1,SCL对应的引脚是GPIO_Pin_0,所以要进行相应的修改。由于涉及到其他内容,在后面部分继续补充。

2.5 修改AHT20-21_DEMO_V1_3.h文件

该文件在最后少了#endif语句,完成后如图所示。

image-20240430191932486

例如在案例中采用的是SDA对应的引脚是GPIO_Pin_15和SCL对应的引脚是GPIO_Pin_14,但是在板子中我们SDA对应的引脚是GPIO_Pin_1和SCL对应的引脚是GPIO_Pin_0,所以要进行批量修改。为了防止漏改和错改,这里介绍一种简单的方法。在AHT20-21_DEMO_V1_3.h文件中进行宏定义。

#define SCL_Pin  GPIO_Pin_0
#define SCL_GPIO_Port  GPIOB
#define SDA_GPIO_Pin  GPIO_Pin_1
#define SDA_GPIO_Port  GPIOB

到此为止原文件修改完毕

3、程序功能实现

3.1 项目平台搭建

采用之前已经搭建好的项目平台,该项目只实现printf功能。先将AHT20-21_DEMO_V1_3.c和AHT20-21_DEMO_V1_3.h文件复制到SYS文件夹。

image-20240430190528191

打开工程,双击USER,找到SYS文件夹,加载AHT20-21_DEMO_V1_3.c文件,如①②③操作所示。

image-20240430190725106

打开sys.h头文件,加入#include "AHT20-21_DEMO_V1_3.h"语句,如图所示。

image-20240430192033962

3.2 引脚修改

在1.4小节中提到过引脚的修改,主要是在AHT20-21_DEMO_V1_3.c文件中进行,但是考虑到同个引脚多处使用,可以采用宏定义的方法。在AHT20-21_DEMO_V1_3.h文件中进行宏定义,

#define SCL_Pin  GPIO_Pin_0
#define SCL_GPIO_Port  GPIOB
#define SDA_GPIO_Pin  GPIO_Pin_1
#define SDA_GPIO_Port  GPIOB

打开AHT20-21_DEMO_V1_3.c文件,选中GPIO_Pin_15,按下Ctrl+F。

image-20240430193325435

点击①处的Replace,在②处输入SDA_GPIO_Pin,这样所有的GPIO_Pin_15变成了SDA_GPIO_Pin,而SDA_GPIO_Pin即为GPIO_Pin_1。

image-20240430193449281

采用同样的方法将GPIO_Pin_14替换成SCL_Pin。需要注意的是在Init_I2C_Sensor_Port函数中,将第二个GPIO_SetBits函数中的第二个参数改成SCL_Pin。这是因为在原文件中理应将该引脚配置成GPIO_Pin_14,而实际配置成GPIO_Pin_15,因此在之前的替换中变成了SDA_GPIO_Pin。我们应改成SCL_Pin。改好后如图。

image-20240430201727026

3.3 main函数功能实现

在main函数初始化中完成以下内容。

image-20240430204716992

	uint32_t CT_data[2]={0,0};
	volatile int  c1,t1;
	
	LED_GPIO_Config();
	delay_init();
	My_USART1();
	printf("海创电子工作室\r\n");
	
	AHT20_Clock_Init();
	AHT20_Init();    	      
	delay_ms(500);

在while循环中完成以下内容。

AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次	

		c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值c1(放大了10倍)
		t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍)
		printf("正在检测");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		printf("\r\n");
		delay_ms(1000);
		printf("温度:%d%d.%d",t1/100,(t1/10)%10,t1%10);
		printf("湿度:%d%d.%d",c1/100,(c1/10)%10,c1%10);
		printf("\r\n");
		printf("等待");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		delay_ms(100);
		printf(".");
		printf("\r\n");
		delay_ms(1000);				

到此为止,可以实现温湿度的读取。

image-20240430204847266

代码供下载:

链接:https://pan.baidu.com/s/15OxUGr3usHsco8anckpgSw?pwd=hcdz

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值