stm32读取aht10温湿度值,尝试编写aht10.c和aht10.h文件代码
时间: 2023-06-04 20:02:51 浏览: 315
AHT10/AHT20/AHT30驱动程序+DEMO板整套资料
很高兴为您解答问题!以下是 aht10.c 文件和 aht10.h 文件的代码,供参考:
aht10.c 文件:
#include "aht10.h"
#include "stm32f1xx_hal.h"
#define AHT10_ADDR 0x38 // AHT10 的地址
// AHT10 命令
#define AHT10_INIT_CMD 0xE1
#define AHT10_MEASURE_CMD 0xAC
// AHT10 数据长度
#define AHT10_DATA_LEN 6
I2C_HandleTypeDef hi2c1; // I2C1 句柄
/**
* @brief 初始化 AHT10
*/
void AHT10_Init(void) {
uint8_t init_data[] = {AHT10_INIT_CMD, 0x08, 0x00}; // 初始化命令和数据
HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR, init_data, sizeof(init_data),
1000); // 发送初始化命令和数据
}
/**
* @brief 从 AHT10 中读取温湿度数据
* @param[out] temp - 温度,单位是摄氏度
* @param[out] humidity - 湿度,单位是百分比
* @return 读取成功返回 0,否则返回 -1
*/
int AHT10_ReadData(float *temp, float *humidity) {
uint8_t data[AHT10_DATA_LEN]; // 存储读取到的数据
uint8_t cmd = AHT10_MEASURE_CMD; // 读取数据的命令
HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR, &cmd, 1, 1000); // 发送读取数据命令
HAL_Delay(80); // 等待数据准备好
HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDR, data, AHT10_DATA_LEN, 1000); // 读取数据
// 检查数据校验和是否正确
uint8_t check_sum = data[0] + data[1] + data[2];
if (check_sum != data[3]) {
return -1; // 数据校验和错误,读取失败
}
// 计算温度和湿度
*humidity = ((float)((data[1] << 12) | (data[2] << 4) | (data[3] & 0x0F))) /
1048576.0f * 100.0f; // 湿度
*temp = ((float)((data[3] & 0xF0) << 16) | (data[4] << 8) | data[5]) /
1048576.0f * 200.0f - 50.0f; // 温度
return 0; // 读取成功
}
aht10.h 文件:
#ifndef __AHT10_H__
#define __AHT10_H__
#ifdef __cplusplus
extern "C" {
#endif
void AHT10_Init(void);
int AHT10_ReadData(float *temp, float *humidity);
#ifdef __cplusplus
}
#endif
#endif /* __AHT10_H__ */
阅读全文