御神楽的学习记录之基于I2C协议的AHT20温湿度传感器的数据采集
2021/11/25 23:16:34
本文主要是介绍御神楽的学习记录之基于I2C协议的AHT20温湿度传感器的数据采集,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、I2C 协议
- 1.简介
- 2.硬件I2C
- 3.软件I2C
- 二、温湿度传感器的数据采集
- 1、新建项目
- 2.项目代码
- 3.采集展示
- 参考
前言
I2C 总线支持任何IC 生产过程(NMOS CMOS、双极性)。两线――**串行数据(SDA)和串行时钟 (SCL)**线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、I2C 协议
1.简介
**I2C 通讯协议(Inter-Integrated Circuit)**是由 Phiilps 公司开发的,由于它引脚少,硬件实
现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地
使用在系统内多个集成电路(IC)间的通讯。
2.硬件I2C
硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。
3.软件I2C
软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
二、温湿度传感器的数据采集
1、新建项目
1、新建stm32cuber项目
2、设置项目
2.项目代码
1、导入AHT20函数库
1、导入头文件和c文件
2、添加头文件引入路径
2、修改AHT20.c代码
将函数本地库改为HAL库相应代码
void SDA_Pin_Output_High(void) //将PB15配置为输出 , 并设置为高电平, PB15作为I2C的SDA { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;; HAL_GPIO_Init(GPIOB,& GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); } void SDA_Pin_Output_Low(void) //将P15配置为输出 并设置为低电平 { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB,& GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); } void SDA_Pin_IN_FLOATING(void) //SDA配置为浮空输入 { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;// GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init( GPIOB,&GPIO_InitStruct); } void SCL_Pin_Output_High(void) //SCL输出高电平,P14作为I2C的SCL { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); } void SCL_Pin_Output_Low(void) //SCL输出低电平 { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); } void Init_I2C_Sensor_Port(void) //初始化I2C接口,输出为高电平 { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB,& GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB,& GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); }
3、main.c代码
/* Includes ------------------------------------------------------------------*/ #include "main.h" #include "i2c.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include<stdio.h> #include "AHT20.h" /* USER CODE END Includes */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE BEGIN 0 */ int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF); //等待发送结束 while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET){ } return ch; } /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ uint32_t CT_data[2]={0,0}; volatile int c1,t1; Delay_1ms(500); /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); // MX_I2C1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ AHT20_Init(); Delay_1ms(500); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { AHT20_Read_CTdata(CT_data); c1 = CT_data[0]*1000/1024/1024; //计算得到湿度值c1(放大了10倍) t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍) printf("正在检测"); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); printf("\r\n"); HAL_Delay(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("等待"); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); HAL_Delay(100); printf("."); printf("\r\n"); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
3.采集展示
参考
https://blog.csdn.net/qq_47281915?spm=1001.2014.3001.5509
这篇关于御神楽的学习记录之基于I2C协议的AHT20温湿度传感器的数据采集的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享