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