Sensiron SHT 7x Temperature and humidity device library

Dependents:   temp xj-Nucleo-F303K8-SHT75-TEST

sht7X.cpp

Committer:
nimbusgb
Date:
2010-10-27
Revision:
1:20aa2d4a28bf

File content as of revision 1:20aa2d4a28bf:

//
// Ian Molesworth October 2010
// SHT 75 class
//
// 
// To do:
//
// 

#include "sht7X.h"

void SHT75::reset()
    {
     _data.output();
    _data = 1;                                        // data bus high
    for (int i=0;i<12;i++)
        {
        _clock = 1;                                   // clock high
        wait_us(1);
        _clock = 0;                                   // clock lo
        wait_us(1);
        }
    _clock = 1;                                   // clock high
        wait_us(1);
    _data  = 0;
        wait_us(1);
    _clock = 0;                                   // clock lo
        wait_us(1);
    _clock = 1;
        wait_us(1);
    _data  = 1;
        wait_us(1);
    _clock = 0;   
        wait_us(1);
    }

void  SHT75::softReset(void)
    {
    _data.output();
    start();
    write(0x1E);
    wait_ms(12);
    }

void  SHT75::start(void)
    {
    _data.output();
    _clock = 1;
    wait_us(1);
    _data = 0;
    wait_us(1);
    _clock = 0;
    wait_us(1);
    _clock = 1;
    wait_us(1);
    _data = 1;
    wait_us(1);
    _clock = 0;
    }

int SHT75::readStatus(void)
    {
    int status;
    status = -1;
    start();
    if (write(0x06) == 0)
        status = read(1);               // read with a wait for ack
    read(0);                            // read without the wait
    return status;
    }

bool SHT75::write(char d)
    {
    auto int i;
    _data.output();                         // bus output
    // Writes char and returns -1 if no ACK was sent from remote
    for (i=0;i<8;i++)
        {
        if (d & 0x80)
            _data = 1;                      // data high
        else
            _data = 0;                      // data lo
        // shift the data
        d <<= 1;
        wait_us(1);
        _clock = 1;                         // clock high
        wait_us(1);
        _clock = 0;                         // clock lo
        }
    _data.input();                          // float the bus
    wait_us(1);
    _clock = 1;                             // clock high
    wait_us(1);
    i = _data;
    _clock = 0;                             // clock lo
    return i;                               // leave the bus in input mode and return the status of the ack bit read.
    }

int SHT75::read(char ack)
    {
    auto int i,s;
    auto char c;
    s = 0;
    _data.input();                            // bus to input
  
    for (i=0;i<8;i++)
        {
        s <<= 1;
        wait_us(1);
        _clock = 1;                              // clock high
        wait_us(1);
        c = _data;                               // get the data bit
        _clock = 0;                             // clock lo
        if ( c )
            s |= 1;
        }

    if (ack == 1)
        _data = 0;                             // data lo
    else
        _data = 1;                             // data hi
    _data.output();
    _clock = 1;                                // clock lo
    wait_us(1);
    _clock = 0;                              // clock lo
    _data = 1;                               // data hi
    _data.input();
    return s;
    }


// Put the current temperature into passed variable
bool SHT75::readTempTicks(int* temp)
{
  int v, value;
  start();                                  // Start a tx ( leaves data as input )
  if (write(0x03) == 0)                     // send the read command and get an ack
        {
        for (v=0; v<50; v ++)               // wait for ready up to 500 ms
            {
            wait_ms(10);                    // 10 ms pause
            if ( _data == 0 )               //
                {
                value = read(1);            // read a byte
                value <<= 8;                // shift it in
                value |= read(1);           // read another byte
                read(0);
                // transfer the value
                 *temp = value;
                reset();
                return true;
                }
            }
        }
    return false;    
    }

bool SHT75::readHumidityTicks(int* humi)
    {
    start();
    if (write(0x05) == 0)
        {
        for (int value=0; value<50; value ++)   // wait for ready up to 500 ms
            {
            wait_ms(10);                        //
            if ( _data == 0 )                   //
                {
                value = read(1);
                value <<= 8;
                value |= read(1);
                read(0);
                *humi = value;                  // transfer the value
                reset();
                return true;
                }
            }
        }
   
    return false;
    }