day07/ex01/src/aht20.c
2026-04-22 23:42:44 +02:00

85 lines
1.6 KiB
C

#include <avr/io.h>
#include <util/delay.h>
#include "aht20.h"
#include "i2c.h"
#include "uart.h"
void aht20_print_status(uint8_t status) {
uart_sendstring("AHT20: ");
uart_sendstring((status & BV(3)) ? "Calibrated" : "Not Calibrated");
uart_sendstring(";");
uart_sendstring((status & BV(7)) ? "Busy" : "Not Busy");
uart_sendstring(";\r\n");
}
// https://datasheet4u.com/pdf/1551700/AHT20.pdf
void aht20_init(void) {
// we need to wait a bit after the poweron of the AHT20 device
_delay_ms(40);
i2c_start();
i2c_write(I2C_ADDR(AHT20, TW_WRITE));
i2c_write(0xBE);
i2c_stop();
//_delay_ms(10);
}
void aht20_trigger(void) {
i2c_start();
i2c_write(I2C_ADDR(AHT20, TW_WRITE));
// trigger measurement command (7.4)
i2c_write(0xAC);
i2c_write(0x33);
i2c_write(0x00);
i2c_stop();
}
aht20_reading aht20_read_measure(void) {
uint8_t data[6];
i2c_start();
i2c_write(I2C_ADDR(AHT20, TW_READ));
for (uint8_t i = 0; i < 5; i++)
data[i] = i2c_read_ack();
data[5] = i2c_read_nack();
// we dont read the checksum
i2c_stop();
uint32_t raw_humi = 0;
uint32_t raw_temp = 0;
struct aht20_reading out;
raw_humi = data[1];
raw_humi <<= 8;
raw_humi += data[2];
raw_humi <<= 4;
raw_humi += data[3] >> 4;
out.humidity = (float)raw_humi / 1048576.0;
raw_temp = data[3] & 0x0f;
raw_temp <<= 8;
raw_temp += data[4];
raw_temp <<= 8;
raw_temp += data[5];
out.temperature = (float)raw_temp / 1048576.0 * 200.0 - 50.0;
return out;
}
uint8_t aht20_status(void) {
i2c_start();
i2c_write(I2C_ADDR(AHT20, TW_READ));
uint8_t status = i2c_read_nack();
i2c_stop();
return status & (BV(7) | BV(3));
}