summaryrefslogtreecommitdiffstats
path: root/humidity_sensors/app/sht20.c
diff options
context:
space:
mode:
Diffstat (limited to 'humidity_sensors/app/sht20.c')
-rw-r--r--humidity_sensors/app/sht20.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/humidity_sensors/app/sht20.c b/humidity_sensors/app/sht20.c
new file mode 100644
index 0000000..d6d648b
--- /dev/null
+++ b/humidity_sensors/app/sht20.c
@@ -0,0 +1,121 @@
+#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;
+
+}