/* ============================================================================= * sht30_convert.c * ===========================================================================*/ #include "sht30_convert.h" uint8_t sht30_crc8(const uint8_t *data, size_t len) { uint8_t crc = 0xFF; for (size_t i = 0; i < len; i++) { crc ^= data[i]; for (int b = 0; b < 8; b++) { if (crc & 0x80) crc = (uint8_t)((crc << 1) ^ 0x31); else crc = (uint8_t)(crc << 1); } } return crc; } int sht30_parse(const uint8_t frame[6], double *temp_c, double *rh) { if (sht30_crc8(&frame[0], 2) != frame[2]) return -1; if (sht30_crc8(&frame[3], 2) != frame[5]) return -2; uint16_t raw_t = (uint16_t)((frame[0] << 8) | frame[1]); uint16_t raw_rh = (uint16_t)((frame[3] << 8) | frame[4]); if (temp_c) *temp_c = -45.0 + 175.0 * ((double)raw_t / 65535.0); if (rh) *rh = 100.0 * ((double)raw_rh / 65535.0); return 0; }