//|------------------------------------------------------------------------------------------------------|//
//|******************************************************************************************************|//
//|* EGG INCUBATOR CONTROLLER *|//
//|* with TEMPERATURE, HUMIDITY CONTROL, EGG TURNING SYSTEM AND HATCHING TIME MANAGEMENT *|//
//|* version 1.2 by: ULRICH SEUJIP RENE AKA @EEE_wOLF *|//
//|* July 13, 2021 *|//
//|******************************************************************************************************|//
//|------------------------------------------------------------------------------------------------------|//
//| find us at https://www.youtube.com/channel/UC3zQB-yLjXWSCm3_vO2tT6g/featured |//
#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "RTClib.h"
#include <TimerOne.h>
#define DHTPIN 5
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define MENUBUTTON 4
#define RIGHTBUTTON 3
#define LEFTBUTTON 2
#define FANPIN 8
#define HEATERPIN 6
#define ALARMPIN 11
#define HUMIDIFIERPIN 7
#define NOTPRESSED 1
#define PRESSED 0
#define MOTORLEFTPIN 9
#define MOTORRIGHTPIN 10
int firstuploaddetector=5;
int firstuploaddetectoraddress=200;
short const reftempaddress = 0;
short const refhumidaddress = 10;
short const reftemptoladdress = 20;
short const refhumidtoladdress = 30;
short const tspinaddress = 40;
short const NoINCUBATIONDAYSaddress = 50;
short const reftemptresholdaddress = 60;
short const refhumidtresholddadress = 70;
short const Noincubationdaysleftaddress =80;
short const motordirectionaddress = 33;
bool motordirection = 0;
String slogan = " A Vida mais Facil! ";
short int spinaddress = 55;
short const startdayyearaddress= 81;
short const startdaymonthaddress=82;
short const startdaydayaddress=83;
short const startdayhouraddress=84;
short const startdayminuteaddress=85;
short const startdaysecondaddress = 86;
int timeduringrotation = 1;
int timeduringrotationaddress = 100;
float REFTEMPERATURE = 35.6;
float REFHUMIDITY = 40.5;
float REFTEMPTOLERANCE = 0.1;
float REFHUMIDTOLERANCE = 2.0;
float REFTEMPTRESHOLD = 0.3;
float REFHUMIDTRESHOLD =3;
unsigned short TSPIN = 2;
unsigned short NoINCUBATIONDAYS = 21;
unsigned short NoINCUBATIONDAYSLEFT = 21;
bool millisflag = 1;
unsigned short MINUTESPIN = 59;
unsigned short SECSPIN =59;
unsigned short SPIN =2;
unsigned short SPINHOLDER =2;
float REFTEMPERATUREHOLDER ;
float REFHUMIDITYHOLDER ;
float REFTEMPTOLERANCEHOLDER ;
float REFHUMIDTOLERANCEHOLDER ;
float REFTEMPTRESHOLDHOLDER ;
float REFHUMIDTRESHOLDHOLDER;
unsigned short TSPINHOLDER ;
int NoINCUBATIONDAYSHOLDER ;
unsigned short NoINCUBATIONDAYSLEFTHOLDER;
int timeduringrotationholder;
unsigned int a = 2003;
unsigned short b = 0;
unsigned short c = 0;
unsigned short d = 0;
unsigned short e= 0;
unsigned short f= 0;
unsigned long count,count1;
bool Home=1;
float humidity;
float temperature;
DateTime now, endday;
byte customChar[] = {
B00100,
B00100,
B01110,
B10001,
B10001,
B10001,
B01110,
B00100
};
byte customChar1[] = {
B00100,
B00100,
B01110,
B11111,
B11111,
B11111,
B01110,
B00100
};
byte arrow[8] = {
0b01000,
0b01100,
0b01110,
0b01111,
0b01110,
0b01100,
0b01000,
0b00000
};
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
DHT dht(DHTPIN, DHTTYPE);
/*
int b = EEPROM.read(startdaymonthaddress) ;
int c = EEPROM.read(startdaydayaddress);
int d = EEPROM.read(startdayhouraddress);
int e= EEPROM.read(startdayminuteaddress);
int f= EEPROM.read(startdaysecondaddress);
int a = EEPROM.read(startdayyearaddress) +1791 */
//DateTime startday (EEPROM.read(startdayyearaddress), EEPROM.read(startdaymonthaddress), EEPROM.read(startdaydayaddress), EEPROM.read(startdayhouraddress), EEPROM.read(startdayminuteaddress), EEPROM.read(startdaysecondaddress));
DateTime startday(a,b,c,d,e,f);
void initialisation(void)
{
digitalWrite(MOTORLEFTPIN,LOW);
digitalWrite(MOTORRIGHTPIN,LOW);
rtc.begin();
now = rtc.now();
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" INCUBADORA DE OVOS ");
lcd.setCursor(0, 1);
lcd.print(" Por Edy Eletronica ");
lcd.setCursor(0, 2);
lcd.print("********************");
delay(800);
lcd.setCursor(0, 3);
for (int i = 0; i < 20; i++)
{
lcd.setCursor(i + 0, 3);
lcd.print(slogan[i]);
delay(700);
}
delay(20);
firstuploaddetector= EEPROM.read(firstuploaddetectoraddress);
delay(20);
if(firstuploaddetector==255)
{
EEPROM.write(firstuploaddetectoraddress,10);
delay(20);
EEPROM.put(reftempaddress,REFTEMPERATURE);
delay(20);
EEPROM.put(reftemptoladdress,REFTEMPTOLERANCE);
delay(20);
EEPROM.put(refhumidaddress,REFHUMIDITY);
delay(20);
EEPROM.put(refhumidtoladdress,refhumidtoladdress);
delay(20);
EEPROM.put(reftemptresholdaddress,REFTEMPTRESHOLD);
delay(20);
EEPROM.put(refhumidtresholddadress,REFHUMIDTRESHOLD);
delay(20);
EEPROM.write(NoINCUBATIONDAYSaddress,NoINCUBATIONDAYS);
delay(20);
EEPROM.write(tspinaddress,TSPIN);
delay(20);
EEPROM.write(spinaddress, SPIN);
delay(20);
EEPROM.write(Noincubationdaysleftaddress,NoINCUBATIONDAYSLEFT);
delay(20);
EEPROM.write(tspinaddress,2);
delay(20);
EEPROM.write(timeduringrotationaddress,timeduringrotation);
}
// should be uncumented after first upload
delay(20);
EEPROM.get(reftempaddress,REFTEMPERATURE);
delay(20);
EEPROM.get(reftemptoladdress,REFTEMPTOLERANCE);
delay(20);
EEPROM.get(refhumidaddress,REFHUMIDITY);
delay(20);
EEPROM.get(refhumidtoladdress,refhumidtoladdress);
delay(20);
EEPROM.get(reftemptresholdaddress,REFTEMPTRESHOLD);
delay(20);
EEPROM.get(refhumidtresholddadress,REFHUMIDTRESHOLD);
delay(20);
NoINCUBATIONDAYS = EEPROM.read(NoINCUBATIONDAYSaddress);
delay(20);
TSPIN = EEPROM.read(tspinaddress);
delay(20);
SPIN = EEPROM.read(spinaddress);
delay(20);
timeduringrotation = EEPROM.read(timeduringrotationaddress);
delay(20);
NoINCUBATIONDAYSLEFT = EEPROM.read(Noincubationdaysleftaddress);
delay(20);
lcd.clear();
}
void blinkLED(void)
{
if(SECSPIN>0)
SECSPIN = SECSPIN -1;
}
void setup()
{
pinMode(MENUBUTTON, INPUT_PULLUP);
pinMode(RIGHTBUTTON,INPUT_PULLUP);
pinMode(LEFTBUTTON,INPUT_PULLUP);
pinMode(FANPIN,OUTPUT);
pinMode(HEATERPIN,OUTPUT);
pinMode(ALARMPIN,OUTPUT);
pinMode(MOTORLEFTPIN,OUTPUT);
pinMode(MOTORRIGHTPIN,OUTPUT);
pinMode(HUMIDIFIERPIN,OUTPUT);
initialisation();
lcd.createChar(0,customChar);
lcd.createChar(1,customChar1);
lcd.createChar(10,arrow);
a = EEPROM.read(startdayyearaddress) + 1792 ;
delay(20);
b = EEPROM.read(startdaymonthaddress) ;
delay(20);
c = EEPROM.read(startdaydayaddress);
delay(20);
d = EEPROM.read(startdayhouraddress);
delay(20);
e= EEPROM.read(startdayminuteaddress);
delay(20);
f= EEPROM.read(startdaysecondaddress);
delay(20);
DateTime startday(a,b,c,d,e,f);
delay(20);
//DateTime startday(2021,7,5,2,48,0);
//startday = startday + TimeSpan(-1,-1,0,0);
Timer1.initialize(1000000);
Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.15 seconds
Serial.begin(9600);
}
void readtempandhumid(void)
{
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lcd.setCursor(6,0);
lcd.print(temperature);
lcd.setCursor(7,1);
lcd.print(humidity);
}
void alarm(){
digitalWrite(ALARMPIN,HIGH);
delay(100);
digitalWrite(ALARMPIN,LOW);
delay(40);
}
void savechanges(void)
{
delay(20);
EEPROM.put(reftempaddress,REFTEMPERATURE);
delay(20);
EEPROM.put(reftemptoladdress,REFTEMPTOLERANCE);
delay(20);
EEPROM.put(refhumidaddress,REFHUMIDITY);
delay(20);
EEPROM.put(refhumidtoladdress,refhumidtoladdress);
delay(20);
EEPROM.put(reftemptresholdaddress,REFTEMPTRESHOLD);
delay(20);
EEPROM.put(refhumidtresholddadress,REFHUMIDTRESHOLD);
delay(20);
EEPROM.write(NoINCUBATIONDAYSaddress,NoINCUBATIONDAYS);
delay(20);
NoINCUBATIONDAYSLEFT = NoINCUBATIONDAYS;
delay(20);
EEPROM.write(Noincubationdaysleftaddress,NoINCUBATIONDAYSLEFT);
delay(20);
DateTime startday(a,b,c,d,e,f);
startday = rtc.now();
EEPROM.write(startdayyearaddress,startday.year());
delay(20);
EEPROM.write(startdaymonthaddress,startday.month());
delay(20);
EEPROM.write(startdaydayaddress,startday.day());
delay(20);
EEPROM.write(startdayhouraddress,startday.hour());
delay(20);
EEPROM.write(startdayminuteaddress,startday.minute());
delay(20);
EEPROM.write(startdaysecondaddress,startday.second());
delay(20);
EEPROM.write(tspinaddress,TSPIN);
delay(20);
EEPROM.write(timeduringrotationaddress,timeduringrotation);
delay(20);
SPIN = TSPIN -1;
delay(20);
EEPROM.write(spinaddress,SPIN);
delay(20);
a = EEPROM.read(startdayyearaddress) + 1792 ;
delay(20);
b = EEPROM.read(startdaymonthaddress) ;
delay(20);
c = EEPROM.read(startdaydayaddress);
delay(20);
d = EEPROM.read(startdayhouraddress);
delay(20);
e= EEPROM.read(startdayminuteaddress);
delay(20);
f= EEPROM.read(startdaysecondaddress);
delay(20);
timeduringrotationaddress =timeduringrotation;
if(TSPIN)
{SECSPIN = 59;
}
}
void temperatureregulation(void)
{
if (temperature==REFTEMPERATURE)
{
digitalWrite(FANPIN,LOW);
digitalWrite(HEATERPIN,LOW);
}
else if ( (temperature>=(REFTEMPERATURE-REFTEMPTOLERANCE))&& (temperature<=(REFTEMPERATURE+REFTEMPTOLERANCE)) )
{
digitalWrite(FANPIN,LOW);
digitalWrite(HEATERPIN,LOW);
lcd.setCursor(16,0);
lcd.write(0);
}
readtempandhumid();
if (temperature>(REFTEMPERATURE+REFTEMPTOLERANCE))
{
digitalWrite(FANPIN,HIGH);
digitalWrite(HEATERPIN,LOW);
if(temperature>=(REFTEMPERATURE+REFTEMPTOLERANCE+REFTEMPTRESHOLD))
{
digitalWrite(ALARMPIN,HIGH);
lcd.setCursor(16,0);
lcd.write(1);
delay(100);
digitalWrite(ALARMPIN,LOW);
lcd.setCursor(16,0);
lcd.print(" ");
delay(150);
}
lcd.setCursor(16,0);
lcd.write(1);
}
readtempandhumid();
if (temperature<(REFTEMPERATURE - REFTEMPTOLERANCE))
{
digitalWrite(FANPIN,LOW);
digitalWrite(HEATERPIN,HIGH);
if(temperature<=(REFTEMPERATURE - REFTEMPTOLERANCE - REFTEMPTRESHOLD))
{
alarm();
lcd.setCursor(16,0);
lcd.write(1);
delay(100);
lcd.setCursor(16,0);
lcd.print(" ");
delay(100);
}
lcd.setCursor(16,0);
lcd.write(1);
}
}
void humidityregulation(){
if ( (humidity>=(REFHUMIDITY-REFHUMIDTOLERANCE))&& (humidity<=(REFHUMIDITY+REFHUMIDTOLERANCE)) )
{
digitalWrite(HUMIDIFIERPIN,LOW);
lcd.setCursor(16,1);
lcd.write(0);
}
readtempandhumid();
if (humidity>(REFHUMIDITY+REFHUMIDTOLERANCE))
{
digitalWrite(HUMIDIFIERPIN,LOW);
if(humidity>=(REFHUMIDITY+REFHUMIDTOLERANCE+REFHUMIDTRESHOLD))
{
alarm();
lcd.setCursor(16,1);
lcd.write(1);
delay(100);
lcd.setCursor(16,1);
lcd.print(" ");
delay(100);
}
lcd.setCursor(16,1);
lcd.write(1);
}
readtempandhumid();
if (humidity<(REFHUMIDITY - REFHUMIDTOLERANCE))
{
digitalWrite(HUMIDIFIERPIN,HIGH);
if(humidity<=(REFHUMIDITY - REFHUMIDTOLERANCE - REFHUMIDTRESHOLD))
{
alarm();
lcd.setCursor(16,1);
lcd.write(1);
delay(100);
alarm();
lcd.setCursor(16,1);
lcd.print(" ");
delay(100);
}
}
}
void milsecdelay(){
if (millisflag){
millisflag=0;
count =millis();
}
count1=millis();
if ((count1-count)>=50)
{
// action
millisflag=1;
}
}
void discardchanges()
{
REFTEMPERATURE = REFTEMPERATUREHOLDER;
REFHUMIDITY = REFHUMIDITYHOLDER;
REFTEMPTOLERANCE = REFTEMPTOLERANCEHOLDER ;
REFHUMIDTOLERANCE = REFHUMIDTOLERANCEHOLDER ;
REFTEMPTRESHOLD = REFTEMPTRESHOLDHOLDER ;
REFHUMIDTRESHOLD = REFHUMIDTRESHOLDHOLDER ;
TSPIN = TSPINHOLDER;
SPIN =SPINHOLDER;
NoINCUBATIONDAYS = NoINCUBATIONDAYSHOLDER ;
NoINCUBATIONDAYSLEFT = NoINCUBATIONDAYSLEFTHOLDER;
timeduringrotation= timeduringrotationholder;
}
void menu(void)
{
//entering menu
lcd.clear();
lcd.setCursor(0,0);
lcd.print("--Entrando no MENU--");
lcd.setCursor(0,2);
lcd.print("Por Favor, AGuarde..");
REFTEMPERATUREHOLDER = REFTEMPERATURE ;
REFHUMIDITYHOLDER = REFHUMIDITY;
REFTEMPTOLERANCEHOLDER = REFTEMPTOLERANCE;
REFHUMIDTOLERANCEHOLDER = REFHUMIDTOLERANCE ;
REFTEMPTRESHOLDHOLDER = REFTEMPTRESHOLD;
REFHUMIDTRESHOLDHOLDER = REFHUMIDTRESHOLD ;
TSPINHOLDER = TSPIN ;
NoINCUBATIONDAYSHOLDER = NoINCUBATIONDAYS;
NoINCUBATIONDAYSLEFTHOLDER = NoINCUBATIONDAYSLEFT;
SPINHOLDER = SPIN;
timeduringrotationholder= timeduringrotation;
delay(2000);
lcd.clear();
do{
lcd.setCursor(4,1);
lcd.print("=>");// special select item character
lcd.setCursor(0,0);
lcd.print("Definir Temperatura:");
lcd.setCursor(6,1);
lcd.print(REFTEMPERATURE);
lcd.setCursor(10,1);
lcd.print((char) 223);
lcd.setCursor(11,1);
lcd.print("C");
lcd.setCursor(0,2);
lcd.print(":Tolerancia a Temp:");
lcd.setCursor(6,3);
lcd.print(REFTEMPTOLERANCE);
lcd.setCursor(10,3);
lcd.print((char) 223);
lcd.setCursor(11,3);
lcd.print("C");
if ((digitalRead(RIGHTBUTTON)==PRESSED)&&(REFTEMPERATURE<99))
{
REFTEMPERATURE = REFTEMPERATURE + 0.1;
delay(200);
}
if ((digitalRead(LEFTBUTTON)==PRESSED)&&(REFTEMPERATURE>2))
{
REFTEMPERATURE = REFTEMPERATURE - 0.1;
delay(200);
}
} while(digitalRead(MENUBUTTON)== NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);// debouncing of the menubutton pressing
lcd.setCursor(4,1);
lcd.print(" ");// special select item character removal
// selecting the reference temperature tolerance for editing
do{
lcd.setCursor(4,3);
lcd.print("=>");// special select item character
if ((digitalRead(RIGHTBUTTON)==PRESSED)&&(REFTEMPTOLERANCE<5))
{
REFTEMPTOLERANCE = REFTEMPTOLERANCE + 0.1;
delay(200);
}
if ((digitalRead(LEFTBUTTON)==PRESSED)&&(REFTEMPTOLERANCE>0))
{
REFTEMPTOLERANCE = REFTEMPTOLERANCE - 0.1;
delay(200);
}
//display of reference humdity
lcd.setCursor(0,2);
lcd.print(":Tolerancia a Temp:");
lcd.setCursor(6,3);
lcd.print(REFTEMPTOLERANCE);
lcd.setCursor(10,3);
lcd.print((char) 223);
lcd.setCursor(11,3);
lcd.print("C");
} while (digitalRead(MENUBUTTON)==NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);
lcd.clear();
do{
// display and selection of reference humidity for editing
lcd.setCursor(4,1);
lcd.print("=>");// special select item character
lcd.setCursor(0,0);
lcd.print(" Definir Umidade: ");
lcd.setCursor(6,1);
lcd.print(REFHUMIDITY);
lcd.setCursor(11,1);
lcd.print("% RH");
//display of reference humdity
lcd.setCursor(0,2);
lcd.print("Tolerancia a Umidade");
lcd.setCursor(6,3);
lcd.print(REFHUMIDTOLERANCE);
lcd.setCursor(10,3);
lcd.print("% RH");
if ((digitalRead(RIGHTBUTTON)==PRESSED)&&(REFHUMIDITY<99))
{
REFHUMIDITY = REFHUMIDITY + 0.1;
delay(200);
}
if ((digitalRead(LEFTBUTTON)==PRESSED)&&(REFHUMIDITY>5))
{
REFHUMIDITY = REFHUMIDITY - 0.1;
delay(200);
}
} while(digitalRead(MENUBUTTON)== NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);// debouncing of the menubutton pressing
lcd.setCursor(4,1);
lcd.print(" ");// special select item character removal
// selecting the reference humidity tolerance for editing
do{
lcd.setCursor(4,3);
lcd.print("=>");// special select item character
if (digitalRead(RIGHTBUTTON)==PRESSED)
{
REFHUMIDTOLERANCE = REFHUMIDTOLERANCE + 0.1;
delay(200);
}
if (digitalRead(LEFTBUTTON)==PRESSED)
{
REFHUMIDTOLERANCE = REFHUMIDTOLERANCE- 0.1;
delay(200);
}
//display of reference humdity
lcd.setCursor(0,2);
lcd.print("Tolerancia a Umidade");
lcd.setCursor(6,3);
lcd.print(REFHUMIDTOLERANCE);
lcd.setCursor(10,3);
lcd.print("% RH");
} while (digitalRead(MENUBUTTON)==NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);
lcd.clear();
do{
// display and selection of reference temprature for editing
lcd.setCursor(4,1);
lcd.print("=>");// special select item character
lcd.setCursor(0,0);
lcd.print("Limite diferenca tem");
lcd.setCursor(6,1);
lcd.print(REFTEMPTRESHOLD);
lcd.setCursor(10,1);
lcd.print((char) 223);
lcd.setCursor(11,1);
lcd.print("C");
// display and selection of reference humidity
lcd.setCursor(0,2);
lcd.print("Humid_Diff Treshold:");
lcd.setCursor(6,3);
lcd.print(REFHUMIDTRESHOLD);
lcd.setCursor(10,3);
lcd.print("% RH");
if (digitalRead(RIGHTBUTTON)==PRESSED)
{
REFTEMPTRESHOLD = REFTEMPTRESHOLD + 0.1;
delay(200);
}
if (digitalRead(LEFTBUTTON)==PRESSED)
{
REFTEMPTRESHOLD = REFTEMPTRESHOLD - 0.1;
delay(200);
}
} while(digitalRead(MENUBUTTON)== NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);// debouncing of the menubutton pressing
lcd.setCursor(4,1);
lcd.print(" ");// special select item character removal
do{
// display and selection of reference humidity for editing
lcd.setCursor(4,3);
lcd.print("=>");// special select item character
lcd.setCursor(0,2);
lcd.setCursor(0,2);
lcd.print("Humid_Diff Treshold:");
lcd.setCursor(6,3);
lcd.print(REFHUMIDTRESHOLD);
lcd.setCursor(10,3);
lcd.print("% RH");
if (digitalRead(RIGHTBUTTON)==PRESSED)
{
REFHUMIDTRESHOLD = REFHUMIDTRESHOLD+ 0.1;
delay(200);
}
if (digitalRead(LEFTBUTTON)==PRESSED)
{
REFHUMIDTRESHOLD = REFHUMIDTRESHOLD - 0.1;
delay(200);
}
} while(digitalRead(MENUBUTTON)== NOTPRESSED);
do{
} while (digitalRead(MENUBUTTON)==PRESSED);// debouncing of the menubutton pressing
lcd.clear();
do{
if(NoINCUBATIONDAYS>50)
{
NoINCUBATIONDAYS=21;
}
// display of incubation time in days
lcd.setCursor(4,3);
lcd.print("=>");
lcd.setCursor(0,0);
lcd.print(" Definir Tempo ");
lcd.setCursor(0,1);
lcd.print(" De Incubacao ");
lcd.setCursor(7,3);
lcd.print(NoINCUBATIONDAYS);
lcd.setCursor(10,3);
lcd.print("Dias");
if ((digitalRead(RIGHTBUTTON)==PRESSED)&&(NoINCUBATIONDAYS<46))
{
NoINCUBATIONDAYS = NoINCUBATIONDAYS + 1;
delay(200);
}
if ((digitalRead(LEFTBUTTON)==PRESSED)&&(REFTEMPERATURE>1))
{
NoINCUBATIONDAYS = NoINCUBATIONDAYS - 1;
delay(200);
}
if (NoINCUBATIONDAYS<10){
lcd.setCursor(7,3);
lcd.print(" ");
}
}while (digitalRead(MENUBUTTON)==NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);
lcd.clear();
do{
// display of incubation time in days
lcd.setCursor(4,2);
lcd.print("=>");
lcd.setCursor(0,0);
lcd.print(" Tempo Da RolaGem.: ");
lcd.setCursor(6,2);
lcd.print(TSPIN );
lcd.setCursor(9,2);
lcd.print("Hour/s");
if ((digitalRead(RIGHTBUTTON)==PRESSED) && (TSPIN <13) )
{
TSPIN = TSPIN + 1;
delay(100);
}
if ((digitalRead(LEFTBUTTON)==PRESSED) && (TSPIN >=1) )
{
TSPIN = TSPIN - 1;
delay(100);
}
if (TSPIN<10){
lcd.setCursor(7,2);
lcd.print(" ");
}
}while (digitalRead(MENUBUTTON)==NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);
lcd.clear();
do{
lcd.setCursor(4,2);
lcd.print("=>");
lcd.setCursor(0,0);
lcd.print(" Duracao Da Rolagem ");
lcd.setCursor(6,2);
lcd.print(timeduringrotation);
lcd.setCursor(8,2);
lcd.print("s");
if(timeduringrotation<10)
{
lcd.setCursor(7,2);
lcd.print(" ");
}
if ((digitalRead(RIGHTBUTTON)==PRESSED)&& (timeduringrotation<100))
{
timeduringrotation = timeduringrotation+ 1;
delay(200);
if(timeduringrotation<10)
{
lcd.setCursor(7,2);
lcd.print(" ");
}
}
if ((digitalRead(LEFTBUTTON)==PRESSED)&& (timeduringrotation>1))
{
timeduringrotation = timeduringrotation - 1;
delay(200);
lcd.setCursor(7,2);
lcd.print(" ");
}
} while(digitalRead(MENUBUTTON)== NOTPRESSED);
do{
}while (digitalRead(MENUBUTTON)==PRESSED);
lcd.clear();
do{
lcd.setCursor(0,0);
lcd.print("Press'Ok'Para Salvar");
lcd.setCursor(0,1);
lcd.print(" As Alteracoes ou ");
lcd.setCursor(0,2);
lcd.print("QualQuer outro botao");
lcd.setCursor(0,3);
lcd.print(" Para Descartar ");
}while ( (digitalRead(MENUBUTTON)==NOTPRESSED) && (digitalRead(RIGHTBUTTON)==NOTPRESSED) && (digitalRead(LEFTBUTTON)==NOTPRESSED));
if(!digitalRead(MENUBUTTON))
{lcd.clear();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("SALVANDO.... ");
lcd.setCursor(3, 3);
for (int i = 0; i < 17; i++)
{
lcd.setCursor(i + 1, 1);
lcd.write(byte(10));
lcd.setCursor(i + 1, 2);
lcd.write(byte(10));
delay(60);
}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("SALVO COM SUCESSO!!!");
delay(1000);
}
else{
lcd.clear();
discardchanges();
lcd.setCursor(0,0);
lcd.print("Alteracao Descartada");
delay(600);
}
lcd.clear();
}
void loop()
{
now= rtc.now();
lcd.setCursor(0,2);
lcd.print(now.year());
lcd.setCursor(4,2);
lcd.print('/');
lcd.setCursor(5,2);
lcd.print(now.month());
lcd.setCursor(7,2);
lcd.print('/');
lcd.setCursor(8,2);
lcd.print(now.day(), DEC);
lcd.setCursor(12,2);
lcd.print(now.hour());
lcd.setCursor(14,2);
lcd.print(':');
lcd.setCursor(15,2);
lcd.print(now.minute());
lcd.setCursor(17,2);
lcd.print(':');
lcd.setCursor(18,2);
lcd.print(now.second());
// lcd.setCursor(15,2);
//lcd.print(SECSPIN);
lcd.setCursor(0,0);
lcd.print("TEMP= ");
lcd.setCursor(6,0);
lcd.print(temperature);
lcd.setCursor(12,0);
lcd.print((char) 223);
lcd.setCursor(13,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("HUMID= ");
lcd.setCursor(7,1);
lcd.print(humidity);
lcd.setCursor(13,1);
lcd.print("%");
if (TSPIN==0){
}
else{
}
lcd.setCursor(0,3);
lcd.print("CHOCAR = ");
lcd.setCursor(11,3);
lcd.print(NoINCUBATIONDAYSLEFT);
if (NoINCUBATIONDAYSLEFT<10){
lcd.setCursor(12,3);
lcd.print(" ");
}
lcd.setCursor(14,3);
lcd.print("Dias");
//lcd.setCursor(14,2);
//lcd.print(SECSPIN);
//if(SECSPIN<10)
//lcd.setCursor(14,2);
//lcd.print(" ");
//if(MINUTESPIN<10)
// lcd.setCursor(13,3);
// lcd.print(" ");
// if(SPIN<10){
// lcd.setCursor(10,3);
// lcd.print(" ");
//}
if ((SECSPIN==0)&& MINUTESPIN)
{
MINUTESPIN = MINUTESPIN - 1;
SECSPIN = 59;
}
if ((MINUTESPIN==0)&& SPIN)
{
SPIN = SPIN - 1;
MINUTESPIN = 59;
}
if((SPIN ==0) && (MINUTESPIN==0) && (SECSPIN==0))
{
delay(20);
motordirection = EEPROM.read(motordirectionaddress);
delay(20);
if(motordirection){
motordirection=0;
delay(20);
EEPROM.write(motordirectionaddress,motordirection);
delay(20);
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" MOTOR ROTATION ");
digitalWrite(MOTORLEFTPIN,LOW);
digitalWrite(MOTORRIGHTPIN,HIGH);
delay(1000);
digitalWrite(MOTORRIGHTPIN,LOW);
digitalWrite(MOTORLEFTPIN,LOW);
lcd.clear();
}
else{
motordirection=1;
delay(20);
EEPROM.write(motordirectionaddress,motordirection);
delay(20);
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" MOTOR ROTATION ");
digitalWrite(MOTORRIGHTPIN,LOW);
digitalWrite(MOTORLEFTPIN,HIGH);
delay(timeduringrotation*1000);
digitalWrite(MOTORRIGHTPIN,LOW);
digitalWrite(MOTORLEFTPIN,LOW);
lcd.clear();
}
TSPIN= EEPROM.read(tspinaddress);
SPIN = TSPIN -1;
MINUTESPIN =59;
SECSPIN =59;
}
//lcd.setCursor(15,2);
//lcd.print(SECSPIN);
temperatureregulation();
humidityregulation ();
//lcd.setCursor(15,2);
// lcd.print(SECSPIN);
if (digitalRead(MENUBUTTON)==PRESSED)
{
menu();
}
//lcd.setCursor(15,2);
// lcd.print(SECSPIN);
if(NoINCUBATIONDAYSLEFT == 0)
{
alarm();
lcd.setCursor(0,3);
lcd.print(" ");
delay(10);
lcd.setCursor(0,3);
lcd.print("INCUB.TEMPO ATINGIDO");
delay(500);
lcd.setCursor(0,3);
lcd.print(" ");
delay(10);
}
//lcd.setCursor(15,2);
// lcd.print(SECSPIN);
// lcd.setCursor(0,3);
//startday = startday + TimeSpan(1,1,1,1);
//lcd.print(" ");
//a = EEPROM.read(startdayyearaddress);
DateTime startday(a,b,c,d,e,f);
/* lcd.setCursor(0,3);
lcd.print(startday.second()); */
/* lcd.setCursor(15,2);
lcd.print(SECSPIN);
*/
delay(20);
/* this code below should be commented to stop the act
of using seconds as incubation days. Note: this was
made only for demonstration purposes in order to see how
effective the number of incubation days are being counted. */
for (unsigned short n=1; n<50; n++)
{ if (NoINCUBATIONDAYS >= n)
{ if (rtc.now() == ( startday + TimeSpan(0,0,0,n)))
{
NoINCUBATIONDAYSLEFT = NoINCUBATIONDAYS - n;
EEPROM.write(Noincubationdaysleftaddress,NoINCUBATIONDAYSLEFT);
delay(10);
}
}
}
//should be uncommented in order to make the number of days of incubation effectif.
for (unsigned short n=1; n<50; n++)
{ if (NoINCUBATIONDAYS >= n)
{ if ((rtc.now() == ( startday + TimeSpan(n,0,0,0)))||(rtc.now() == ( startday + TimeSpan(n,0,30,0)))||(rtc.now() == ( startday + TimeSpan(n,1,0,0)))||(rtc.now() == ( startday + TimeSpan(n,2,0,0)))||(rtc.now() == ( startday + TimeSpan(n,5,0,0)))||(rtc.now() == ( startday + TimeSpan(n,10,0,0))))
{
NoINCUBATIONDAYSLEFT = NoINCUBATIONDAYS - n;
EEPROM.write(Noincubationdaysleftaddress,NoINCUBATIONDAYSLEFT);
delay(10);
}
}
}
}