#include <MsTimer2.h>
//for our timing to manage time properly or multitasking
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Button2.h>
#include "DHT.h"
#include "RTClib.h"
RTC_DS1307 rtc;
DateTime startTime1;
#define DHT1_PIN 23
#define DHT2_PIN 25
#define DHT3_PIN 27
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht1(DHT1_PIN, DHTTYPE);
DHT dht2(DHT2_PIN, DHTTYPE);
DHT dht3(DHT3_PIN, DHTTYPE);
/////////////////////////////////////////////////////////////////
#define MODE_BUTTON_PIN A0
#define START_BUTTON_PIN A1
#define STOP_BUTTON_PIN A2
/////////////////////////////////////////////////////////////////
Button2 modeButton, startButton, stopButton;
/////////////////////////////////////////////////////////////////
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define RELAY1_PIN 2
#define RELAY2_PIN 3
#define RELAY3_PIN 4
#define RELAY4_PIN 5
#define RELAY5_PIN 6
#define RELAY6_PIN 7
#define RELAY7_PIN 8
#define RELAY8_PIN 9
#define RELAY9_PIN 10
#define RELAY10_PIN 11
#define RELAY11_PIN 12
#define RELAY12_PIN 13
#define BUZZER_PIN 29
#define LED1R_PIN 41
#define LED2R_PIN 39
#define LED3R_PIN 37
#define LED1G_PIN 35
#define LED2G_PIN 33
#define LED3G_PIN 31
byte startedFlag1;
volatile unsigned long timer1, timer2;
byte displayMode;
void timerIsr() { // this are interrupt service //countdown timers
//routine to turn provide a count down timer
//this will decrement every 1 millisecond
if (timer1)
timer1-- ; // Only decrement if non-zero !!!!!!!!!!!!
if (timer2)
timer2-- ; // Analogy is that of an "egg-timer" which self resets!!!!!
}
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(" EGG INCUBATOR"));
delay(1000);
lcd.clear();
dht1.begin();
dht2.begin();
dht3.begin();
Serial.begin(115200);
rtc.begin();
MsTimer2::set(1, timerIsr); // 1ms period
MsTimer2::start();
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
pinMode(RELAY4_PIN, OUTPUT);
pinMode(RELAY5_PIN, OUTPUT);
pinMode(RELAY6_PIN, OUTPUT);
pinMode(RELAY7_PIN, OUTPUT);
pinMode(RELAY8_PIN, OUTPUT);
pinMode(RELAY9_PIN, OUTPUT);
pinMode(RELAY10_PIN, OUTPUT);
pinMode(RELAY11_PIN, OUTPUT);
pinMode(RELAY12_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED1R_PIN, OUTPUT);
pinMode(LED2R_PIN, OUTPUT);
pinMode(LED3R_PIN, OUTPUT);
pinMode(LED1G_PIN, OUTPUT);
pinMode(LED2G_PIN, OUTPUT);
pinMode(LED3G_PIN, OUTPUT);
modeButton.begin(MODE_BUTTON_PIN);
modeButton.setClickHandler(click);
startButton.begin(START_BUTTON_PIN);
startButton.setClickHandler(click);
stopButton.begin(STOP_BUTTON_PIN);
stopButton.setClickHandler(click);
}
void loop() {
modeButton.loop();
startButton.loop();
stopButton.loop();
if (!timer1) {
switch (displayMode) {
case 0:
//lcd.clear();
timer1 = 1000;
lcd.setCursor(0, 0);
lcd.print(F("-----EGG TYPE 1-----"));
lcd.setCursor(0, 1);
lcd.print(F("TEMPERATURE: ")); lcd.print(dht1.readTemperature());
lcd.print((char)223); lcd.print(F("C"));
lcd.setCursor(0, 2);
lcd.print(F("HUMIDITY: ")); lcd.print(dht1.readHumidity()); lcd.print(F("%"));
lcd.setCursor(0, 3);
if (startedFlag1) {
lcd.print(F("TIME: "));
TimeSpan deltaTime1 = rtc.now() - startTime1;
lcd.print(deltaTime1.days()); lcd.print(F("Days"));
lcd.setCursor(12, 3);
byte hr = deltaTime1.hours();
byte min = deltaTime1.minutes();
byte sec = deltaTime1.seconds();
if (hr < 10) {
lcd.print(F("0"));
}
lcd.print(hr);
lcd.print(F(":"));
if (min < 10) {
lcd.print(F("0"));
}
lcd.print(min);
lcd.print(F(":"));
if (sec < 10) {
lcd.print(F("0"));
}
lcd.print(sec);
}
break;
case 1:
//lcd.clear();
timer1 = 1000;
lcd.setCursor(0, 0);
lcd.print(F("-----EGG TYPE 2-----"));
lcd.setCursor(0, 1);
lcd.print(F("TEMPERATURE: ")); lcd.print(dht2.readTemperature());
lcd.print((char)223); lcd.print(F("C"));
lcd.setCursor(0, 2);
lcd.print(F("HUMIDITY: ")); lcd.print(dht2.readHumidity()); lcd.print(F("%"));
lcd.setCursor(0, 3);
lcd.print(F("TIME: "));
break;
case 2:
//lcd.clear();
timer1 = 1000;
lcd.setCursor(0, 0);
lcd.print(F("-----EGG TYPE 3-----"));
lcd.setCursor(0, 1);
lcd.print(F("TEMPERATURE: ")); lcd.print(dht3.readTemperature());
lcd.print((char)223); lcd.print(F("C"));
lcd.setCursor(0, 2);
lcd.print(F("HUMIDITY: ")); lcd.print(dht3.readHumidity()); lcd.print(F("%"));
lcd.setCursor(0, 3);
lcd.print(F("TIME: "));
break;
}
// if (dht1.readHumidity()>55){
// }
}
}
void click(Button2 & btn) {
if (btn == modeButton) {
lcd.clear();
displayMode++;
if (displayMode > 2) {
displayMode = 0; //go back to 1st screenmode
}
} else if (btn == startButton) {
if (!startedFlag1 && displayMode == 0) {
startTime1 = rtc.now();
timer1 = 2000;//long delay to give time disPLAYING notification
//lcd.clear();
lcd.setCursor(0, 1);
lcd.print(F(" STARTING EGG "));
lcd.setCursor(0, 2);
lcd.print(F(" INCUBATION "));
lcd.setCursor(0, 3);
lcd.print(F(" "));
startedFlag1 = 1;
}
}
else if (btn == stopButton) {
timer1 = 2000;//long delay to give time disPLAYING notification
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(F(" STOPPING EGG "));
lcd.setCursor(0, 2);
lcd.print(F(" INCUBATION "));
lcd.setCursor(0, 3);
lcd.print(F(" "));
if (startedFlag1 && displayMode == 0) {
startedFlag1 = 0;
}
}
}