//**************************
// RTC ALARM
//**************************
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <RTClib.h>
RTC_DS1307 rtc; // no (SDA, SCL) arguments
int FeedHour1 = 0,durtion1;
int FeedHour2 = 1,durtion2;
int FeedHour3 = 2,durtion3;
unsigned long valFeedHour1,valdurtion1;
unsigned long valFeedHour2,valdurtion2;
unsigned long valFeedHour3,valdurtion3;
/*
* 100 - 2 mintus
* 010 - 3 mintus
* 001 - 4 mintus
* 110 - 5 mintus
* 101 - 6 mintus
* 011 - 7 mintus
* 111 - 8 mintus
*/
int sw1 = 11;
int sw2 = 12;
int sw3 = 13;
int sw_val1,sw_val2,sw_val3;
long feed_time; // 9 minit
// indicator if AM or PM feeding time
bool ampm = 0;
int flag_flsh = 0;
// char weekDays[][10] = { // removed LCD clutter
// "SUN",
// "MON",
// "TUE",
// "WED",
// "THU",
// "FRI",
// "SAT"
// };
int m1 = 9;
int m2 = 10;
#define button1 5 // Start Switch
#define button2 6 // Start Switch
#define button3 7 // Start Switch
//************Variables Used Including New Debounce Variable**************//
int hourupg;
int minupg;
int yearupg;
int monthupg;
int dayupg;
int menu=0;
const int debounce = 35;
void(* resetFunc) (void) = 0;//declare reset function at address 0
int set_flag =0;
#include "math.h"
#include <EEPROM.h>
//EEPROM
long EEPROMReadlong(long address)
{
long four = EEPROM.read(address);
long three = EEPROM.read(address + 1);
long two = EEPROM.read(address + 2);
long one = EEPROM.read(address + 3);
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
void EEPROMWritelong(int address, long value) {
byte four = (value & 0xFF);
byte three = ((value >> 8) & 0xFF);
byte two = ((value >> 16) & 0xFF);
byte one = ((value >> 24) & 0xFF);
EEPROM.write(address, four);
EEPROM.write(address + 1, three);
EEPROM.write(address + 2, two);
EEPROM.write(address + 3, one);
}
void read_count()
{
valFeedHour1 = EEPROMReadlong(35);
valdurtion1 = EEPROMReadlong(40);
valFeedHour2 = EEPROMReadlong(45);
valdurtion2 = EEPROMReadlong(50);
valFeedHour3 = EEPROMReadlong(55);
valdurtion3 = EEPROMReadlong(60);
FeedHour1 = valFeedHour1;
durtion1 = valdurtion1;
FeedHour2 = valFeedHour2;
durtion2 = valdurtion2;
FeedHour3 = valFeedHour3;
durtion3 = valdurtion3;
}
void write_count()
{
EEPROMWritelong(35, 1);
EEPROMWritelong(40, 1);
EEPROMWritelong(45, 1);
EEPROMWritelong(50, 1);
EEPROMWritelong(55, 1);
EEPROMWritelong(60, 1);
}
void set_time()
{
set_flag = 1;
while(set_flag == 1)
{
if (menu == 0)
{
showDTcurrent();
}
if (menu == 1)
{
DisplaySetHour();
}
if (menu == 2)
{
DisplaySetMinute();
}
if (menu == 3)
{
DisplaySetYear();
}
if (menu == 4)
{
DisplaySetMonth();
}
if (menu == 5)
{
DisplaySetDay();
}
if (menu == 6)
{
DisplaySettime1();
}
if (menu == 7)
{
DisplaySetontime1();
}
if (menu == 8)
{
DisplaySettime2();
}
if (menu == 9)
{
DisplaySetontime2();
}
if (menu == 10)
{
DisplaySettime3();
}
if (menu == 11)
{
DisplaySetontime3();
}
if (menu == 12)
{
StoreAgg();
}
}
}
void timer_set()
{
sw_val1 = digitalRead(sw1);
sw_val2 = digitalRead(sw2);
sw_val3 = digitalRead(sw3);
if(sw_val1 == 0 && sw_val2 == 1 && sw_val3 == 1){feed_time = 60000*2;}
else if(sw_val1 == 1 && sw_val2 == 0 && sw_val3 == 1){feed_time = 60000*3;}
else if(sw_val1 == 1 && sw_val2 == 1 && sw_val3 == 0){feed_time = 60000*4;}
else if(sw_val1 == 0 && sw_val2 == 0 && sw_val3 == 1){feed_time = 60000*5;}
else if(sw_val1 == 0 && sw_val2 == 1 && sw_val3 == 0){feed_time = 60000*6;}
else if(sw_val1 == 1 && sw_val2 == 0 && sw_val3 == 0){feed_time = 60000*7;}
else if(sw_val1 == 0 && sw_val2 == 0 && sw_val3 == 0){feed_time = 60000*8;}
else if(sw_val1 == 1 && sw_val2 == 1 && sw_val3 == 1){feed_time = 60000*9;}
}
void setup() {
//**************************
// GENERAL SETUP
//**************************
pinMode(sw1,INPUT_PULLUP);
pinMode(sw2,INPUT_PULLUP);
pinMode(sw3,INPUT_PULLUP);
pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP);
digitalWrite(sw1,HIGH);
digitalWrite(sw2,HIGH);
digitalWrite(sw3,HIGH);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
//lcd.setCursor(0,0);
//lcd.print(" Fish Feeder ");
//lcd.clear();
Serial.begin(115200); // Serial monitor for debugging
pinMode(m1, OUTPUT);pinMode(m2, OUTPUT);
digitalWrite(m1, LOW);digitalWrite(m2, LOW);
if (! rtc.begin()) { // start rtc
Serial.println("Couldn't find RTC"); // failed to start
lcd.setCursor(0,0);
lcd.print("Couldn't find RTC");
Serial.flush(); // wait for previous Serial.print(); to finish
while (1); // stops sketch here.
}
else
{
lcd.setCursor(0,0);
lcd.print("find RTC OK...");
delay(1000);
lcd.clear();
}
// this will set RTC Date/Time from PC at compile time. COMMENT-OUT after setting
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
if (digitalRead(button2) == LOW)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DATE - TIME SET:");
lcd.setCursor(0, 1);
lcd.print("PRESS B1 BUTTON.");
delay(2000);
set_time();
}
DateTime now = rtc.now(); // set "now" to the RTC time
// Check if it's time to turn on the pumps
if (now.hour() == FeedHour1 && now.minute() == 10) {
feedServo(1);
}
if (now.hour() == FeedHour2 && now.minute() == 10) {
feedServo(2);
}
if (now.hour() == FeedHour3 && now.minute() == 10) {
feedServo(3);
}
//**************************
// displayDate()
lcd.setCursor(0,0);
//**************************
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour(), DEC);lcd.print(':');
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute(), DEC);lcd.print('.');
if (now.second() < 10) Serial.print("0");
lcd.print(now.second(), DEC);lcd.print(" ");
//lcd.print(now.year(), DEC);lcd.print('/');
if (now.month() < 10) lcd.print("0");
lcd.print(now.month(), DEC);
lcd.print('/');
if (now.day() < 10) lcd.print("0");
lcd.print(now.day(), DEC); lcd.print(" ");
displayNextFeed(1);
delay(500);
displayNextFeed(2);
delay(500);
displayNextFeed(3);
delay(500);
}
void feedServo(int num)
{
switch (num)
{
case 1:
digitalWrite(m1, HIGH);delay(60000*durtion1);digitalWrite(m1, LOW);
break;
case 2:
digitalWrite(m1, HIGH);delay(60000*durtion2);digitalWrite(m1, LOW);
break;
case 3:
digitalWrite(m1, HIGH);delay(60000*durtion3);digitalWrite(m1, LOW);
break;
default: //Serial.println(F("Invalid Input"));
break;
}
}
void displayNextFeed(int num) {
lcd.setCursor(0,1);
switch (num)
{
case 1:
lcd.print("Timer 1: "); lcd.print(FeedHour1);
if(FeedHour1 >= 0 && FeedHour1 <= 12){lcd.print(" AM");}
else {lcd.print(" PM");}
break;
case 2:
lcd.print("Timer 2: "); lcd.print(FeedHour2);
if(FeedHour2 >= 0 && FeedHour2 <= 12){lcd.print(" AM");}
else {lcd.print(" PM");}
break;
case 3:
lcd.print("Timer 3: "); lcd.print(FeedHour3);
if(FeedHour3 >= 0 && FeedHour3 <= 12){lcd.print(" AM");}
else {lcd.print(" PM");}
break;
default: //Serial.println(F("Invalid Input"));
break;
}
}
void showDTcurrent()
{
//lcd.clear();
// We show the current date and time
DateTime now = rtc.now();
if(digitalRead(button1)==LOW){
menu=1;
delay(debounce);
while(digitalRead(button1) == LOW){}
}
lcd.setCursor(0, 0);
if (now.hour()<=9)
{
lcd.print(F("0"));
}
lcd.print(now.hour(), DEC);
hourupg=now.hour();
lcd.print(F(":"));
if (now.minute()<=9)
{
lcd.print(F("0"));
}
lcd.print(now.minute(), DEC);
minupg=now.minute();
lcd.print(F("/"));
if(digitalRead(button1)==LOW){
menu=1;
delay(debounce);
while(digitalRead(button1)==LOW){}
}
if (now.day()<=9)
{
lcd.print(F("0"));
}
lcd.print(now.day(), DEC);
dayupg=now.day();
lcd.print(F("-"));
if(digitalRead(button1)==LOW){
menu=1;
delay(debounce);
while(digitalRead(button1)==LOW){}
}
if (now.month()<=9)
{
lcd.print(F("0"));
}
lcd.print(now.month(), DEC);
monthupg=now.month();
lcd.print(F("-"));
lcd.print(now.year(), DEC);
yearupg=now.year();
if(digitalRead(button1)==LOW){
menu=1;
delay(debounce);
while(digitalRead(button1)==LOW){}
}
}
void DisplaySetHour()
{
// time setting
lcd.clear();
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print(F("Set Hour:"));
lcd.setCursor(0,1);
lcd.print(hourupg,DEC);
while(digitalRead(button1))
{
if(digitalRead(button2)==LOW)
{
if(hourupg==23)
{
hourupg=0;
}
else
{
hourupg=hourupg+1;
}
delay(debounce);
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if(hourupg==0)
{
hourupg=23;
}
else
{
hourupg=hourupg-1;
}
delay(debounce);
while(digitalRead(button3)==LOW){}
}
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print(F("Set Hour:"));
lcd.setCursor(0,1);
lcd.print(hourupg,DEC);
lcd.print(" ");
}
menu=2;
delay(1500);
}
void DisplaySetMinute()
{
// Setting the minutes
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("Set Minutes:"));
lcd.setCursor(0,1);
lcd.print(minupg,DEC);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (minupg==59)
{
minupg=0;
}
else
{
minupg=minupg+1;
}
delay(debounce);
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (minupg==0)
{
minupg=59;
}
else
{
minupg=minupg-1;
}
delay(debounce);
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Minutes:"));
lcd.setCursor(0,1);
lcd.print(minupg,DEC);
lcd.print(" ");
//delay(200);
}
menu=3;
delay(1500);
}
void DisplaySetYear()
{
// setting the year
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("Set Year:"));
lcd.setCursor(0,1);
lcd.print(yearupg,DEC);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
yearupg=yearupg+1;
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
yearupg=yearupg-1;
while(digitalRead(button3)==LOW){}
}
delay(debounce);
lcd.setCursor(0,0);
lcd.print(F("Set Year:"));
lcd.setCursor(0,1);
lcd.print(yearupg,DEC);
lcd.print(" ");
}
menu=4;
delay(1500);
}
void DisplaySetMonth()
{
// Setting the month
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("Set Month:"));
lcd.setCursor(0,1);
lcd.print(monthupg,DEC);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (monthupg==12)
{
monthupg=1;
}
else
{
monthupg=monthupg+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (monthupg==1)
{
monthupg=12;
}
else
{
monthupg=monthupg-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Month:"));
lcd.setCursor(0,1);
lcd.print(monthupg,DEC);
lcd.print(" ");
delay(debounce);
}
menu=5;
delay(1500);
//delay(200);
}
void DisplaySetDay()
{
// Setting the day
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (dayupg==31)
{
dayupg=1;
}
else
{
dayupg=dayupg+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (dayupg==1)
{
dayupg=31;
}
else
{
dayupg=dayupg-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Day:"));
lcd.setCursor(0,1);
lcd.print(dayupg,DEC);
lcd.print(" ");
delay(debounce);
}
menu=6;
delay(1500);
}
void DisplaySettime1()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (FeedHour1==25)
{
FeedHour1=1;
}
else
{
FeedHour1=FeedHour1+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (FeedHour1==0)
{
FeedHour1=24;
}
else
{
FeedHour1=FeedHour1-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Time 1:"));
lcd.setCursor(0,1);
lcd.print(FeedHour1);
lcd.print(" ");
delay(debounce);
}
menu=7;
delay(1500);
}
void DisplaySetontime1()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (durtion1==31)
{
durtion1=1;
}
else
{
durtion1=durtion1+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (durtion1==0)
{
durtion1=30;
}
else
{
durtion1=durtion1-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set ON Time 1:"));
lcd.setCursor(0,1);
lcd.print(durtion1);
lcd.print(" ");
delay(debounce);
}
menu=8;
delay(1500);
}
void DisplaySettime2()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (FeedHour2==25)
{
FeedHour2=1;
}
else
{
FeedHour2=FeedHour2+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (FeedHour2==0)
{
FeedHour2=24;
}
else
{
FeedHour2=FeedHour2-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Time 2:"));
lcd.setCursor(0,1);
lcd.print(FeedHour2);
lcd.print(" ");
delay(debounce);
}
menu=9;
delay(1500);
}
void DisplaySetontime2()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (durtion2==31)
{
durtion2=1;
}
else
{
durtion2=durtion2+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (durtion2==0)
{
durtion2=30;
}
else
{
durtion2=durtion2-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set ON Time 2:"));
lcd.setCursor(0,1);
lcd.print(durtion2);
lcd.print(" ");
delay(debounce);
}
menu=10;
delay(1500);
}
void DisplaySettime3()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (FeedHour3==25)
{
FeedHour3=1;
}
else
{
FeedHour3=FeedHour3+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (FeedHour3==0)
{
FeedHour3=24;
}
else
{
FeedHour3=FeedHour3-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set Time 3:"));
lcd.setCursor(0,1);
lcd.print(FeedHour3);
lcd.print(" ");
delay(debounce);
}
menu=11;
delay(1500);
}
void DisplaySetontime3()
{
lcd.clear();
delay(debounce);
while(digitalRead(button1)){
if(digitalRead(button2)==LOW)
{
if (durtion3==31)
{
durtion3=1;
}
else
{
durtion3=durtion3+1;
}
while(digitalRead(button2)==LOW){}
}
if(digitalRead(button3)==LOW)
{
if (durtion3==0)
{
durtion3=30;
}
else
{
durtion3=durtion3-1;
}
while(digitalRead(button3)==LOW){}
}
lcd.setCursor(0,0);
lcd.print(F("Set ON Time 3:"));
lcd.setCursor(0,1);
lcd.print(durtion3);
lcd.print(" ");
delay(debounce);
}
menu=12;
delay(1500);
}
void StoreAgg()
{
// Variable saving
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("SAVING IN"));
lcd.setCursor(0,1);
lcd.print(F("PROGRESS"));
rtc.adjust(DateTime(yearupg,monthupg,dayupg,hourupg,minupg,0));
EEPROMWritelong(35, FeedHour1);
EEPROMWritelong(40, durtion1);
EEPROMWritelong(45, FeedHour2);
EEPROMWritelong(50, durtion2);
EEPROMWritelong(55, FeedHour3);
EEPROMWritelong(60, durtion3);
delay(2000);
set_flag = 0;
resetFunc(); //call reset
}