grove_temp_hum
grove_temp_hum.cpp@0:f0824fc8b273, 2015-06-09 (annotated)
- Committer:
- JackyZhangFromSeeed
- Date:
- Tue Jun 09 10:19:38 2015 +0000
- Revision:
- 0:f0824fc8b273
grove_temp_hum
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JackyZhangFromSeeed | 0:f0824fc8b273 | 1 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 2 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 3 | #include "suli2.h" |
JackyZhangFromSeeed | 0:f0824fc8b273 | 4 | #include "grove_temp_hum.h" |
JackyZhangFromSeeed | 0:f0824fc8b273 | 5 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 6 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 7 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 8 | //local functions |
JackyZhangFromSeeed | 0:f0824fc8b273 | 9 | static bool _read(IO_T *io); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 10 | static float grove_temp_hum_convertCtoF(float c); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 11 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 12 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 13 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 14 | //local variables |
JackyZhangFromSeeed | 0:f0824fc8b273 | 15 | static uint8_t _type, _count; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 16 | static bool firstreading; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 17 | static unsigned long _lastreadtime; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 18 | static uint8_t data[6]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 19 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 20 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 21 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 22 | void grove_temp_hum_init(IO_T *io, int pin) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 23 | { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 24 | suli_pin_init(io, pin, SULI_INPUT); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 25 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 26 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 27 | bool grove_temp_hum_write_setup(IO_T *io, uint8_t type, uint8_t count) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 28 | { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 29 | _type = type; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 30 | _count = count; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 31 | firstreading = true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 32 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 33 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 34 | static bool _read(IO_T *io) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 35 | { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 36 | uint8_t laststate = SULI_HIGH; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 37 | uint8_t counter = 0; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 38 | uint8_t j = 0, i; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 39 | unsigned long currenttime; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 40 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 41 | // pull the pin high and wait 250 milliseconds |
JackyZhangFromSeeed | 0:f0824fc8b273 | 42 | //digitalWrite(_pin, SULI_HIGH); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 43 | suli_pin_write(io, SULI_HIGH); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 44 | suli_delay_ms(250); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 45 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 46 | currenttime = suli_millis(); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 47 | if (currenttime < _lastreadtime) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 48 | // ie there was a rollover |
JackyZhangFromSeeed | 0:f0824fc8b273 | 49 | _lastreadtime = 0; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 50 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 51 | if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 52 | return true; // return last correct measurement |
JackyZhangFromSeeed | 0:f0824fc8b273 | 53 | //delay(2000 - (currenttime - _lastreadtime)); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 54 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 55 | firstreading = false; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 56 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 57 | _lastreadtime = suli_millis(); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 58 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 59 | data[0] = data[1] = data[2] = data[3] = data[4] = 0; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 60 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 61 | // now pull it low for ~20 milliseconds |
JackyZhangFromSeeed | 0:f0824fc8b273 | 62 | //pinMode(_pin, OUTPUT); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 63 | suli_pin_dir(io, SULI_OUTPUT) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 64 | //digitalWrite(_pin, LOW); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 65 | suli_pin_write(io, SULI_LOW); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 66 | suli_delay_ms(20); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 67 | //cli(); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 68 | //digitalWrite(_pin, SULI_HIGH); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 69 | suli_pin_write(io, SULI_HIGH); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 70 | //delayMicroseconds(40); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 71 | suli_delay_us(40); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 72 | //pinMode(_pin, INPUT); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 73 | suli_pin_dir(io, SULI_INPUT) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 74 | // read in timings |
JackyZhangFromSeeed | 0:f0824fc8b273 | 75 | for ( i=0; i< MAXTIMINGS; i++) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 76 | counter = 0; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 77 | //while (digitalRead(_pin) == laststate) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 78 | while (suli_pin_read(io) == laststate) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 79 | counter++; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 80 | //delayMicroseconds(1); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 81 | suli_delay_us(1); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 82 | if (counter == 255) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 83 | break; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 84 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 85 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 86 | //laststate = digitalRead(&_pin); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 87 | laststate = suli_pin_read(io); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 88 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 89 | if (counter == 255) break; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 90 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 91 | // ignore first 3 transitions |
JackyZhangFromSeeed | 0:f0824fc8b273 | 92 | if ((i >= 4) && (i%2 == 0)) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 93 | // shove each bit into the storage bytes |
JackyZhangFromSeeed | 0:f0824fc8b273 | 94 | data[j/8] <<= 1; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 95 | if (counter > _count)// |
JackyZhangFromSeeed | 0:f0824fc8b273 | 96 | data[j/8] |= 1; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 97 | j++; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 98 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 99 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 100 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 101 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 102 | // check we read 40 bits and that the checksum matches |
JackyZhangFromSeeed | 0:f0824fc8b273 | 103 | if ((j >= 40) && |
JackyZhangFromSeeed | 0:f0824fc8b273 | 104 | (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 105 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 106 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 107 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 108 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 109 | return false; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 110 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 111 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 112 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 113 | static float grove_temp_hum_convertCtoF(float c) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 114 | return c * 9 / 5 + 32; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 115 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 116 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 117 | //boolean S == Scale. True == Farenheit; False == Celcius |
JackyZhangFromSeeed | 0:f0824fc8b273 | 118 | bool grove_temp_hum_readtemperature(IO_T *io, bool S, float *temperature) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 119 | { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 120 | float f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 121 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 122 | if (_read(io)) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 123 | switch (_type) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 124 | case DHT11: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 125 | f = data[2]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 126 | if(S) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 127 | f = grove_temp_hum_convertCtoF(f); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 128 | *temperature = f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 129 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 130 | case DHT22: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 131 | case DHT21: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 132 | f = data[2] & 0x7F; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 133 | f *= 256; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 134 | f += data[3]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 135 | f /= 10; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 136 | if (data[2] & 0x80) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 137 | f *= -1; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 138 | if(S) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 139 | f = grove_temp_hum_convertCtoF(f); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 140 | *temperature = f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 141 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 142 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 143 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 144 | //Serial.print("Read fail"); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 145 | return false; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 146 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 147 | |
JackyZhangFromSeeed | 0:f0824fc8b273 | 148 | bool grove_temp_hum_readhumidity(IO_T *io, float *humidity) |
JackyZhangFromSeeed | 0:f0824fc8b273 | 149 | { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 150 | float f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 151 | if (_read(io)) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 152 | switch (_type) { |
JackyZhangFromSeeed | 0:f0824fc8b273 | 153 | case DHT11: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 154 | f = data[0]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 155 | *humidity = f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 156 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 157 | case DHT22: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 158 | case DHT21: |
JackyZhangFromSeeed | 0:f0824fc8b273 | 159 | f = data[0]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 160 | f *= 256; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 161 | f += data[1]; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 162 | f /= 10; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 163 | *humidity = f; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 164 | return true; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 165 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 166 | } |
JackyZhangFromSeeed | 0:f0824fc8b273 | 167 | //Serial.print("Read fail"); |
JackyZhangFromSeeed | 0:f0824fc8b273 | 168 | return false; |
JackyZhangFromSeeed | 0:f0824fc8b273 | 169 | } |