Sensiron SHT 7x Temperature and humidity device library
Dependents: temp xj-Nucleo-F303K8-SHT75-TEST
Revision 1:20aa2d4a28bf, committed 2010-10-27
- Comitter:
- nimbusgb
- Date:
- Wed Oct 27 15:51:27 2010 +0000
- Parent:
- 0:f401474a3e96
- Child:
- 2:dd218144f9fe
- Commit message:
Changed in this revision
--- a/sht75.cpp Wed Oct 27 15:27:38 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +0,0 @@ -// -// Ian Molesworth October 2010 -// SHT 75 class -// -// -// To do: -// -// - -#include "sht75.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; - }
--- a/sht75.h Wed Oct 27 15:27:38 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* mbed Sensiron SHT7x temperature and humidity sensor library -* -* Sensiron data at http://www.sensirion.com/en/01_humidity_sensors/06_humidity_sensor_sht75.htm -* -* Copyright (c) Ian Molesworth October 2010 -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to use -* copy or modify the software for private or non-commercial purposes only. -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -*/ - - -#ifndef SHT75_H -#define SHT75_H - -#include "mbed.h" - -const float C1= -4.0; // for 12 Bit humi -const float C2= +0.0405; // for 12 Bit humi -const float C3= -0.0000028; // for 12 Bit hum -const float TL= -39.61; // 3v 14 bit -const float T1= +0.01; // for 14 Bit @ 5V -const float T2= +0.00008; // for 14 Bit @ 5V - -class SHT75 - { - public: - /** Create an SHT object connected to the specified Digital pins - * - * @param pclock digital pin to use as clock - * @param pdata digital pin to use as data bus ( bidirectional ) - */ - SHT75(PinName pclock, PinName pdata): _clock(pclock), _data(pdata) {}; - /** read the temperature ticks value 14 bit resolution - * - * @param int *temp pointer to an integer to hold the tick value - * @returns boolean true if read acknowledges - */ - bool readTempTicks(int* temp); - /** read the humidity ticks value 12 bit resolution - * - * @param int *temp pointer to an integer to hold the tick value - * @returns boolean true if read acknowledges - */ - bool readHumidityTicks(int* temp); - /** start up reset - * - * call to resync or abort current operation. - * worth calling every now and then to make sure your system is not hung. - */ - void reset(void); - void softReset(void); - int readStatus(void); - - private: - DigitalInOut _data; - DigitalOut _clock; - - void start(void); - int read(char); - bool write(char); - }; - -#endif
--- /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; + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sht7X.h Wed Oct 27 15:51:27 2010 +0000 @@ -0,0 +1,100 @@ +/* mbed Sensiron SHT7x temperature and humidity sensor library +* +* Sensiron data at http://www.sensirion.com/en/01_humidity_sensors/06_humidity_sensor_sht75.htm +* +* Copyright (c) Ian Molesworth October 2010 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to use +* copy or modify the software for private or non-commercial purposes only. +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + + +#ifndef SHT75_H +#define SHT75_H + +#include "mbed.h" + +const float C1= -4.0; // for 12 Bit humi +const float C2= +0.0405; // for 12 Bit humi +const float C3= -0.0000028; // for 12 Bit hum +const float TL= -39.61; // 3v 14 bit +const float T1= +0.01; // for 14 Bit @ 5V +const float T2= +0.00008; // for 14 Bit @ 5V + +/** SHT7x class +* +* Example: +* @code +* //initialise the device read temperature ticks, read humidity ticks and then +* calculate the liniarised humidity value. +* #include "mbed.h" +* #include "SHT7X.h" +00035 * +00036 * Servo myservo(p21); +00037 * +00038 * int main() { +00039 * while(1) { +00040 * for(int i=0; i<100; i++) { +00041 * myservo = i/100.0; +00042 * wait(0.01); +00043 * } +00044 * for(int i=100; i>0; i--) { +00045 * myservo = i/100.0; +00046 * wait(0.01); +00047 * } +00048 * } +00049 * } +00050 * @endcode +00051 */ +class SHT75 + { + public: + /** Create an SHT object connected to the specified Digital pins + * + * @param pclock digital pin to use as clock + * @param pdata digital pin to use as data bus ( bidirectional ) + */ + SHT75(PinName pclock, PinName pdata): _clock(pclock), _data(pdata) {}; + /** read the temperature ticks value 14 bit resolution + * + * @param int *temp pointer to an integer to hold the tick value + * @returns boolean true if read acknowledges + */ + bool readTempTicks(int* temp); + /** read the humidity ticks value 12 bit resolution + * + * @param int *temp pointer to an integer to hold the tick value + * @returns boolean true if read acknowledges + */ + bool readHumidityTicks(int* temp); + /** start up reset + * + * call to resync or abort current operation. + * worth calling every now and then to make sure your system is not hung. + */ + void reset(void); + void softReset(void); + int readStatus(void); + + private: + DigitalInOut _data; + DigitalOut _clock; + + void start(void); + int read(char); + bool write(char); + }; + +#endif