Skip to content

Instantly share code, notes, and snippets.

@rqbazan
Last active August 23, 2017 14:40
Show Gist options
  • Save rqbazan/87ad3dd692ec7b16c90de5d23e2c1cca to your computer and use it in GitHub Desktop.
Save rqbazan/87ad3dd692ec7b16c90de5d23e2c1cca to your computer and use it in GitHub Desktop.
/*
* References:
*
* Datalogger by Arduino: https://www.arduino.cc/en/Tutorial/Datalogger
* Clock TinyRTC Tutorial: http://www.prometec.net/relojes-rtc/
* DHT22 Sensor Tutorial: http://www.naylampmechatronics.com/blog/40_Tutorial-sensor-de-temperatura-y-humedad-DHT1.html
* Ethernet Shield V2 Wiki: http://wiki.seeedstudio.com/wiki/Ethernet_Shield_V2.0
* DFR0026 Light Sensor Guide: https://www.dfrobot.com/wiki/index.php/DFRobot_Ambient_Light_Sensor_(SKU:DFR0026_)
* DS1307 RTC Tutorial: http://www.geekfactory.mx/tutoriales/tutoriales-arduino/ds1307-en-tinyrtc-con-arduino/
*
* Source Libraries:
*
* https://github.com/adafruit/DHT-sensor-library
* https://github.com/PaulStoffregen/DS1307RTC
* https://github.com/PaulStoffregen/Time
* https://github.com/PaulStoffregen/TimeAlarms
*
* Docs:
*
* https://www.pjrc.com/teensy/td_libs_DS1307RTC.html
* https://www.pjrc.com/teensy/td_libs_Time.html
* https://www.pjrc.com/teensy/td_libs_TimeAlarms.html
*
*/
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <TimeAlarms.h>
#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT22
#define ANALOG_PIN_LIGHT_SENSOR 0
#define DIGITAL_PIN_DHT22_SENSOR 2
#define DIGITAL_PIN_LED_RED 3
#define DIGITAL_PIN_LED_GREEN 4
#define DIGITAL_PIN_LED_BLUE 5
#define CHIP_SELECT 4
String to2Digits(int number)
{
return (number >= 0 && number < 10)? "0" + String(number) : String(number);
}
String getDateTime()
{
tmElements_t datetime;
if (RTC.read(datetime))
{
return String(datetime.Day) + "-" + String(datetime.Month) + "-" + String(tmYearToCalendar(datetime.Year)) + " " +
to2Digits(datetime.Hour) + ":" + to2Digits(datetime.Minute) + ":" + to2Digits(datetime.Second);
}
return "";
}
struct HourOfDay
{
int hour, minute, second;
HourOfDay(int h, int m, int s) : hour(h), minute(m), second(s) {}
HourOfDay() : hour(0), minute(0), second(0) {}
};
class Log
{
private:
String filename;
File fileLog;
public:
Log(String filename) : filename(filename) {}
boolean logging(String information)
{
fileLog = SD.open(filename, FILE_WRITE);
if (fileLog)
{
String datetimeFormated = getDateTime();
if (datetimeFormated.length() != 0)
{
fileLog.println(datetimeFormated + ", " + information);
Serial.println(datetimeFormated + ", " + information);
fileLog.close();
return true;
}
}
return false;
}
};
class Led
{
private:
int pin;
public:
Led(int pin = LED_BUILTIN) : pin(pin)
{
pinMode(pin, OUTPUT);
}
void turnOn()
{
digitalWrite(pin, LOW);
}
void turnOff()
{
digitalWrite(pin, HIGH);
}
};
class LedDigitalRGB
{
private:
Led red, green, blue;
public:
LedDigitalRGB(int pinRedLed, int pinGreenLed, int pinBlueLed)
{
red = Led(pinRedLed);
green = Led(pinGreenLed);
blue = Led(pinBlueLed);
}
void turnOff()
{
red.turnOff();
green.turnOff();
blue.turnOff();
}
void turnOnRed()
{
red.turnOn();
green.turnOff();
blue.turnOff();
}
void turnOnGreen()
{
red.turnOff();
green.turnOn();
blue.turnOff();
}
void turnOnBlue()
{
red.turnOff();
green.turnOff();
blue.turnOn();
}
};
class DFR0026
{
private:
int analogPin;
public:
DFR0026(int analogPin) : analogPin(analogPin) {}
int read()
{
return analogRead(analogPin);
}
};
class ClimateMeter
{
private:
const int TIME_MILLIS_SECOND_TO_SLEEP = 1000;
const int TIME_MINUTES_TO_TAKE_DATA = 30;
int valueLightSensor;
float valueHumiditySensor, valueTemperatureSensor;
DHT dht22;
DFR0026 lightSensor;
Log log;
LedDigitalRGB ledRGBIndicator;
boolean saveData(int light, int humidity, int temperature)
{
String data = String(light) + ", " + String(humidity) + ", " + String(temperature);
return log.logging(data);
}
public:
ClimateMeter(DFR0026 lightSensor, DHT dht22, Log log, LedDigitalRGB ledRGBIndicator)
: lightSensor(lightSensor), dht22(dht22), log(log), ledRGBIndicator(ledRGBIndicator) {}
void setup()
{
dht22.begin();
ledRGBIndicator.turnOff();
}
void takeData()
{
valueLightSensor = lightSensor.read();
valueHumiditySensor = dht22.readHumidity();
valueTemperatureSensor = dht22.readTemperature();
if(saveData(valueLightSensor, valueHumiditySensor, valueTemperatureSensor))
ledRGBIndicator.turnOnBlue();
else
ledRGBIndicator.turnOnRed();
Alarm.delay(TIME_MILLIS_SECOND_TO_SLEEP);
}
void takeDataForAWhile()
{
tmElements_t before, after;
if (!RTC.read(before)) return;
if (!RTC.read(after)) return;
int stopMinute = (before.Minute + TIME_MINUTES_TO_TAKE_DATA) % 60;
while (after.Minute != stopMinute || after.Second <= before.Second)
{
takeData();
if (!RTC.read(after)) return;
}
}
void waitForAlarm()
{
ledRGBIndicator.turnOnGreen();
}
};
DFR0026 dfr0026(ANALOG_PIN_LIGHT_SENSOR);
DHT dht22(DIGITAL_PIN_DHT22_SENSOR, DHTTYPE);
Log logger("datalog.txt");
LedDigitalRGB ledRGB(DIGITAL_PIN_LED_RED, DIGITAL_PIN_LED_GREEN, DIGITAL_PIN_LED_BLUE);
ClimateMeter climateMeter(dfr0026, dht22, logger, ledRGB);
HourOfDay alarms[] = {
HourOfDay(5, 45, 0),
HourOfDay(14, 0, 0),
HourOfDay(19, 0, 0)
};
void setup()
{
Serial.begin(9600);
while(!Serial);
setSyncProvider(RTC.get);
if (timeStatus() != timeSet) Serial.println("Fallo de RTC");
else Serial.println("Sincronizado con RTC");
Serial.print("Iniciando SD card...");
if (SD.begin(CHIP_SELECT)) Serial.println("card iniciada.");
else Serial.println("SD Card falló, o no esta presente");
climateMeter.setup();
int nAlarms = (sizeof(alarms) / sizeof(*alarms));
for(int i = 0; i < nAlarms; i++)
{
Alarm.alarmRepeat(alarms[i].hour, alarms[i].minute, alarms[i].second, takeDataWrapper);
}
}
void takeDataWrapper()
{
climateMeter.takeDataForAWhile();
}
void loop()
{
climateMeter.waitForAlarm();
String formated = getDateTime();
if (formated.length() != 0)
Serial.println(formated);
Alarm.delay(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment