#include "project.h" #define SHT20_ADDRESS 0x40 #define TRIGGER_TEMP_MEASURE_HOLD 0xE3 #define TRIGGER_HUMD_MEASURE_HOLD 0xE5 #define TRIGGER_TEMP_MEASURE_NOHOLD 0xF3 #define TRIGGER_HUMD_MEASURE_NOHOLD 0xF5 #define WRITE_USER_REG 0xE6 #define READ_USER_REG 0xE7 #define SOFT_RESET 0xFE void sht20_reset (void) { i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE); i2cb_send_data (SOFT_RESET); i2cb_stop(); delay_ms (100); printf ("$SNTHR\n"); } char * sht20_temp_s (void) { u8 h, l, c, s; s32 t, tf; float f; static char ret[8]; i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE); i2cb_send_data (TRIGGER_TEMP_MEASURE_NOHOLD); delay_ms (100); i2cb_start_transaction (SHT20_ADDRESS, I2C_READ); h = i2cb_read (0); l = i2cb_read (0); c = i2cb_read (1); i2cb_stop(); t = h; t <<= 8; t |= l & 0xfc; f = t; f /= 65536.; f *= 175.72; f -= 46.85; f *= 100.; t = (s32) (f + .5); ret[0] = '-'; if (t >= 0) s = 1; else { s = 0; t = -t; } tf = t % 100; t = t / 100; sprintf (&ret[1], "%ld.%02ld", t, tf); return &ret[s]; } char * sht20_humid_s (void) { u8 h, l, c; u32 t, tf; float f; static char ret[8]; i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE); i2cb_send_data (TRIGGER_HUMD_MEASURE_NOHOLD); delay_ms (100); i2cb_start_transaction (SHT20_ADDRESS, I2C_READ); h = i2cb_read (0); l = i2cb_read (0); c = i2cb_read (1); i2cb_stop(); t = h; t <<= 8; t |= l & 0xfc; f = t; f /= 65536.; f *= 125.; f -= 6.; if (f < 0) f = 0; if (f > 100) f = 100; f *= 100.; t = (u32) (f + .5); tf = t % 100; t = t / 100; sprintf (ret, "%ld.%02ld", t, tf); return ret; }