85 lines
1.6 KiB
C
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));
|
|
}
|