Sensiron SHT 7x Temperature and humidity device library

Dependents:   temp xj-Nucleo-F303K8-SHT75-TEST

Committer:
nimbusgb
Date:
Wed Oct 27 15:51:27 2010 +0000
Revision:
1:20aa2d4a28bf

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nimbusgb 1:20aa2d4a28bf 1 //
nimbusgb 1:20aa2d4a28bf 2 // Ian Molesworth October 2010
nimbusgb 1:20aa2d4a28bf 3 // SHT 75 class
nimbusgb 1:20aa2d4a28bf 4 //
nimbusgb 1:20aa2d4a28bf 5 //
nimbusgb 1:20aa2d4a28bf 6 // To do:
nimbusgb 1:20aa2d4a28bf 7 //
nimbusgb 1:20aa2d4a28bf 8 //
nimbusgb 1:20aa2d4a28bf 9
nimbusgb 1:20aa2d4a28bf 10 #include "sht7X.h"
nimbusgb 1:20aa2d4a28bf 11
nimbusgb 1:20aa2d4a28bf 12 void SHT75::reset()
nimbusgb 1:20aa2d4a28bf 13 {
nimbusgb 1:20aa2d4a28bf 14 _data.output();
nimbusgb 1:20aa2d4a28bf 15 _data = 1; // data bus high
nimbusgb 1:20aa2d4a28bf 16 for (int i=0;i<12;i++)
nimbusgb 1:20aa2d4a28bf 17 {
nimbusgb 1:20aa2d4a28bf 18 _clock = 1; // clock high
nimbusgb 1:20aa2d4a28bf 19 wait_us(1);
nimbusgb 1:20aa2d4a28bf 20 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 21 wait_us(1);
nimbusgb 1:20aa2d4a28bf 22 }
nimbusgb 1:20aa2d4a28bf 23 _clock = 1; // clock high
nimbusgb 1:20aa2d4a28bf 24 wait_us(1);
nimbusgb 1:20aa2d4a28bf 25 _data = 0;
nimbusgb 1:20aa2d4a28bf 26 wait_us(1);
nimbusgb 1:20aa2d4a28bf 27 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 28 wait_us(1);
nimbusgb 1:20aa2d4a28bf 29 _clock = 1;
nimbusgb 1:20aa2d4a28bf 30 wait_us(1);
nimbusgb 1:20aa2d4a28bf 31 _data = 1;
nimbusgb 1:20aa2d4a28bf 32 wait_us(1);
nimbusgb 1:20aa2d4a28bf 33 _clock = 0;
nimbusgb 1:20aa2d4a28bf 34 wait_us(1);
nimbusgb 1:20aa2d4a28bf 35 }
nimbusgb 1:20aa2d4a28bf 36
nimbusgb 1:20aa2d4a28bf 37 void SHT75::softReset(void)
nimbusgb 1:20aa2d4a28bf 38 {
nimbusgb 1:20aa2d4a28bf 39 _data.output();
nimbusgb 1:20aa2d4a28bf 40 start();
nimbusgb 1:20aa2d4a28bf 41 write(0x1E);
nimbusgb 1:20aa2d4a28bf 42 wait_ms(12);
nimbusgb 1:20aa2d4a28bf 43 }
nimbusgb 1:20aa2d4a28bf 44
nimbusgb 1:20aa2d4a28bf 45 void SHT75::start(void)
nimbusgb 1:20aa2d4a28bf 46 {
nimbusgb 1:20aa2d4a28bf 47 _data.output();
nimbusgb 1:20aa2d4a28bf 48 _clock = 1;
nimbusgb 1:20aa2d4a28bf 49 wait_us(1);
nimbusgb 1:20aa2d4a28bf 50 _data = 0;
nimbusgb 1:20aa2d4a28bf 51 wait_us(1);
nimbusgb 1:20aa2d4a28bf 52 _clock = 0;
nimbusgb 1:20aa2d4a28bf 53 wait_us(1);
nimbusgb 1:20aa2d4a28bf 54 _clock = 1;
nimbusgb 1:20aa2d4a28bf 55 wait_us(1);
nimbusgb 1:20aa2d4a28bf 56 _data = 1;
nimbusgb 1:20aa2d4a28bf 57 wait_us(1);
nimbusgb 1:20aa2d4a28bf 58 _clock = 0;
nimbusgb 1:20aa2d4a28bf 59 }
nimbusgb 1:20aa2d4a28bf 60
nimbusgb 1:20aa2d4a28bf 61 int SHT75::readStatus(void)
nimbusgb 1:20aa2d4a28bf 62 {
nimbusgb 1:20aa2d4a28bf 63 int status;
nimbusgb 1:20aa2d4a28bf 64 status = -1;
nimbusgb 1:20aa2d4a28bf 65 start();
nimbusgb 1:20aa2d4a28bf 66 if (write(0x06) == 0)
nimbusgb 1:20aa2d4a28bf 67 status = read(1); // read with a wait for ack
nimbusgb 1:20aa2d4a28bf 68 read(0); // read without the wait
nimbusgb 1:20aa2d4a28bf 69 return status;
nimbusgb 1:20aa2d4a28bf 70 }
nimbusgb 1:20aa2d4a28bf 71
nimbusgb 1:20aa2d4a28bf 72 bool SHT75::write(char d)
nimbusgb 1:20aa2d4a28bf 73 {
nimbusgb 1:20aa2d4a28bf 74 auto int i;
nimbusgb 1:20aa2d4a28bf 75 _data.output(); // bus output
nimbusgb 1:20aa2d4a28bf 76 // Writes char and returns -1 if no ACK was sent from remote
nimbusgb 1:20aa2d4a28bf 77 for (i=0;i<8;i++)
nimbusgb 1:20aa2d4a28bf 78 {
nimbusgb 1:20aa2d4a28bf 79 if (d & 0x80)
nimbusgb 1:20aa2d4a28bf 80 _data = 1; // data high
nimbusgb 1:20aa2d4a28bf 81 else
nimbusgb 1:20aa2d4a28bf 82 _data = 0; // data lo
nimbusgb 1:20aa2d4a28bf 83 // shift the data
nimbusgb 1:20aa2d4a28bf 84 d <<= 1;
nimbusgb 1:20aa2d4a28bf 85 wait_us(1);
nimbusgb 1:20aa2d4a28bf 86 _clock = 1; // clock high
nimbusgb 1:20aa2d4a28bf 87 wait_us(1);
nimbusgb 1:20aa2d4a28bf 88 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 89 }
nimbusgb 1:20aa2d4a28bf 90 _data.input(); // float the bus
nimbusgb 1:20aa2d4a28bf 91 wait_us(1);
nimbusgb 1:20aa2d4a28bf 92 _clock = 1; // clock high
nimbusgb 1:20aa2d4a28bf 93 wait_us(1);
nimbusgb 1:20aa2d4a28bf 94 i = _data;
nimbusgb 1:20aa2d4a28bf 95 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 96 return i; // leave the bus in input mode and return the status of the ack bit read.
nimbusgb 1:20aa2d4a28bf 97 }
nimbusgb 1:20aa2d4a28bf 98
nimbusgb 1:20aa2d4a28bf 99 int SHT75::read(char ack)
nimbusgb 1:20aa2d4a28bf 100 {
nimbusgb 1:20aa2d4a28bf 101 auto int i,s;
nimbusgb 1:20aa2d4a28bf 102 auto char c;
nimbusgb 1:20aa2d4a28bf 103 s = 0;
nimbusgb 1:20aa2d4a28bf 104 _data.input(); // bus to input
nimbusgb 1:20aa2d4a28bf 105
nimbusgb 1:20aa2d4a28bf 106 for (i=0;i<8;i++)
nimbusgb 1:20aa2d4a28bf 107 {
nimbusgb 1:20aa2d4a28bf 108 s <<= 1;
nimbusgb 1:20aa2d4a28bf 109 wait_us(1);
nimbusgb 1:20aa2d4a28bf 110 _clock = 1; // clock high
nimbusgb 1:20aa2d4a28bf 111 wait_us(1);
nimbusgb 1:20aa2d4a28bf 112 c = _data; // get the data bit
nimbusgb 1:20aa2d4a28bf 113 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 114 if ( c )
nimbusgb 1:20aa2d4a28bf 115 s |= 1;
nimbusgb 1:20aa2d4a28bf 116 }
nimbusgb 1:20aa2d4a28bf 117
nimbusgb 1:20aa2d4a28bf 118 if (ack == 1)
nimbusgb 1:20aa2d4a28bf 119 _data = 0; // data lo
nimbusgb 1:20aa2d4a28bf 120 else
nimbusgb 1:20aa2d4a28bf 121 _data = 1; // data hi
nimbusgb 1:20aa2d4a28bf 122 _data.output();
nimbusgb 1:20aa2d4a28bf 123 _clock = 1; // clock lo
nimbusgb 1:20aa2d4a28bf 124 wait_us(1);
nimbusgb 1:20aa2d4a28bf 125 _clock = 0; // clock lo
nimbusgb 1:20aa2d4a28bf 126 _data = 1; // data hi
nimbusgb 1:20aa2d4a28bf 127 _data.input();
nimbusgb 1:20aa2d4a28bf 128 return s;
nimbusgb 1:20aa2d4a28bf 129 }
nimbusgb 1:20aa2d4a28bf 130
nimbusgb 1:20aa2d4a28bf 131
nimbusgb 1:20aa2d4a28bf 132 // Put the current temperature into passed variable
nimbusgb 1:20aa2d4a28bf 133 bool SHT75::readTempTicks(int* temp)
nimbusgb 1:20aa2d4a28bf 134 {
nimbusgb 1:20aa2d4a28bf 135 int v, value;
nimbusgb 1:20aa2d4a28bf 136 start(); // Start a tx ( leaves data as input )
nimbusgb 1:20aa2d4a28bf 137 if (write(0x03) == 0) // send the read command and get an ack
nimbusgb 1:20aa2d4a28bf 138 {
nimbusgb 1:20aa2d4a28bf 139 for (v=0; v<50; v ++) // wait for ready up to 500 ms
nimbusgb 1:20aa2d4a28bf 140 {
nimbusgb 1:20aa2d4a28bf 141 wait_ms(10); // 10 ms pause
nimbusgb 1:20aa2d4a28bf 142 if ( _data == 0 ) //
nimbusgb 1:20aa2d4a28bf 143 {
nimbusgb 1:20aa2d4a28bf 144 value = read(1); // read a byte
nimbusgb 1:20aa2d4a28bf 145 value <<= 8; // shift it in
nimbusgb 1:20aa2d4a28bf 146 value |= read(1); // read another byte
nimbusgb 1:20aa2d4a28bf 147 read(0);
nimbusgb 1:20aa2d4a28bf 148 // transfer the value
nimbusgb 1:20aa2d4a28bf 149 *temp = value;
nimbusgb 1:20aa2d4a28bf 150 reset();
nimbusgb 1:20aa2d4a28bf 151 return true;
nimbusgb 1:20aa2d4a28bf 152 }
nimbusgb 1:20aa2d4a28bf 153 }
nimbusgb 1:20aa2d4a28bf 154 }
nimbusgb 1:20aa2d4a28bf 155 return false;
nimbusgb 1:20aa2d4a28bf 156 }
nimbusgb 1:20aa2d4a28bf 157
nimbusgb 1:20aa2d4a28bf 158 bool SHT75::readHumidityTicks(int* humi)
nimbusgb 1:20aa2d4a28bf 159 {
nimbusgb 1:20aa2d4a28bf 160 start();
nimbusgb 1:20aa2d4a28bf 161 if (write(0x05) == 0)
nimbusgb 1:20aa2d4a28bf 162 {
nimbusgb 1:20aa2d4a28bf 163 for (int value=0; value<50; value ++) // wait for ready up to 500 ms
nimbusgb 1:20aa2d4a28bf 164 {
nimbusgb 1:20aa2d4a28bf 165 wait_ms(10); //
nimbusgb 1:20aa2d4a28bf 166 if ( _data == 0 ) //
nimbusgb 1:20aa2d4a28bf 167 {
nimbusgb 1:20aa2d4a28bf 168 value = read(1);
nimbusgb 1:20aa2d4a28bf 169 value <<= 8;
nimbusgb 1:20aa2d4a28bf 170 value |= read(1);
nimbusgb 1:20aa2d4a28bf 171 read(0);
nimbusgb 1:20aa2d4a28bf 172 *humi = value; // transfer the value
nimbusgb 1:20aa2d4a28bf 173 reset();
nimbusgb 1:20aa2d4a28bf 174 return true;
nimbusgb 1:20aa2d4a28bf 175 }
nimbusgb 1:20aa2d4a28bf 176 }
nimbusgb 1:20aa2d4a28bf 177 }
nimbusgb 1:20aa2d4a28bf 178
nimbusgb 1:20aa2d4a28bf 179 return false;
nimbusgb 1:20aa2d4a28bf 180 }