grove_temp_hum

Committer:
JackyZhangFromSeeed
Date:
Tue Jun 09 10:19:38 2015 +0000
Revision:
0:f0824fc8b273
grove_temp_hum

Who changed what in which revision?

UserRevisionLine numberNew 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 }