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; }