Sensiron SHT 7x Temperature and humidity device library
Dependents: temp xj-Nucleo-F303K8-SHT75-TEST
Diff: sht7X.cpp
- Revision:
- 1:20aa2d4a28bf
diff -r f401474a3e96 -r 20aa2d4a28bf sht7X.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sht7X.cpp Wed Oct 27 15:51:27 2010 +0000 @@ -0,0 +1,180 @@ +// +// 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; + }