Datalogger that reads temperature, humidity and light level every 10 seconds, and store the data in a microSD card (.CSV file).

Dependencies:   DS1302 SDFileSystem mbed

This is a weather station/datalogger using a Freescale FRDM-K64F dev board, a LM35 (temperature sensor), a DHT11 (temperature and humidity sensor), a DS1302 (timekeeper module) and a LDR (light level sensor). All the data is periodically stored on a microSDHC card; The acquisition period is adjustable via software (by setting the value of a counter).

There is also (commented) code for sending all these information via serial to a terminal on PC.

Full explanation, details and schematics can be found here: http://embedded-clovis.blogspot.ca/2014/07/temperature-datalogger-with-arm-cortex.html

Committer:
Clovis
Date:
Fri Jul 04 08:08:38 2014 +0000
Revision:
0:8f0934e41a57
Datalogger for temperature, humidity and light level, using a FRDM-K64F development board by Freescale and storing data on a microSD card. It keeps track of the time by means of a DS1302 timekeeping chip.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clovis 0:8f0934e41a57 1 /*
Clovis 0:8f0934e41a57 2 * DHT Library for Digital-output Humidity and Temperature sensors
Clovis 0:8f0934e41a57 3 *
Clovis 0:8f0934e41a57 4 * Works with DHT11, DHT22
Clovis 0:8f0934e41a57 5 * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio)
Clovis 0:8f0934e41a57 6 * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio)
Clovis 0:8f0934e41a57 7 * AM2302 , temperature-humidity sensor
Clovis 0:8f0934e41a57 8 * HM2303 , Digital-output humidity and temperature sensor
Clovis 0:8f0934e41a57 9 *
Clovis 0:8f0934e41a57 10 * Copyright (C) Wim De Roeve
Clovis 0:8f0934e41a57 11 * based on DHT22 sensor library by HO WING KIT
Clovis 0:8f0934e41a57 12 * Arduino DHT11 library
Clovis 0:8f0934e41a57 13 *
Clovis 0:8f0934e41a57 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
Clovis 0:8f0934e41a57 15 * of this software and associated documnetation files (the "Software"), to deal
Clovis 0:8f0934e41a57 16 * in the Software without restriction, including without limitation the rights
Clovis 0:8f0934e41a57 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Clovis 0:8f0934e41a57 18 * copies of the Software, and to permit persons to whom the Software is
Clovis 0:8f0934e41a57 19 * furished to do so, subject to the following conditions:
Clovis 0:8f0934e41a57 20 *
Clovis 0:8f0934e41a57 21 * The above copyright notice and this permission notice shall be included in
Clovis 0:8f0934e41a57 22 * all copies or substantial portions of the Software.
Clovis 0:8f0934e41a57 23 *
Clovis 0:8f0934e41a57 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Clovis 0:8f0934e41a57 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Clovis 0:8f0934e41a57 26 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Clovis 0:8f0934e41a57 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Clovis 0:8f0934e41a57 28 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Clovis 0:8f0934e41a57 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Clovis 0:8f0934e41a57 30 * THE SOFTWARE.
Clovis 0:8f0934e41a57 31 */
Clovis 0:8f0934e41a57 32
Clovis 0:8f0934e41a57 33 #include "DHT.h"
Clovis 0:8f0934e41a57 34
Clovis 0:8f0934e41a57 35 #define DHT_DATA_BIT_COUNT 40
Clovis 0:8f0934e41a57 36 int data0= 0;
Clovis 0:8f0934e41a57 37 int data2= 0;
Clovis 0:8f0934e41a57 38
Clovis 0:8f0934e41a57 39 DHT::DHT(PinName pin,int DHTtype) {
Clovis 0:8f0934e41a57 40 _pin = pin;
Clovis 0:8f0934e41a57 41 _DHTtype = DHTtype;
Clovis 0:8f0934e41a57 42 _firsttime=true;
Clovis 0:8f0934e41a57 43 }
Clovis 0:8f0934e41a57 44
Clovis 0:8f0934e41a57 45 DHT::~DHT() {
Clovis 0:8f0934e41a57 46 }
Clovis 0:8f0934e41a57 47
Clovis 0:8f0934e41a57 48 int DHT::readData() {
Clovis 0:8f0934e41a57 49 int i, j, retryCount,b;
Clovis 0:8f0934e41a57 50 unsigned int bitTimes[DHT_DATA_BIT_COUNT];
Clovis 0:8f0934e41a57 51
Clovis 0:8f0934e41a57 52 eError err = ERROR_NONE;
Clovis 0:8f0934e41a57 53 time_t currentTime = time(NULL);
Clovis 0:8f0934e41a57 54
Clovis 0:8f0934e41a57 55 DigitalInOut DHT_io(_pin);
Clovis 0:8f0934e41a57 56
Clovis 0:8f0934e41a57 57 for (i = 0; i < DHT_DATA_BIT_COUNT; i++) {
Clovis 0:8f0934e41a57 58 bitTimes[i] = 0;
Clovis 0:8f0934e41a57 59 }
Clovis 0:8f0934e41a57 60
Clovis 0:8f0934e41a57 61 if (!_firsttime) {
Clovis 0:8f0934e41a57 62 if (int(currentTime - _lastReadTime) < 2) {
Clovis 0:8f0934e41a57 63 err = ERROR_NO_PATIENCE;
Clovis 0:8f0934e41a57 64 return err;
Clovis 0:8f0934e41a57 65 }
Clovis 0:8f0934e41a57 66 } else {
Clovis 0:8f0934e41a57 67 _firsttime=false;
Clovis 0:8f0934e41a57 68 _lastReadTime=currentTime;
Clovis 0:8f0934e41a57 69 }
Clovis 0:8f0934e41a57 70 retryCount = 0;
Clovis 0:8f0934e41a57 71
Clovis 0:8f0934e41a57 72 do {
Clovis 0:8f0934e41a57 73 if (retryCount > 125) {
Clovis 0:8f0934e41a57 74 err = BUS_BUSY;
Clovis 0:8f0934e41a57 75 return err;
Clovis 0:8f0934e41a57 76 }
Clovis 0:8f0934e41a57 77 retryCount ++;
Clovis 0:8f0934e41a57 78 wait_us(2);
Clovis 0:8f0934e41a57 79 } while ((DHT_io==0));
Clovis 0:8f0934e41a57 80
Clovis 0:8f0934e41a57 81
Clovis 0:8f0934e41a57 82 DHT_io.output();
Clovis 0:8f0934e41a57 83 DHT_io = 0;
Clovis 0:8f0934e41a57 84 wait_ms(18);
Clovis 0:8f0934e41a57 85 DHT_io = 1;
Clovis 0:8f0934e41a57 86 wait_us(40);
Clovis 0:8f0934e41a57 87 DHT_io.input();
Clovis 0:8f0934e41a57 88
Clovis 0:8f0934e41a57 89 retryCount = 0;
Clovis 0:8f0934e41a57 90 do {
Clovis 0:8f0934e41a57 91 if (retryCount > 40) {
Clovis 0:8f0934e41a57 92 err = ERROR_NOT_PRESENT;
Clovis 0:8f0934e41a57 93 return err;
Clovis 0:8f0934e41a57 94 }
Clovis 0:8f0934e41a57 95 retryCount++;
Clovis 0:8f0934e41a57 96 wait_us(1);
Clovis 0:8f0934e41a57 97 } while ((DHT_io==1));
Clovis 0:8f0934e41a57 98
Clovis 0:8f0934e41a57 99 if (err != ERROR_NONE) {
Clovis 0:8f0934e41a57 100 return err;
Clovis 0:8f0934e41a57 101 }
Clovis 0:8f0934e41a57 102
Clovis 0:8f0934e41a57 103 wait_us(80);
Clovis 0:8f0934e41a57 104
Clovis 0:8f0934e41a57 105 for (i = 0; i < 5; i++) {
Clovis 0:8f0934e41a57 106 for (j = 0; j < 8; j++) {
Clovis 0:8f0934e41a57 107
Clovis 0:8f0934e41a57 108 retryCount = 0;
Clovis 0:8f0934e41a57 109 do {
Clovis 0:8f0934e41a57 110 if (retryCount > 75) {
Clovis 0:8f0934e41a57 111 err = ERROR_DATA_TIMEOUT;
Clovis 0:8f0934e41a57 112 return err;
Clovis 0:8f0934e41a57 113 }
Clovis 0:8f0934e41a57 114 retryCount++;
Clovis 0:8f0934e41a57 115 wait_us(1);
Clovis 0:8f0934e41a57 116 } while (DHT_io == 0);
Clovis 0:8f0934e41a57 117 wait_us(40);
Clovis 0:8f0934e41a57 118 bitTimes[i*8+j]=DHT_io;
Clovis 0:8f0934e41a57 119
Clovis 0:8f0934e41a57 120 int count = 0;
Clovis 0:8f0934e41a57 121 while (DHT_io == 1 && count < 100) {
Clovis 0:8f0934e41a57 122 wait_us(1);
Clovis 0:8f0934e41a57 123 count++;
Clovis 0:8f0934e41a57 124 }
Clovis 0:8f0934e41a57 125 }
Clovis 0:8f0934e41a57 126 }
Clovis 0:8f0934e41a57 127 DHT_io.output();
Clovis 0:8f0934e41a57 128 DHT_io = 1;
Clovis 0:8f0934e41a57 129 for (i = 0; i < 5; i++) {
Clovis 0:8f0934e41a57 130 b=0;
Clovis 0:8f0934e41a57 131 for (j=0; j<8; j++) {
Clovis 0:8f0934e41a57 132 if (bitTimes[i*8+j+1] > 0) {
Clovis 0:8f0934e41a57 133 b |= ( 1 << (7-j));
Clovis 0:8f0934e41a57 134 }
Clovis 0:8f0934e41a57 135 }
Clovis 0:8f0934e41a57 136 DHT_data[i]=b;
Clovis 0:8f0934e41a57 137 }
Clovis 0:8f0934e41a57 138
Clovis 0:8f0934e41a57 139 data2= DHT_data[2];
Clovis 0:8f0934e41a57 140 data0= DHT_data[0];
Clovis 0:8f0934e41a57 141
Clovis 0:8f0934e41a57 142 if ((data2 + data0)%2 == 0){ //This IF statement corrects the "Err 6" issue
Clovis 0:8f0934e41a57 143 data0= data0+1;
Clovis 0:8f0934e41a57 144 }
Clovis 0:8f0934e41a57 145
Clovis 0:8f0934e41a57 146 if (DHT_data[4] == ((data0 + DHT_data[1] + data2 + DHT_data[3]) & 0xFF)) {
Clovis 0:8f0934e41a57 147 _lastReadTime = currentTime;
Clovis 0:8f0934e41a57 148 _lastTemperature=CalcTemperature();
Clovis 0:8f0934e41a57 149 _lastHumidity=CalcHumidity();
Clovis 0:8f0934e41a57 150
Clovis 0:8f0934e41a57 151 } else {
Clovis 0:8f0934e41a57 152 err = ERROR_CHECKSUM;
Clovis 0:8f0934e41a57 153 }
Clovis 0:8f0934e41a57 154
Clovis 0:8f0934e41a57 155 return err;
Clovis 0:8f0934e41a57 156
Clovis 0:8f0934e41a57 157 }
Clovis 0:8f0934e41a57 158
Clovis 0:8f0934e41a57 159 float DHT::CalcTemperature() {
Clovis 0:8f0934e41a57 160 int v;
Clovis 0:8f0934e41a57 161
Clovis 0:8f0934e41a57 162 switch (_DHTtype) {
Clovis 0:8f0934e41a57 163 case DHT11:
Clovis 0:8f0934e41a57 164 v = DHT_data[2];
Clovis 0:8f0934e41a57 165 return float(v);
Clovis 0:8f0934e41a57 166 case DHT22:
Clovis 0:8f0934e41a57 167 v = DHT_data[2] & 0x7F;
Clovis 0:8f0934e41a57 168 v *= 256;
Clovis 0:8f0934e41a57 169 v += DHT_data[3];
Clovis 0:8f0934e41a57 170 v /= 10;
Clovis 0:8f0934e41a57 171 if (DHT_data[2] & 0x80)
Clovis 0:8f0934e41a57 172 v *= -1;
Clovis 0:8f0934e41a57 173 return float(v);
Clovis 0:8f0934e41a57 174 }
Clovis 0:8f0934e41a57 175 return 0;
Clovis 0:8f0934e41a57 176 }
Clovis 0:8f0934e41a57 177
Clovis 0:8f0934e41a57 178 float DHT::ReadHumidity() {
Clovis 0:8f0934e41a57 179 return _lastHumidity;
Clovis 0:8f0934e41a57 180 }
Clovis 0:8f0934e41a57 181
Clovis 0:8f0934e41a57 182 float DHT::ConvertCelciustoFarenheit(float celsius) {
Clovis 0:8f0934e41a57 183 return celsius * 9 / 5 + 32;
Clovis 0:8f0934e41a57 184 }
Clovis 0:8f0934e41a57 185
Clovis 0:8f0934e41a57 186 float DHT::ConvertCelciustoKelvin(float celsius) {
Clovis 0:8f0934e41a57 187 return celsius + 273.15;
Clovis 0:8f0934e41a57 188 }
Clovis 0:8f0934e41a57 189
Clovis 0:8f0934e41a57 190 // dewPoint function NOAA
Clovis 0:8f0934e41a57 191 // reference: http://wahiduddin.net/calc/density_algorithms.htm
Clovis 0:8f0934e41a57 192 float DHT::CalcdewPoint(float celsius, float humidity) {
Clovis 0:8f0934e41a57 193 float A0= 373.15/(273.15 + celsius);
Clovis 0:8f0934e41a57 194 float SUM = -7.90298 * (A0-1);
Clovis 0:8f0934e41a57 195 SUM += 5.02808 * log10(A0);
Clovis 0:8f0934e41a57 196 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
Clovis 0:8f0934e41a57 197 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
Clovis 0:8f0934e41a57 198 SUM += log10(1013.246);
Clovis 0:8f0934e41a57 199 float VP = pow(10, SUM-3) * humidity;
Clovis 0:8f0934e41a57 200 float T = log(VP/0.61078); // temp var
Clovis 0:8f0934e41a57 201 return (241.88 * T) / (17.558-T);
Clovis 0:8f0934e41a57 202 }
Clovis 0:8f0934e41a57 203
Clovis 0:8f0934e41a57 204 // delta max = 0.6544 wrt dewPoint()
Clovis 0:8f0934e41a57 205 // 5x faster than dewPoint()
Clovis 0:8f0934e41a57 206 // reference: http://en.wikipedia.org/wiki/Dew_point
Clovis 0:8f0934e41a57 207 float DHT::CalcdewPointFast(float celsius, float humidity)
Clovis 0:8f0934e41a57 208 {
Clovis 0:8f0934e41a57 209 float a = 17.271;
Clovis 0:8f0934e41a57 210 float b = 237.7;
Clovis 0:8f0934e41a57 211 float temp = (a * celsius) / (b + celsius) + log(humidity/100);
Clovis 0:8f0934e41a57 212 float Td = (b * temp) / (a - temp);
Clovis 0:8f0934e41a57 213 return Td;
Clovis 0:8f0934e41a57 214 }
Clovis 0:8f0934e41a57 215
Clovis 0:8f0934e41a57 216 float DHT::ReadTemperature(eScale Scale) {
Clovis 0:8f0934e41a57 217 if (Scale == FARENHEIT)
Clovis 0:8f0934e41a57 218 return ConvertCelciustoFarenheit(_lastTemperature);
Clovis 0:8f0934e41a57 219 else if (Scale == KELVIN)
Clovis 0:8f0934e41a57 220 return ConvertCelciustoKelvin(_lastTemperature);
Clovis 0:8f0934e41a57 221 else
Clovis 0:8f0934e41a57 222 return _lastTemperature;
Clovis 0:8f0934e41a57 223 }
Clovis 0:8f0934e41a57 224
Clovis 0:8f0934e41a57 225 float DHT::CalcHumidity() {
Clovis 0:8f0934e41a57 226 int v;
Clovis 0:8f0934e41a57 227
Clovis 0:8f0934e41a57 228 switch (_DHTtype) {
Clovis 0:8f0934e41a57 229 case DHT11:
Clovis 0:8f0934e41a57 230 v = DHT_data[0];
Clovis 0:8f0934e41a57 231 return float(v);
Clovis 0:8f0934e41a57 232 case DHT22:
Clovis 0:8f0934e41a57 233 v = DHT_data[0];
Clovis 0:8f0934e41a57 234 v *= 256;
Clovis 0:8f0934e41a57 235 v += DHT_data[1];
Clovis 0:8f0934e41a57 236 v /= 10;
Clovis 0:8f0934e41a57 237 return float(v);
Clovis 0:8f0934e41a57 238 }
Clovis 0:8f0934e41a57 239 return 0;
Clovis 0:8f0934e41a57 240 }
Clovis 0:8f0934e41a57 241
Clovis 0:8f0934e41a57 242