STM32硬件IIC驱动AHT20

 1、IIC配置

2、aht20.c


#include "aht20.h"

float AHT20_Temp,AHT20_Humidity;

extern I2C_HandleTypeDef hi2c1;

static void AHT20_Send(uint8_t *data, uint8_t len)
{
  HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS_W, data, len, 0xFF);
}

static void AHT20_Receive(uint8_t *data, uint8_t len)
{
  HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS_R, data, len, 0xFF);
}

/**
 * @brief AHT20初始化函数
 */
void AHT20_Init(void)
{
  uint8_t readBuffer;
  HAL_Delay(40);
  AHT20_Receive(&readBuffer, 1);        //获取传感器状态
  if((readBuffer & 0x08) == 0x00)       //校准是否开启
  {
    uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00}; 
    AHT20_Send(sendBuffer, 3);          //开启校准
  }
}

/**
 * @brief AHT20测量函数
 * @note 传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。
 * 若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。
 **/
void AHT20_Measure(void)
{
  uint8_t sendBuffer[3] = {0xAC, 0x33, 0x00};
  uint8_t readBuffer[6];
  AHT20_Send(sendBuffer, 3);
  HAL_Delay(75);        //延时等待数据转换
  AHT20_Receive(readBuffer, 6);

  if((readBuffer[0] & 0x80) == 0x00)
  {
    uint32_t data = 0;
    data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);
    AHT20_Humidity = data * 100.0f / (1 << 20);
    data = (((uint32_t)readBuffer[3] & 0x0F) << 16) + (((uint32_t)readBuffer[4]) << 8) + (uint32_t)readBuffer[5];
    AHT20_Temp = data * 200.0f / (1 << 20) - 50;
  }
}

3、aht20.h

#ifndef __AHT20_H__
#define __AHT20_H__

// AHT20 IIC器件地址
#define AHT20_ADDRESS_W 0x70
#define AHT20_ADDRESS_R 0x71

void AHT20_Init(void);
void AHT20_Measure(void);

#endif

### 使用 STM32IIC 协议读取 AHT20 温湿度传感器的数据 为了实现通过 IIC 接口从 AHT20 传感器读取数据,在 STM32 上需完成如下设置: #### 配置硬件连接 确保 STM32 的 SDA (串行数据线) 和 SCL (串行时钟线) 正确连接到 AHT20 对应引脚上。通常情况下,SDA 连接到 PB7, SCL 连接到 PB6 或者根据具体项目需求调整。 #### 初始化 HAL 库和 IIC 外设 利用 STM32CubeMX 工具配置 IIC 功能并生成初始化代码框架。选择合适的 GPIO 及其模式来匹配实际连线情况,并开启相应的外设时钟[^1]。 ```c // 在 main 函数前声明全局变量用于存储温度和湿度值 float temperature; float humidity; int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock to 72 MHz */ SystemClock_Config(); /* Initialize all configured peripherals & user code */ MX_GPIO_Init(); MX_I2C1_Init(); // 假定使用的是 I2C1 // 调用自定义函数启动 AHT20 并校准它 if (!AHT20_Init()) { Error_Handler(); } } ``` #### 编写驱动程序以操作 AHT20 设备 创建 `AHT20-21_DEMO_V1_3.c` 文件并将其实现细节加入工程中。此文件包含了针对 AHT20 的特定命令发送、状态查询以及测量结果解析等功能[^2]。 ```c #include "aht20.h" /** * @brief 启动 AHT20 并执行必要的初始化过程. * * @return 成功返回 true;失败则 false。 */ bool AHT20_Init(void){ uint8_t cmd[] = {CMD_INIT}; return HAL_OK == HAL_I2C_Master_Transmit(&hi2c1, ADDR_AHT20<<1, cmd, sizeof(cmd), HAL_MAX_DELAY); } /** * @brief 获取当前环境下的相对湿度百分比与摄氏度数值. * * @param[out] pTemperature 存储获取到的温度指针地址. * @param[out] pHumidity 存储获取到的湿度指针地址. */ void AHT20_GetData(float* pTemperature, float* pHumidity){ uint8_t data[6]; uint8_t cmd[] = {CMD_GETDATA}; // 发送请求指令给 AHT20 开始一次新的采样周期 HAL_I2C_Master_Transmit(&hi2c1, ADDR_AHT20<<1, cmd, sizeof(cmd), HAL_MAX_DELAY); // 等待一段时间让 AHT20 完成内部转换工作后再去读回有效数据 HAL_Delay(80); // 从 AHT20 中接收六个字节长度的结果包 HAL_I2C_Master_Receive(&hi2c1, ADDR_AHT20<<1, data, sizeof(data), HAL_MAX_DELAY); // 解析接收到的信息计算最终显示出来的物理量 *pHumidity = ((data[1]<<12)|(data[2]<<4)|(data[3]>>4))*100/1048576.0f; *pTemperature=((data[3]&0xF)<<16)|((data[4])<<8)|(data[5]); *pTemperature=*pTemperature*200/1048576.0f-50; } ``` 上述代码片段展示了如何向 AHT20 下发初始化命令及触发新样本采集流程的方法。当调用了 `AHT20_GetData()` 方法之后,就可以得到最新的温湿度信息了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值