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

SHT1x.cpp

Committer:
okini3939
Date:
2012-06-21
Revision:
0:ad72ec3d85e8

File content as of revision 0:ad72ec3d85e8:

/*
 * mbed library to use a SENSIRION SHT1x/SHT7x sensor
 * Copyright (c) 2011 Hiroshi Suga
 * Released under the MIT License: http://mbed.org/license/mit
 */
 
/** @file
 * @brief mbed library to use a SENSIRION SHT1x/SHT7x sensor
 * humidity/temperature sensor SHT11, SHT15, SHT71, SHT75 (SENSIRION) Ver.4
 * interface: I2C digital
 */

#include "mbed.h"
#include "SHT1x.h"

enum SHT_cmd {
    SHT_cmd_temperature = 0x03,
    SHT_cmd_humidity = 0x05,
    SHT_cmd_read_status = 0x07,
    SHT_cmd_write_status = 0x06,
    SHT_cmd_reset = 0x1e
};

SHT1x::SHT1x (PinName p_sda, PinName p_scl, SHT_acc p_acc, SHT_vdd p_vdd) : i2c(p_sda, p_scl) {
    init(p_acc, p_vdd);
}

SHT1x::SHT1x (I2C& p_i2c, SHT_acc p_acc, SHT_vdd p_vdd) : i2c(p_i2c) {
    init(p_acc, p_vdd);
}

float SHT1x::get_temperature() {
    return temperature;
}

float SHT1x::get_humidity() {
    return humidity;
}

void SHT1x::update () {
    float t, rhl, rht;
    unsigned short sot, sorh;

    sot = twi_readshort(SHT_cmd_temperature, (accuracy == SHT_low ? 80 : 320));
    sorh = twi_readshort(SHT_cmd_humidity, (accuracy == SHT_low ? 20 : 80));
    if (sot == 0xffff || sorh == 0xffff) return;

    if (accuracy == SHT_low) {
        sot &= 0x0fff; // 12bit
        sorh &= 0x00ff; // 8bit
    } else {
        sot &= 0x3fff; // 14bit
        sorh &= 0x0fff; // 12bit
    }    

    t = d1 + d2 * (float)sot;
    temperature = t;

    rhl = c1 + c2 * (float)sorh + c3 * (float)(sorh * sorh);
    rht = (t - 25.0) * (t1 + t2 * (float)sorh) + rhl;
    if (rht > 99.0) rht = 100.0;
    humidity = rht;
}

void SHT1x::init (SHT_acc p_acc, SHT_vdd p_vdd) {

    humidity = 0;
    temperature = 0;

    if (p_vdd == SHT_3V3) {
        d1 = -39.66; // 3.3V
    } else {
        d1 = -40.1; // 5V
    }

    accuracy = p_acc;
    if (accuracy == SHT_low) {
        d2 = 0.04;
        c1 = -2.0468; c2 = 0.5872; c3 = -4.0845/10000.0;
        t1 = 0.01; t2 = 0.00128;
        twi_writechar(SHT_cmd_write_status, 1);
    } else {
        d2 = 0.01;
        c1 = -2.0468; c2 = 0.0367; c3 = -1.5955/1000000.0;
        t1 = 0.01; t2 = 0.00008;
        twi_writechar(SHT_cmd_write_status, 0);
    }    
}

unsigned short SHT1x::twi_readshort (int addr, int wait) {
    unsigned short i;

    i2c.start();
    i2c.stop();

    i2c.start();
    i2c.write(addr);
    wait_ms(wait);

    i = i2c.read(1) << 8;
    i |= i2c.read(1);
    i2c.read(0);
    i2c.stop();

    return i;
}

void SHT1x::twi_writechar (int addr, int dat) {

    i2c.start();
    i2c.stop();

    i2c.start();
    i2c.write(addr);
    i2c.write(dat);
    i2c.stop();
}