peltier with 2 fans

Dependencies:   mbed TextLCD

Committer:
redplam
Date:
Mon Apr 14 02:15:32 2014 +0000
Revision:
4:5213bee8158e
myproject;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
redplam 4:5213bee8158e 1
redplam 4:5213bee8158e 2 #include "DHT.h"
redplam 4:5213bee8158e 3
redplam 4:5213bee8158e 4 #define DHT_DATA_BIT_COUNT 40
redplam 4:5213bee8158e 5
redplam 4:5213bee8158e 6 DHT::DHT(PinName pin,int DHTtype) {
redplam 4:5213bee8158e 7 _pin = pin;
redplam 4:5213bee8158e 8 _DHTtype = DHTtype;
redplam 4:5213bee8158e 9 _firsttime=true;
redplam 4:5213bee8158e 10 }
redplam 4:5213bee8158e 11
redplam 4:5213bee8158e 12 DHT::~DHT() {
redplam 4:5213bee8158e 13 }
redplam 4:5213bee8158e 14
redplam 4:5213bee8158e 15 int DHT::readData() {
redplam 4:5213bee8158e 16 int i, j, retryCount,b;
redplam 4:5213bee8158e 17 unsigned int bitTimes[DHT_DATA_BIT_COUNT];
redplam 4:5213bee8158e 18
redplam 4:5213bee8158e 19 eError err = ERROR_NONE;
redplam 4:5213bee8158e 20 time_t currentTime = time(NULL);
redplam 4:5213bee8158e 21
redplam 4:5213bee8158e 22 DigitalInOut DHT_io(_pin);
redplam 4:5213bee8158e 23
redplam 4:5213bee8158e 24 for (i = 0; i < DHT_DATA_BIT_COUNT; i++) {
redplam 4:5213bee8158e 25 bitTimes[i] = 0;
redplam 4:5213bee8158e 26 }
redplam 4:5213bee8158e 27
redplam 4:5213bee8158e 28 if (!_firsttime) {
redplam 4:5213bee8158e 29 if (int(currentTime - _lastReadTime) < 2) {
redplam 4:5213bee8158e 30 err = ERROR_NO_PATIENCE;
redplam 4:5213bee8158e 31 return err;
redplam 4:5213bee8158e 32 }
redplam 4:5213bee8158e 33 } else {
redplam 4:5213bee8158e 34 _firsttime=false;
redplam 4:5213bee8158e 35 _lastReadTime=currentTime;
redplam 4:5213bee8158e 36 }
redplam 4:5213bee8158e 37 retryCount = 0;
redplam 4:5213bee8158e 38
redplam 4:5213bee8158e 39 do {
redplam 4:5213bee8158e 40 if (retryCount > 125) {
redplam 4:5213bee8158e 41 err = BUS_BUSY;
redplam 4:5213bee8158e 42 return err;
redplam 4:5213bee8158e 43 }
redplam 4:5213bee8158e 44 retryCount ++;
redplam 4:5213bee8158e 45 wait_us(2);
redplam 4:5213bee8158e 46 } while ((DHT_io==0));
redplam 4:5213bee8158e 47
redplam 4:5213bee8158e 48
redplam 4:5213bee8158e 49 DHT_io.output();
redplam 4:5213bee8158e 50 DHT_io = 0;
redplam 4:5213bee8158e 51 wait_ms(18);
redplam 4:5213bee8158e 52 DHT_io = 1;
redplam 4:5213bee8158e 53 wait_us(40);
redplam 4:5213bee8158e 54 DHT_io.input();
redplam 4:5213bee8158e 55
redplam 4:5213bee8158e 56 retryCount = 0;
redplam 4:5213bee8158e 57 do {
redplam 4:5213bee8158e 58 if (retryCount > 40) {
redplam 4:5213bee8158e 59 err = ERROR_NOT_PRESENT;
redplam 4:5213bee8158e 60 return err;
redplam 4:5213bee8158e 61 }
redplam 4:5213bee8158e 62 retryCount++;
redplam 4:5213bee8158e 63 wait_us(1);
redplam 4:5213bee8158e 64 } while ((DHT_io==1));
redplam 4:5213bee8158e 65
redplam 4:5213bee8158e 66 if (err != ERROR_NONE) {
redplam 4:5213bee8158e 67 return err;
redplam 4:5213bee8158e 68 }
redplam 4:5213bee8158e 69
redplam 4:5213bee8158e 70 wait_us(80);
redplam 4:5213bee8158e 71
redplam 4:5213bee8158e 72 for (i = 0; i < 5; i++) {
redplam 4:5213bee8158e 73 for (j = 0; j < 8; j++) {
redplam 4:5213bee8158e 74
redplam 4:5213bee8158e 75 retryCount = 0;
redplam 4:5213bee8158e 76 do {
redplam 4:5213bee8158e 77 if (retryCount > 75) {
redplam 4:5213bee8158e 78 err = ERROR_DATA_TIMEOUT;
redplam 4:5213bee8158e 79 return err;
redplam 4:5213bee8158e 80 }
redplam 4:5213bee8158e 81 retryCount++;
redplam 4:5213bee8158e 82 wait_us(1);
redplam 4:5213bee8158e 83 } while (DHT_io == 0);
redplam 4:5213bee8158e 84 wait_us(40);
redplam 4:5213bee8158e 85 bitTimes[i*8+j]=DHT_io;
redplam 4:5213bee8158e 86
redplam 4:5213bee8158e 87 int count = 0;
redplam 4:5213bee8158e 88 while (DHT_io == 1 && count < 100) {
redplam 4:5213bee8158e 89 wait_us(1);
redplam 4:5213bee8158e 90 count++;
redplam 4:5213bee8158e 91 }
redplam 4:5213bee8158e 92 }
redplam 4:5213bee8158e 93 }
redplam 4:5213bee8158e 94 DHT_io.output();
redplam 4:5213bee8158e 95 DHT_io = 1;
redplam 4:5213bee8158e 96 for (i = 0; i < 5; i++) {
redplam 4:5213bee8158e 97 b=0;
redplam 4:5213bee8158e 98 for (j=0; j<8; j++) {
redplam 4:5213bee8158e 99 if (bitTimes[i*8+j+1] > 0) {
redplam 4:5213bee8158e 100 b |= ( 1 << (7-j));
redplam 4:5213bee8158e 101 }
redplam 4:5213bee8158e 102 }
redplam 4:5213bee8158e 103 DHT_data[i]=b;
redplam 4:5213bee8158e 104 }
redplam 4:5213bee8158e 105
redplam 4:5213bee8158e 106 //if (DHT_data[4] == ((DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF)) {
redplam 4:5213bee8158e 107 _lastReadTime = currentTime;
redplam 4:5213bee8158e 108 _lastTemperature=CalcTemperature();
redplam 4:5213bee8158e 109 _lastHumidity=CalcHumidity();
redplam 4:5213bee8158e 110
redplam 4:5213bee8158e 111 //} else {
redplam 4:5213bee8158e 112 // err = ERROR_CHECKSUM;
redplam 4:5213bee8158e 113 //}
redplam 4:5213bee8158e 114
redplam 4:5213bee8158e 115 return err;
redplam 4:5213bee8158e 116
redplam 4:5213bee8158e 117 }
redplam 4:5213bee8158e 118
redplam 4:5213bee8158e 119 float DHT::CalcTemperature() {
redplam 4:5213bee8158e 120 int v;
redplam 4:5213bee8158e 121
redplam 4:5213bee8158e 122 switch (_DHTtype) {
redplam 4:5213bee8158e 123 case DHT11:
redplam 4:5213bee8158e 124 v = DHT_data[2];
redplam 4:5213bee8158e 125 return float(v);
redplam 4:5213bee8158e 126 case DHT22:
redplam 4:5213bee8158e 127 v = DHT_data[2] & 0x7F;
redplam 4:5213bee8158e 128 v *= 256;
redplam 4:5213bee8158e 129 v += DHT_data[3];
redplam 4:5213bee8158e 130 v /= 10;
redplam 4:5213bee8158e 131 if (DHT_data[2] & 0x80)
redplam 4:5213bee8158e 132 v *= -1;
redplam 4:5213bee8158e 133 return float(v);
redplam 4:5213bee8158e 134 }
redplam 4:5213bee8158e 135 return 0;
redplam 4:5213bee8158e 136 }
redplam 4:5213bee8158e 137
redplam 4:5213bee8158e 138 float DHT::ReadHumidity() {
redplam 4:5213bee8158e 139 return _lastHumidity;
redplam 4:5213bee8158e 140 }
redplam 4:5213bee8158e 141
redplam 4:5213bee8158e 142 float DHT::ConvertCelciustoFarenheit(float celsius) {
redplam 4:5213bee8158e 143 return celsius * 9 / 5 + 32;
redplam 4:5213bee8158e 144 }
redplam 4:5213bee8158e 145
redplam 4:5213bee8158e 146 float DHT::ConvertCelciustoKelvin(float celsius) {
redplam 4:5213bee8158e 147 return celsius + 273.15;
redplam 4:5213bee8158e 148 }
redplam 4:5213bee8158e 149
redplam 4:5213bee8158e 150 // dewPoint function NOAA
redplam 4:5213bee8158e 151 // reference: http://wahiduddin.net/calc/density_algorithms.htm
redplam 4:5213bee8158e 152 float DHT::CalcdewPoint(float celsius, float humidity) {
redplam 4:5213bee8158e 153 float A0= 373.15/(273.15 + celsius);
redplam 4:5213bee8158e 154 float SUM = -7.90298 * (A0-1);
redplam 4:5213bee8158e 155 SUM += 5.02808 * log10(A0);
redplam 4:5213bee8158e 156 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
redplam 4:5213bee8158e 157 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
redplam 4:5213bee8158e 158 SUM += log10(1013.246);
redplam 4:5213bee8158e 159 float VP = pow(10, SUM-3) * humidity;
redplam 4:5213bee8158e 160 float T = log(VP/0.61078); // temp var
redplam 4:5213bee8158e 161 return (241.88 * T) / (17.558-T);
redplam 4:5213bee8158e 162 }
redplam 4:5213bee8158e 163
redplam 4:5213bee8158e 164 // delta max = 0.6544 wrt dewPoint()
redplam 4:5213bee8158e 165 // 5x faster than dewPoint()
redplam 4:5213bee8158e 166 // reference: http://en.wikipedia.org/wiki/Dew_point
redplam 4:5213bee8158e 167 float DHT::CalcdewPointFast(float celsius, float humidity)
redplam 4:5213bee8158e 168 {
redplam 4:5213bee8158e 169 float a = 17.271;
redplam 4:5213bee8158e 170 float b = 237.7;
redplam 4:5213bee8158e 171 float temp = (a * celsius) / (b + celsius) + log(humidity/100);
redplam 4:5213bee8158e 172 float Td = (b * temp) / (a - temp);
redplam 4:5213bee8158e 173 return Td;
redplam 4:5213bee8158e 174 }
redplam 4:5213bee8158e 175
redplam 4:5213bee8158e 176 float DHT::ReadTemperature(eScale Scale) {
redplam 4:5213bee8158e 177 if (Scale == FARENHEIT)
redplam 4:5213bee8158e 178 return ConvertCelciustoFarenheit(_lastTemperature);
redplam 4:5213bee8158e 179 else if (Scale == KELVIN)
redplam 4:5213bee8158e 180 return ConvertCelciustoKelvin(_lastTemperature);
redplam 4:5213bee8158e 181 else
redplam 4:5213bee8158e 182 return _lastTemperature;
redplam 4:5213bee8158e 183 }
redplam 4:5213bee8158e 184
redplam 4:5213bee8158e 185 float DHT::CalcHumidity() {
redplam 4:5213bee8158e 186 int v;
redplam 4:5213bee8158e 187
redplam 4:5213bee8158e 188 switch (_DHTtype) {
redplam 4:5213bee8158e 189 case DHT11:
redplam 4:5213bee8158e 190 v = DHT_data[0];
redplam 4:5213bee8158e 191 return float(v);
redplam 4:5213bee8158e 192 case DHT22:
redplam 4:5213bee8158e 193 v = DHT_data[0];
redplam 4:5213bee8158e 194 v *= 256;
redplam 4:5213bee8158e 195 v += DHT_data[1];
redplam 4:5213bee8158e 196 v /= 10;
redplam 4:5213bee8158e 197 return float(v);
redplam 4:5213bee8158e 198 }
redplam 4:5213bee8158e 199 return 0;
redplam 4:5213bee8158e 200 }
redplam 4:5213bee8158e 201