#include "inc/ens.h" #include "hardware/i2c.h" #include "pico/stdlib.h" // IWYU pragma: keep static const uint8_t ENS_ACTIVATE[2] = {0x10, 0x02}; static const uint8_t ENS_IDLE[2] = {0x10, 0x01}; void activateENS(i2c_inst_t *i2c) { i2c_write_blocking(i2c, ENS_ADDR, ENS_ACTIVATE, 2, false); return; } void deactivateENS(i2c_inst_t *i2c) { i2c_write_blocking(i2c, ENS_ADDR, ENS_IDLE, 2, false); return; } uint8_t getENSData(i2c_inst_t *i2c, double *t, double *h, uint8_t *AQI, uint16_t *TVOC, uint16_t *ECO2, uint16_t *ETOH) { uint16_t K = (uint16_t)((*t + 273.15) * 64.0); // convert to ENS format uint16_t RH = (uint16_t)(*h * 512.0); uint8_t inputData[5] = {0x13, (uint8_t)(K & 0x00FF), (uint8_t)(K >> 8), (uint8_t)(RH & 0x00FF), (uint8_t)(RH >> 8)}; uint8_t result[7]; uint8_t dataReg = ENS_AQI; uint8_t valid; i2c_write_blocking(i2c, ENS_ADDR, inputData, 5, false); sleep_ms(100); i2c_write_blocking(i2c, ENS_ADDR, &dataReg, 1, true); i2c_read_blocking(i2c, ENS_ADDR, result, 7, false); *AQI = result[0]; *TVOC = (result[2] << 8) | result[1]; *ECO2 = (result[4] << 8) | result[3]; *ETOH = (result[6] << 8) | result[5]; dataReg = 0x20; // status register i2c_write_blocking(i2c, ENS_ADDR, &dataReg, 1, true); i2c_read_blocking(i2c, ENS_ADDR, result, 1, false); valid = (result[0] & ENS_STATUS_MASK) == 0 ? 1 : 0; // check if we are in warm-up or normal mode return valid; }