mbed library to use a SENSIRION SHT1x/SHT7x sensor humidity and temperature

Committer:
okini3939
Date:
Thu Jun 21 03:56:43 2012 +0000
Revision:
0:ad72ec3d85e8

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:ad72ec3d85e8 1 /*
okini3939 0:ad72ec3d85e8 2 * mbed library to use a SENSIRION SHT1x/SHT7x sensor
okini3939 0:ad72ec3d85e8 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 0:ad72ec3d85e8 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:ad72ec3d85e8 5 */
okini3939 0:ad72ec3d85e8 6
okini3939 0:ad72ec3d85e8 7 /** @file
okini3939 0:ad72ec3d85e8 8 * @brief mbed library to use a SENSIRION SHT1x/SHT7x sensor
okini3939 0:ad72ec3d85e8 9 * humidity/temperature sensor SHT11, SHT15, SHT71, SHT75 (SENSIRION) Ver.4
okini3939 0:ad72ec3d85e8 10 * interface: I2C digital
okini3939 0:ad72ec3d85e8 11 */
okini3939 0:ad72ec3d85e8 12
okini3939 0:ad72ec3d85e8 13 #include "mbed.h"
okini3939 0:ad72ec3d85e8 14 #include "SHT1x.h"
okini3939 0:ad72ec3d85e8 15
okini3939 0:ad72ec3d85e8 16 enum SHT_cmd {
okini3939 0:ad72ec3d85e8 17 SHT_cmd_temperature = 0x03,
okini3939 0:ad72ec3d85e8 18 SHT_cmd_humidity = 0x05,
okini3939 0:ad72ec3d85e8 19 SHT_cmd_read_status = 0x07,
okini3939 0:ad72ec3d85e8 20 SHT_cmd_write_status = 0x06,
okini3939 0:ad72ec3d85e8 21 SHT_cmd_reset = 0x1e
okini3939 0:ad72ec3d85e8 22 };
okini3939 0:ad72ec3d85e8 23
okini3939 0:ad72ec3d85e8 24 SHT1x::SHT1x (PinName p_sda, PinName p_scl, SHT_acc p_acc, SHT_vdd p_vdd) : i2c(p_sda, p_scl) {
okini3939 0:ad72ec3d85e8 25 init(p_acc, p_vdd);
okini3939 0:ad72ec3d85e8 26 }
okini3939 0:ad72ec3d85e8 27
okini3939 0:ad72ec3d85e8 28 SHT1x::SHT1x (I2C& p_i2c, SHT_acc p_acc, SHT_vdd p_vdd) : i2c(p_i2c) {
okini3939 0:ad72ec3d85e8 29 init(p_acc, p_vdd);
okini3939 0:ad72ec3d85e8 30 }
okini3939 0:ad72ec3d85e8 31
okini3939 0:ad72ec3d85e8 32 float SHT1x::get_temperature() {
okini3939 0:ad72ec3d85e8 33 return temperature;
okini3939 0:ad72ec3d85e8 34 }
okini3939 0:ad72ec3d85e8 35
okini3939 0:ad72ec3d85e8 36 float SHT1x::get_humidity() {
okini3939 0:ad72ec3d85e8 37 return humidity;
okini3939 0:ad72ec3d85e8 38 }
okini3939 0:ad72ec3d85e8 39
okini3939 0:ad72ec3d85e8 40 void SHT1x::update () {
okini3939 0:ad72ec3d85e8 41 float t, rhl, rht;
okini3939 0:ad72ec3d85e8 42 unsigned short sot, sorh;
okini3939 0:ad72ec3d85e8 43
okini3939 0:ad72ec3d85e8 44 sot = twi_readshort(SHT_cmd_temperature, (accuracy == SHT_low ? 80 : 320));
okini3939 0:ad72ec3d85e8 45 sorh = twi_readshort(SHT_cmd_humidity, (accuracy == SHT_low ? 20 : 80));
okini3939 0:ad72ec3d85e8 46 if (sot == 0xffff || sorh == 0xffff) return;
okini3939 0:ad72ec3d85e8 47
okini3939 0:ad72ec3d85e8 48 if (accuracy == SHT_low) {
okini3939 0:ad72ec3d85e8 49 sot &= 0x0fff; // 12bit
okini3939 0:ad72ec3d85e8 50 sorh &= 0x00ff; // 8bit
okini3939 0:ad72ec3d85e8 51 } else {
okini3939 0:ad72ec3d85e8 52 sot &= 0x3fff; // 14bit
okini3939 0:ad72ec3d85e8 53 sorh &= 0x0fff; // 12bit
okini3939 0:ad72ec3d85e8 54 }
okini3939 0:ad72ec3d85e8 55
okini3939 0:ad72ec3d85e8 56 t = d1 + d2 * (float)sot;
okini3939 0:ad72ec3d85e8 57 temperature = t;
okini3939 0:ad72ec3d85e8 58
okini3939 0:ad72ec3d85e8 59 rhl = c1 + c2 * (float)sorh + c3 * (float)(sorh * sorh);
okini3939 0:ad72ec3d85e8 60 rht = (t - 25.0) * (t1 + t2 * (float)sorh) + rhl;
okini3939 0:ad72ec3d85e8 61 if (rht > 99.0) rht = 100.0;
okini3939 0:ad72ec3d85e8 62 humidity = rht;
okini3939 0:ad72ec3d85e8 63 }
okini3939 0:ad72ec3d85e8 64
okini3939 0:ad72ec3d85e8 65 void SHT1x::init (SHT_acc p_acc, SHT_vdd p_vdd) {
okini3939 0:ad72ec3d85e8 66
okini3939 0:ad72ec3d85e8 67 humidity = 0;
okini3939 0:ad72ec3d85e8 68 temperature = 0;
okini3939 0:ad72ec3d85e8 69
okini3939 0:ad72ec3d85e8 70 if (p_vdd == SHT_3V3) {
okini3939 0:ad72ec3d85e8 71 d1 = -39.66; // 3.3V
okini3939 0:ad72ec3d85e8 72 } else {
okini3939 0:ad72ec3d85e8 73 d1 = -40.1; // 5V
okini3939 0:ad72ec3d85e8 74 }
okini3939 0:ad72ec3d85e8 75
okini3939 0:ad72ec3d85e8 76 accuracy = p_acc;
okini3939 0:ad72ec3d85e8 77 if (accuracy == SHT_low) {
okini3939 0:ad72ec3d85e8 78 d2 = 0.04;
okini3939 0:ad72ec3d85e8 79 c1 = -2.0468; c2 = 0.5872; c3 = -4.0845/10000.0;
okini3939 0:ad72ec3d85e8 80 t1 = 0.01; t2 = 0.00128;
okini3939 0:ad72ec3d85e8 81 twi_writechar(SHT_cmd_write_status, 1);
okini3939 0:ad72ec3d85e8 82 } else {
okini3939 0:ad72ec3d85e8 83 d2 = 0.01;
okini3939 0:ad72ec3d85e8 84 c1 = -2.0468; c2 = 0.0367; c3 = -1.5955/1000000.0;
okini3939 0:ad72ec3d85e8 85 t1 = 0.01; t2 = 0.00008;
okini3939 0:ad72ec3d85e8 86 twi_writechar(SHT_cmd_write_status, 0);
okini3939 0:ad72ec3d85e8 87 }
okini3939 0:ad72ec3d85e8 88 }
okini3939 0:ad72ec3d85e8 89
okini3939 0:ad72ec3d85e8 90 unsigned short SHT1x::twi_readshort (int addr, int wait) {
okini3939 0:ad72ec3d85e8 91 unsigned short i;
okini3939 0:ad72ec3d85e8 92
okini3939 0:ad72ec3d85e8 93 i2c.start();
okini3939 0:ad72ec3d85e8 94 i2c.stop();
okini3939 0:ad72ec3d85e8 95
okini3939 0:ad72ec3d85e8 96 i2c.start();
okini3939 0:ad72ec3d85e8 97 i2c.write(addr);
okini3939 0:ad72ec3d85e8 98 wait_ms(wait);
okini3939 0:ad72ec3d85e8 99
okini3939 0:ad72ec3d85e8 100 i = i2c.read(1) << 8;
okini3939 0:ad72ec3d85e8 101 i |= i2c.read(1);
okini3939 0:ad72ec3d85e8 102 i2c.read(0);
okini3939 0:ad72ec3d85e8 103 i2c.stop();
okini3939 0:ad72ec3d85e8 104
okini3939 0:ad72ec3d85e8 105 return i;
okini3939 0:ad72ec3d85e8 106 }
okini3939 0:ad72ec3d85e8 107
okini3939 0:ad72ec3d85e8 108 void SHT1x::twi_writechar (int addr, int dat) {
okini3939 0:ad72ec3d85e8 109
okini3939 0:ad72ec3d85e8 110 i2c.start();
okini3939 0:ad72ec3d85e8 111 i2c.stop();
okini3939 0:ad72ec3d85e8 112
okini3939 0:ad72ec3d85e8 113 i2c.start();
okini3939 0:ad72ec3d85e8 114 i2c.write(addr);
okini3939 0:ad72ec3d85e8 115 i2c.write(dat);
okini3939 0:ad72ec3d85e8 116 i2c.stop();
okini3939 0:ad72ec3d85e8 117 }