b-parasite-esp32/code/nrf-connect/prstlib/src/shtc3.c
2023-07-15 11:07:35 +02:00

52 lines
No EOL
1.4 KiB
C

#include "prstlib/shtc3.h"
#include <zephyr/drivers/i2c.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include "prstlib/macros.h"
LOG_MODULE_REGISTER(shtc3, CONFIG_PRSTLIB_LOG_LEVEL);
static const struct i2c_dt_spec shtc3 = I2C_DT_SPEC_GET(DT_NODELABEL(shtc3));
static uint8_t buff[6];
static int write_cmd(uint16_t command) {
static uint8_t cmd[2];
cmd[0] = command >> 8;
cmd[1] = command & 0xff;
RET_IF_ERR(i2c_write_dt(&shtc3, cmd, sizeof(cmd)));
return 0;
}
int prst_shtc3_read(prst_shtc3_read_t *out) {
RET_IF_ERR_MSG(!device_is_ready(shtc3.bus), "SHTC3 is not ready");
// Wake the sensor up.
RET_IF_ERR(write_cmd(PRST_SHTC3_CMD_WAKEUP));
k_msleep(1);
// Request measurement.
RET_IF_ERR(write_cmd(PRST_SHTC3_CMD_MEASURE_TFIRST_NORMAL));
// Reading in normal (not low power) mode can take up to 12.1 ms, according to
// the datasheet.
k_msleep(20);
// Read response.
RET_IF_ERR(i2c_read_dt(&shtc3, buff, 6));
// Put the sensor in sleep mode.
RET_IF_ERR(write_cmd(PRST_SHTC3_CMD_SLEEP));
// TODO: verify the CRC of the measurements. The function is described in the
// datasheet.
out->temp_c = -45 + 175 * ((float)((buff[0] << 8) | buff[1])) / (1 << 16);
out->rel_humi = ((float)((buff[3] << 8) | buff[4])) / UINT16_MAX;
LOG_DBG("Read temp: %f oC (%d)", out->temp_c, (int)out->temp_c);
LOG_DBG("Read humi: %.0f %%", 100.0 * out->rel_humi);
return 0;
}