mbed library to use a SENSIRION SHT1x/SHT7x sensor humidity and temperature
SHT1x.cpp@0:ad72ec3d85e8, 2012-06-21 (annotated)
- Committer:
- okini3939
- Date:
- Thu Jun 21 03:56:43 2012 +0000
- Revision:
- 0:ad72ec3d85e8
Who changed what in which revision?
User | Revision | Line number | New 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 | } |