实验 AHT20模块驱动

ops/2024/10/19 13:18:10/

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


http://www.ppmy.cn/ops/25293.html

相关文章

Python+Selenium基于PO模式的Web自动化测试框架

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供…

技术解答 | ESP32 S2有虚拟U盘相关的例程吗?

最近在帮一个客户做ESP32-S2R2票务打印机项目的时候,对面工程师提出这样的问题,ESP32S2有虚拟U盘相关的例程吗? 针对这样的问题,启明云端工程师给出这样的回答: esp-idf可以参考这里面的示例: https://gi…

社区新零售:重构邻里生活圈,赋能美好未来

新时代的邻里脉动 在城市的肌理中,社区作为生活的基本单元,正经历一场由新零售引领的深刻变革。社区新零售,以其独特的商业模式、创新的技术手段和以人为本的服务理念,重新定义了社区商业的边界,重构了邻里生活的形态…

Flink checkpoint 源码分析- Flink Checkpoint 触发流程分析

序言 最近因为工作需要在阅读flink checkpoint处理机制,学习的过程中记录下来,并分享给大家。也算是学习并记录。 目前公司使用的flink版本为1.11。因此以下的分析都是基于1.11版本来的。 在分享前可以简单对flink checkpoint机制做一个大致的了解。 …

Linux 系统中如何将网卡设置为桥接模式

在 Linux 系统中,将一张网卡设置为桥接模式(bridge)通常用于虚拟化技术,如连接虚拟机或容器。以下是将网卡设置为桥接模式的基本步骤: 创建一个网络桥接: 使用 brctl 命令或编辑网络配置文件来创建一个新的…

大语言模型在专业领域的应用——医疗场景下的大语言模型

大语言模型在专业领域的应用——医疗场景下的大语言模型 构建面向医疗的大语言模型数据资源总结医疗是与人类生活密切相关的重要领域之一。由于具有较强的通用任务解决能力,大语言模型被广泛用于辅助医生处理各种相关医疗任务,例如医疗诊断、临床报告生成、医学语言翻译、心理…

2024.4.23 LoadRunner 测试工具详解 —— VUG

目录 引言 LoadRunner 三大组件之间的关系 LoadRunner 脚本录制 启动并访问 WebTours 脚本录制 编译 运行(回放) LoadRunner 脚本加强 事务插入 插入集合点 插入检查点 参数化 ​编辑 打印日志 引言 问题: 此处为啥选择使用 Lo…

wireshark RTP分析参数

主要看丢弃和Delta, 丢弃就是丢掉的udp包,所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少,比如G711A,ptime20,那么delta理论上应该趋近于20. 这里的de…