AHT10(用于记录)

产品介绍

        由产品介绍可知,AHT10用的是IIC协议,因此可以直接用IIC协议接口模块。

传感器性能

由上图可得,温湿度分辨率为0.01、0.024。误差典型值分别为正负0.3、正负2。

测量间隔

         由图可知,AHT10每2s测量一次数据。

数据传输因为用的是IIC协议,因此可以直接查看IIC协议

 操作流程:

        基本命令

初始化命令为0xE1,触发测量为AC,软复位为BA  

  状态位说明

  在初始化完成后判断bit[3],在转换命令发送后判断bit[7]。

        设备地址

        读写位为0的时候表示写,为1的时候表示读。

初始化操作
        启动:

         启动时需等待20ms

        初始化        

        发送初始化命令,初始化命令组成为:发送地址、发送初始化命令。

读取操作
        判断是否初始化

        这里有两种操作方式,第一种是一直读取(0x71),看是否初始化完成,第二种是等40ms后再进行读取,看是否初始化完成,如未完成初始化操作,即需要发送初始化命令,此命令有两个小弟即0x08和0x00,然后等待20ms后再次判断 ,初始化完成后进入触发测量。

        触发测量

        在这里发送触发测量命令(0XAC),此参数有两个小弟、0x33和0x00,具体图如下,然后进入触发等待:

        触发等待:

        在这里由两种操作方式,第一种是一直判断bit[7]看它是否为1,或者等待一段时间后再判断,如bit[7]已经为1,则进入读取温度。

        读取温度

        温度读取如上图,发送读取命令(0X71)后,后续会有6个 字节的数据,其中第一个字节为当前状态,第二个、第三个和第四个前四位为湿度数据,可单独分开。第四个后四位、第五个、第六个为温度数据,这里可以用一个计数器来进行计数,表示已经读取到哪里了,想要得到正确的数据,还需将数据进行转换为bcd码,转换公式如下。

数据处理操作

首先让温度数据乘以2000(这里是为了后面数据好操作),再右移12位后减500。

然后再让湿度数据乘以1000,再右移12位。即得到了温度和湿度的数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AHT10是一款数字温湿度传感器,可以通过I2C接口与STM32进行通信。以下是基本的步骤: 1. 配置I2C接口:选择正确的引脚并使能I2C时钟。 2. 初始化AHT10传感器:发送启动命令,等待传感器响应,并设置传感器的采样模式和测量范围。 3. 读取温度和湿度数据:发送读取命令并等待传感器响应,然后读取传感器返回的数据并将其转换为温度和湿度值。 具体的代码实现可以参考以下示例: ```c #include "stm32f4xx.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #include "math.h" #define AHT10_ADDR 0x38 I2C_HandleTypeDef hi2c1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); void AHT10_Init(void) { uint8_t buf[3] = {0x08, 0x00, 0x00}; HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR<<1, buf, 3, 100); } void AHT10_Start(void) { uint8_t buf[1] = {0xAC}; HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR<<1, buf, 1, 100); } void AHT10_Read(float *temp, float *humid) { uint8_t buf[6]; HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDR<<1, buf, 6, 100); uint32_t raw_humid = ((uint32_t)buf[1] << 12) | ((uint32_t)buf[2] << 4) | ((uint32_t)buf[3] >> 4); uint32_t raw_temp = (((uint32_t)buf[3] & 0x0F) << 16) | ((uint32_t)buf[4] << 8) | buf[5]; *temp = (float)raw_temp * 200.0 / 1048576.0 - 50.0; *humid = (float)raw_humid * 100.0 / 1048576.0; } int main(void) { float temp, humid; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); AHT10_Init(); while (1) { AHT10_Start(); HAL_Delay(100); AHT10_Read(&temp, &humid); printf("Temperature: %.2f C, Humidity: %.2f %%\r\n", temp, humid); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 180; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` 在这个示例代码中,我们使用了STM32的I2C1接口,将AHT10传感器连接到了PB6和PB7引脚上。在主循环中,我们不断地读取温度和湿度数据,并通过串口打印出来。需要注意的是,为了正确地读取AHT10传感器的数据,我们需要在每次读取数据之前发送一个启动命令。此外,AHT10传感器的温度和湿度数据都是原始数据,需要进行一定的计算才能得到实际的温度和湿度值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值