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
Revision 0:8f0934e41a57, committed 2014-07-04
- Comitter:
- Clovis
- Date:
- Fri Jul 04 08:08:38 2014 +0000
- Commit message:
- 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.
Changed in this revision
diff -r 000000000000 -r 8f0934e41a57 DHT.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DHT.cpp Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,242 @@ +/* + * DHT Library for Digital-output Humidity and Temperature sensors + * + * Works with DHT11, DHT22 + * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio) + * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio) + * AM2302 , temperature-humidity sensor + * HM2303 , Digital-output humidity and temperature sensor + * + * Copyright (C) Wim De Roeve + * based on DHT22 sensor library by HO WING KIT + * Arduino DHT11 library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "DHT.h" + +#define DHT_DATA_BIT_COUNT 40 +int data0= 0; +int data2= 0; + +DHT::DHT(PinName pin,int DHTtype) { + _pin = pin; + _DHTtype = DHTtype; + _firsttime=true; +} + +DHT::~DHT() { +} + +int DHT::readData() { + int i, j, retryCount,b; + unsigned int bitTimes[DHT_DATA_BIT_COUNT]; + + eError err = ERROR_NONE; + time_t currentTime = time(NULL); + + DigitalInOut DHT_io(_pin); + + for (i = 0; i < DHT_DATA_BIT_COUNT; i++) { + bitTimes[i] = 0; + } + + if (!_firsttime) { + if (int(currentTime - _lastReadTime) < 2) { + err = ERROR_NO_PATIENCE; + return err; + } + } else { + _firsttime=false; + _lastReadTime=currentTime; + } + retryCount = 0; + + do { + if (retryCount > 125) { + err = BUS_BUSY; + return err; + } + retryCount ++; + wait_us(2); + } while ((DHT_io==0)); + + + DHT_io.output(); + DHT_io = 0; + wait_ms(18); + DHT_io = 1; + wait_us(40); + DHT_io.input(); + + retryCount = 0; + do { + if (retryCount > 40) { + err = ERROR_NOT_PRESENT; + return err; + } + retryCount++; + wait_us(1); + } while ((DHT_io==1)); + + if (err != ERROR_NONE) { + return err; + } + + wait_us(80); + + for (i = 0; i < 5; i++) { + for (j = 0; j < 8; j++) { + + retryCount = 0; + do { + if (retryCount > 75) { + err = ERROR_DATA_TIMEOUT; + return err; + } + retryCount++; + wait_us(1); + } while (DHT_io == 0); + wait_us(40); + bitTimes[i*8+j]=DHT_io; + + int count = 0; + while (DHT_io == 1 && count < 100) { + wait_us(1); + count++; + } + } + } + DHT_io.output(); + DHT_io = 1; + for (i = 0; i < 5; i++) { + b=0; + for (j=0; j<8; j++) { + if (bitTimes[i*8+j+1] > 0) { + b |= ( 1 << (7-j)); + } + } + DHT_data[i]=b; + } + + data2= DHT_data[2]; + data0= DHT_data[0]; + + if ((data2 + data0)%2 == 0){ //This IF statement corrects the "Err 6" issue + data0= data0+1; + } + + if (DHT_data[4] == ((data0 + DHT_data[1] + data2 + DHT_data[3]) & 0xFF)) { + _lastReadTime = currentTime; + _lastTemperature=CalcTemperature(); + _lastHumidity=CalcHumidity(); + + } else { + err = ERROR_CHECKSUM; + } + + return err; + +} + +float DHT::CalcTemperature() { + int v; + + switch (_DHTtype) { + case DHT11: + v = DHT_data[2]; + return float(v); + case DHT22: + v = DHT_data[2] & 0x7F; + v *= 256; + v += DHT_data[3]; + v /= 10; + if (DHT_data[2] & 0x80) + v *= -1; + return float(v); + } + return 0; +} + +float DHT::ReadHumidity() { + return _lastHumidity; +} + +float DHT::ConvertCelciustoFarenheit(float celsius) { + return celsius * 9 / 5 + 32; +} + +float DHT::ConvertCelciustoKelvin(float celsius) { + return celsius + 273.15; +} + +// dewPoint function NOAA +// reference: http://wahiduddin.net/calc/density_algorithms.htm +float DHT::CalcdewPoint(float celsius, float humidity) { + float A0= 373.15/(273.15 + celsius); + float SUM = -7.90298 * (A0-1); + SUM += 5.02808 * log10(A0); + SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; + SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; + SUM += log10(1013.246); + float VP = pow(10, SUM-3) * humidity; + float T = log(VP/0.61078); // temp var + return (241.88 * T) / (17.558-T); +} + +// delta max = 0.6544 wrt dewPoint() +// 5x faster than dewPoint() +// reference: http://en.wikipedia.org/wiki/Dew_point +float DHT::CalcdewPointFast(float celsius, float humidity) +{ + float a = 17.271; + float b = 237.7; + float temp = (a * celsius) / (b + celsius) + log(humidity/100); + float Td = (b * temp) / (a - temp); + return Td; +} + +float DHT::ReadTemperature(eScale Scale) { + if (Scale == FARENHEIT) + return ConvertCelciustoFarenheit(_lastTemperature); + else if (Scale == KELVIN) + return ConvertCelciustoKelvin(_lastTemperature); + else + return _lastTemperature; +} + +float DHT::CalcHumidity() { + int v; + + switch (_DHTtype) { + case DHT11: + v = DHT_data[0]; + return float(v); + case DHT22: + v = DHT_data[0]; + v *= 256; + v += DHT_data[1]; + v /= 10; + return float(v); + } + return 0; +} + +
diff -r 000000000000 -r 8f0934e41a57 DHT.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DHT.h Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,94 @@ +/* + * DHT Library for Digital-output Humidity and Temperature sensors + * + * Works with DHT11, DHT21, DHT22 + * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio) + * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio) + * AM2302 , temperature-humidity sensor + * RHT01,RHT02, RHT03 , Humidity and Temperature Sensor (Sparkfun) + * + * Copyright (C) Wim De Roeve + * based on DHT22 sensor library by HO WING KIT + * Arduino DHT11 library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MBED_DHT_H +#define MBED_DHT_H + +#include "mbed.h" + +enum eType{ + DHT11 = 11, + SEN11301P = 11, + RHT01 = 11, + DHT22 = 22, + AM2302 = 22, + SEN51035P = 22, + RHT02 = 22, + RHT03 = 22 + } ; + +enum eError { + ERROR_NONE = 0, + BUS_BUSY =1, + ERROR_NOT_PRESENT =2 , + ERROR_ACK_TOO_LONG =3 , + ERROR_SYNC_TIMEOUT = 4, + ERROR_DATA_TIMEOUT =5 , + ERROR_CHECKSUM = 6, + ERROR_NO_PATIENCE =7 +} ; + +typedef enum { + CELCIUS =0 , + FARENHEIT =1, + KELVIN=2 +} eScale; + + +class DHT { + +public: + + DHT(PinName pin,int DHTtype); + ~DHT(); + int readData(void); + float ReadHumidity(void); + float ReadTemperature(eScale Scale); + float CalcdewPoint(float celsius, float humidity); + float CalcdewPointFast(float celsius, float humidity); + +private: + time_t _lastReadTime; + float _lastTemperature; + float _lastHumidity; + PinName _pin; + bool _firsttime; + int _DHTtype; + int DHT_data[6]; + float CalcTemperature(); + float CalcHumidity(); + float ConvertCelciustoFarenheit(float); + float ConvertCelciustoKelvin(float); + +}; + +#endif
diff -r 000000000000 -r 8f0934e41a57 DS1302.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1302.lib Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Sissors/code/DS1302/#9a746f303e59
diff -r 000000000000 -r 8f0934e41a57 SDFileSystem.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/SDFileSystem/#7b35d1709458
diff -r 000000000000 -r 8f0934e41a57 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,88 @@ +#include "mbed.h" +#include "SDFileSystem.h" +#include "DHT.h" +#include "DS1302.h" + +// Defines for the DS1302 timer module +#define SCLK PTC1 +#define IO PTB19 +#define CE PTB18 + +SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); //MOSI, MISO, SCLK, SSEL. (SD Card) Tested on K64F, correct pins. +AnalogIn LM35(PTB2); +AnalogIn LDR(PTB3); +int count=0; +float ldrcalc= 0.00; +DigitalOut RedLed(LED1); // Error indication +DigitalOut GreenLed(LED2); // LM35 read indication +DigitalOut Blueled(LED3); // DHT11 read indication +DHT sensor(PTB20,DHT11); // Use the DHT11 sensor, on pin +DS1302 clk(SCLK, IO, PTB18); // ports for the DS1302 time keeper + +int main() { + // the 6 lines below are for the time keeper chip + #ifdef INITIAL_RUN + clk.set_time(1403949720); + #endif + + char storedByte = clk.recallByte(0); + //printf("\r\nStored byte was %d, now increasing by one\r\n", storedByte); + clk.storeByte(0, storedByte + 1); + // + + int err; + wait(1); // wait 1 second for DHT11 to stabilyze + + //printf("Hello World!\n"); + + mkdir("/sd/dados", 0777); + + FILE *fp = fopen("/sd/dados/data001.csv", "w"); + if(fp == NULL) { + error("Could not open file for write\n"); + RedLed= 0; + + } + while (1) { + + Blueled= 1; + RedLed= 1; + GreenLed= 1; + + if (count < 12000000){ + count++; + } else{ + // -------------------------- + + err = sensor.readData(); + if (err == 0) { + GreenLed= 0; + printf("Temperature is %4.2f \r\n",sensor.ReadTemperature(CELCIUS)); + //printf("Temperature is %4.2f F \r\n",sensor.ReadTemperature(FARENHEIT)); + //printf("Temperature is %4.2f K \r\n",sensor.ReadTemperature(KELVIN)); + printf("Humidity is %4.2f \r\n",sensor.ReadHumidity()); + //printf("Dew point is %4.2f \r\n",sensor.CalcdewPoint(sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity())); + //printf("Dew point (fast) is %4.2f \r\n",sensor.CalcdewPointFast(sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity())); + + } else + printf("\r\nErr %i \n",err); + + // ---------------------------- + FILE *fp = fopen("/sd/dados/data001.csv", "a"); + if(fp == NULL) { + error("Could not open file for write\n"); + + } + + ldrcalc= LDR.read(); + ldrcalc= (1/ldrcalc)-1; + time_t seconds = clk.time(NULL); + //fprintf(fp, "%s\r,%f,%f,%f\n", "LM35", "DHT11", "Humid", "Month", "Day", "Hour", "Year"); + fprintf(fp, "%s\r,%f,%f,%f,%f", ctime(&seconds), 333.333*LM35.read(), sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity(), ldrcalc); + fclose(fp); + //printf("Goodbye World!\n"); + count=0; + Blueled= 0; + } + } + } \ No newline at end of file
diff -r 000000000000 -r 8f0934e41a57 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Jul 04 08:08:38 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/024bf7f99721 \ No newline at end of file