test MAX31850

Dependencies:   OneWireFB mbed

SHTxx/sht7X.cpp

Committer:
fblanc
Date:
2016-09-28
Revision:
4:031e71e61e80
Parent:
0:55f2866e9c0c

File content as of revision 4:031e71e61e80:

//
// Ian Molesworth October 2010
// SHT 75 class
//
//
// To do:
// modification PULL-UP
//2010_12_22 F.BLANC

#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
    _data.mode(PullUp);                              //PULL-UP
    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
    _data.mode(PullUp);                              //PULL-UP
    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();
    _data.mode(PullUp);                              //PULL-UP
    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;
}