#include #include #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)); }