IIC协议读取温湿度数据

本文介绍了如何使用STM32F103单片机通过I2C协议与AHT20温湿度传感器通信,详细阐述了软件I2C和硬件I2C的区别,以及数据采集、初始化、通信和解析过程,并展示了串口输出实时数据的实验步骤。
摘要由CSDN通过智能技术生成

实验内容:

1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

实验原理:

  1. 硬件连接:首先,将传感器的VCC引脚连接到供电电源,将GND引脚连接到地线,然后将SDA引脚连接到主控芯片的SDA引脚,将SCL引脚连接到主控芯片的SCL引脚。

  2. 初始化:在读取数据之前,需要先对传感器进行初始化。具体的初始化过程可以查看传感器的数据手册或者相关文档,通常需要发送一些特定的命令给传感器。

  3. 启动通信:主控芯片发送一个启动信号,即向传感器发送一个特定的起始序列,通常是一个低电平信号后跟一个高电平信号。

  4. 传输数据:主控芯片根据IIC协议的规定,向传感器发送读取数据的命令。传感器根据接收到的命令,将温湿度数据存入内部寄存器,并回应主控芯片已接收到指令。

  5. 读取数据:主控芯片再次发送启动信号,然后发送传感器设备地址以及读取数据的命令。传感器在接收到命令后,将已存储的温湿度数据发送给主控芯片。

  6. 停止通信:主控芯片发送停止信号,即向传感器发送一个低电平信号后跟一个高电平信号,表示通信结束。

  7. 解析数据:主控芯片接收到传感器发送的数据后,根据传感器的规格和数据格式,进行解析和处理,得到温湿度的实际数值。

实验步骤: 

1.进行实验配置

通过CubeMX配置好对应引脚以及串口

2.芯片下载以及实验代码

先下载AHT20芯片代码

实验代码:

main函数代码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * 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<stdio.h>
#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循环设置为每两秒读取一次温湿度并且通过串口打印

实验总结:

      本次实验学习了I2C总线通信协议,通过使用STM32F103单片机,实现了基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的数据通过串口输出到上位机。

    在实验过程中,首先需要明确“软件I2C”和“硬件I2C”的概念,软件I2C是通过程序模拟实现I2C协议的通信,硬件I2C则是通过专用硬件电路实现I2C协议的通信。本次实验采用的是硬件I2C的方式,即使用STM32F103单片机内置的I2C外设实现数据的读写。

      其次,需要仔细阅读AHT20数据手册,了解传感器的I2C通信协议和数据格式。在程序实现中,需要根据数据手册中描述的寄存器地址和操作码,通过写入I2C通信控制器的寄存器中的值,实现温湿度数据的读取。

      最后,通过串口输出将采集得到的温湿度数据发送到上位机,可以通过调试助手等工具接收并查看实时温湿度数据。

总而言之,本次实验通过实际操作深入了解了I2C总线通信协议和温湿度传感器的数据采集方法,也提高了对单片机硬件及其编程的理解和掌握程度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值