Sensiron SHT 7x Temperature and humidity device library
Dependents: temp xj-Nucleo-F303K8-SHT75-TEST
Diff: sht7X.cpp
- Revision:
- 1:20aa2d4a28bf
--- /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;
+ }