Sensiron SHT 7x Temperature and humidity device library
Dependents: temp xj-Nucleo-F303K8-SHT75-TEST
sht7X.cpp@5:db6b417dfa74, 2010-10-27 (annotated)
- Committer:
- nimbusgb
- Date:
- Wed Oct 27 16:37:33 2010 +0000
- Revision:
- 5:db6b417dfa74
- Parent:
- 1:20aa2d4a28bf
Who changed what in which revision?
User | Revision | Line number | New 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 | } |