[Mod] AHT10驱动 优化AHT10源码 +1

1. 解决数据读取错误;
2. 添加重试机制;
This commit is contained in:
gaoyang3513
2026-03-18 22:57:50 +08:00
parent 0ded3c35eb
commit 8347ce25fa
3 changed files with 41 additions and 39 deletions

View File

@ -14,3 +14,5 @@ insert_final_newline = false
[*.c]
indent_size = 8
indent_style = tab
trim_trailing_whitespace = true
insert_final_newline = true

View File

@ -9,7 +9,7 @@
int main() {
int ret = 0, fd_i2c_s = 0;
i2c_driver_info_t info = {0};
float humidity, temp;
fd_i2c_s = open ("/dev/i2c1", O_RDWR);
if (fd_i2c_s < 0) {
@ -26,17 +26,17 @@ int main() {
}
while(1) {
float humidity, temp;
humidity =0.0f; temp = 0.0f;
ret = aht1x_getEvent(fd_i2c_s, AHTX0_I2CADDR_DEFAULT, &humidity, &temp);
if (ret < 0) {
printf("[%12s|%4u] ErrNo(%d), failed to read data from AHT1x\n", __FILE_NAME__, __LINE__, ret);
return ret;
}
printf("Temperature: %2.3f degrees C\n", temp);
printf("Humidity : %2.3f %% rH\n", humidity);
printf("Temperature: %2.3f \n", temp);
printf("Humidity : %2.3f %%rH\n", humidity);
usleep(500000); // wait 500ms before next read
sleep(1); // wait 500ms before next read
}
close(fd_i2c_s);

View File

@ -39,6 +39,8 @@ static int _i2c_read(uint8_t address, uint8_t *data, size_t length, uint8_t stop
return ret;
}
memcpy(data, data_buf, length);
return ret;
}
@ -158,38 +160,36 @@ int aht1x_begin(int i2c_dev, uint8_t i2c_address)
int aht1x_getEvent(int i2c_dev, uint8_t i2c_address, float *_humidity, float *_temperature)
{
int ret = 0;
uint8_t retry = 0;
uint8_t data[6] = {0};
uint8_t cmd[3] = {AHTX0_CMD_TRIGGER, 0x33, 0};
// read the data and store it!
uint8_t cmd[3] = {AHTX0_CMD_TRIGGER, 0x33, 0};
ret = _i2c_write(i2c_address, cmd, 3, 1);
ret = _i2c_write(i2c_address, cmd, sizeof(cmd), 1);
if (ret < 0) {
printf("[%s|%4u] ErrNo(%d) %s, failed to write TRIGGER command\n", __FILE_NAME__, __LINE__, ret);
return ret;
}
while (aht1x_getStatus(i2c_address) & AHTX0_STATUS_BUSY) {
delay(10);
}
do {
memset(data, 0, sizeof(data));
uint8_t data[6];
ret = _i2c_read(i2c_address, data, 6, 1);
ret = _i2c_read(i2c_address, data, sizeof(data), 1);
if (ret < 0) {
printf("[%s|%4u] ErrNo(%d) %s, failed to read date from I2C Address[%#X]\n", __FILE_NAME__, __LINE__, ret, i2c_address);
return ret;
}
uint32_t h = data[1];
h <<= 8;
h |= data[2];
h <<= 4;
h |= data[3] >> 4;
if (retry)
usleep(200000);
} while ((data[0] & AHTX0_STATUS_BUSY) && (retry++ < 10));
// printf("Raw data: %02X %02X %02X %02X %02X %02X\n", data[0], data[1], data[2], data[3], data[4], data[5]);
uint32_t h = (data[1] << 8 | data[2]) << 4 | data[3] >> 4;
*_humidity = ((float)h * 100) / 0x100000;
uint32_t tdata = data[3] & 0x0F;
tdata <<= 8;
tdata |= data[4];
tdata <<= 8;
tdata |= data[5];
uint32_t tdata = ((data[3] & 0x0F)) << 16 | (data[4] << 8) | data[5];
*_temperature = ((float)tdata * 200 / 0x100000) - 50;
return true;