STM32F103基于I2C协议的AHT20温湿度传感器的数据采集

文章目录

  • 一、原理
    • 1.I2C
    • 2.软件I2C
    • 3.硬件I2C
  • 二、实现
    • 1.配置
    • 2.代码
  • 三、结果
  • 四、总结
  • 五、参考
  • 六、源码
    • 1. github
    • 2. gitee

一、原理

1.I2C

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

2.软件I2C

软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟I2C协议的时序。

3.硬件I2C

硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。

二、实现

本次实验通过软件I2C模拟实现

1.配置

通过CubeMX配置好对应引脚以及串口
STM32F103基于I2C协议的AHT20温湿度传感器的数据采集_第1张图片
本次实验使用PB6模拟SCL,PB7模拟SDA.

2.代码

在奥松官网下载AHT20芯片代码
http://www.aosong.com/class-36-2.html
官方代码使用的是PB14,PB15引脚需要修改对应的引脚才可以正常使用
main函数代码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * 

© Copyright (c) 2021 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */
/* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "dma.h" #include "i2c.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include #include "AHT20-21_DEMO_V1_3.h" void SystemClock_Config(void); 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; } int main(void) { /* USER CODE BEGIN 1 */ uint32_t CT_data[2]={ 0,0}; volatile int c1,t1; Delay_1ms(500); HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); //初始化AHT20 AHT20_Init(); Delay_1ms(500); while (1) { /* USER CODE END WHILE */ AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次 //AHT20_Read_CTdata_crc(CT_data); //crc校验后,读取AHT20的温度和湿度数据 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 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****/

三、结果

while循环没两秒左右读取一次温湿度并且通过串口打印
STM32F103基于I2C协议的AHT20温湿度传感器的数据采集_第2张图片

四、总结

通过软件模拟可以实现I2C

五、参考

六、源码

1. github

https://github.com/TangtangSix/Stm32Temperature

2. gitee

https://gitee.com/tangtangsix/Stm32Temperature

你可能感兴趣的:(stm32,嵌入式开发,stm32)