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中使用。
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语句,完成后如图所示。
例如在案例中采用的是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文件夹。
打开工程,双击USER,找到SYS文件夹,加载AHT20-21_DEMO_V1_3.c文件,如①②③操作所示。
打开sys.h头文件,加入#include "AHT20-21_DEMO_V1_3.h"语句,如图所示。
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。
点击①处的Replace,在②处输入SDA_GPIO_Pin,这样所有的GPIO_Pin_15变成了SDA_GPIO_Pin,而SDA_GPIO_Pin即为GPIO_Pin_1。
采用同样的方法将GPIO_Pin_14替换成SCL_Pin。需要注意的是在Init_I2C_Sensor_Port函数中,将第二个GPIO_SetBits函数中的第二个参数改成SCL_Pin。这是因为在原文件中理应将该引脚配置成GPIO_Pin_14,而实际配置成GPIO_Pin_15,因此在之前的替换中变成了SDA_GPIO_Pin。我们应改成SCL_Pin。改好后如图。
3.3 main函数功能实现
在main函数初始化中完成以下内容。
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);
到此为止,可以实现温湿度的读取。
代码供下载:
链接:https://pan.baidu.com/s/15OxUGr3usHsco8anckpgSw?pwd=hcdz