#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include<EEPROM.h>
#include "SimpleTimer.h"
LiquidCrystal_I2C lcd(0x27, 20, 4);
SimpleTimer timer;
const int start_counter = 13;
const int stop_counter = 12;
const int set = 11;
const int increment = 10;
const int decrement = 9;
const int relay = 8;
int seconds = 0;
int minutes = 0;
int hours = 0;
int set_hours = 0;
int set_minutes = 0;
int count_hours = 0;
int count_minutes = 0;
int count_seconds = 0;
unsigned int check_val = 50;
int add_check = 0;
int add_seconds = 1;
int add_minutes = 2;
int add_hours = 3;
bool RUN = false;
bool set_flag = false;
bool relay_toggle = true;
int i = 0;
void count() {
while (RUN) {
if (timer.isReady())
{
lcd.clear();
digitalWrite(relay, relay_toggle);
seconds == ++seconds;
if (seconds == 60)
{
minutes = ++ minutes;
seconds = 0;
}
if (minutes == 60)
{
hours = ++ hours;
hours = 0;
}
if (hours >= set_hours && minutes >= set_minutes)
{
digitalWrite(relay, relay_toggle);
lcd.setCursor(4, 0);
relay_toggle = !relay_toggle;
seconds = 0;
minutes = 0;
hours = 0;
}
lcd.setCursor(4, 0);
if (hours <= 9)
{
lcd.print('0');
}
lcd.print(hours);
lcd.print(':');
if (minutes <= 9)
{
lcd.print('0');
}
lcd.print(minutes);
lcd.print(':');
if (seconds <= 9)
{
lcd.print('0');
}
lcd.print(seconds);
timer.reset();
lcd.setCursor(2, 1);
if (relay_toggle == 1)
{
lcd.print("PUMP RUNNING");
}
else if (relay_toggle == 0)
{
lcd.print("PUMP STOPPED");
}
if (digitalRead(stop_counter) == LOW)
{
set_flag = false;
RUN = false;
stop_count();
}
}
}
}
void stop_count()
{
while (!RUN) {
set_flag = false;
timer.reset();
seconds = 0;
minutes = 0;
hours = 0;
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMER");
lcd.setCursor(0, 1);
lcd.print(" STOPPED");
delay(1000);
return;
}
}
void set_time()
{
lcd.clear();
set_minutes = 0;
set_hours = 0;
while (set_flag == true)
{
if (digitalRead(increment) == LOW)
{
delay(100);
if (digitalRead(increment) == LOW)
{
set_minutes = ++set_minutes;
if (set_minutes >= 59)
{
set_minutes = 0;
set_hours = ++set_hours;
if (set_hours >= 24)
{
set_hours = 0;
set_minutes = 0;
}
}
}
}
if (digitalRead(decrement) == LOW)
{
delay(100);
if (digitalRead(decrement) == LOW)
{
set_minutes = --set_minutes;
if (set_minutes <= 0)
{
set_minutes = 59;
set_hours = --set_hours;
if (set_hours <= -1 || set_minutes <= -1)
{
set_hours = 23;
set_minutes = 59;
}
}
}
}
lcd.setCursor(0, 0);
lcd.print(" PRESS INC/DEC");
lcd.setCursor(5, 1);
if (set_hours <= 9)
{
lcd.print('0');
}
lcd.print(set_hours);
lcd.print(':');
if (set_minutes <= 9)
{
lcd.print('0');
}
lcd.print(set_minutes);
if (digitalRead(stop_counter) == LOW)
{
delay(500);
if (digitalRead(stop_counter) == LOW)
{
set_flag = false;
RUN = false;
stop_count();
}
}
if (digitalRead(set) == LOW)
{
delay(500);
if (digitalRead(set) == LOW)
{
EEPROM.update(add_minutes, set_minutes);
EEPROM.update(add_hours, set_hours);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIME SET");
lcd.setCursor(0, 1);
lcd.print(" PRESS START");
delay (1000);
break;
}
}
}
}
void setup()
{
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" AQUAPONICS");
lcd.setCursor(0, 1);
lcd.print(" TIMER");
delay(1000);
timer.setInterval(1000);
Serial.begin(9600);
pinMode(start_counter, INPUT_PULLUP);
pinMode(stop_counter, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(increment, INPUT_PULLUP);
pinMode(decrement, INPUT_PULLUP);
pinMode(relay, OUTPUT);
seconds = 0;
minutes = 0;
hours = 0;
set_hours = EEPROM.read(add_hours);
set_minutes = EEPROM.read(add_minutes);
delay(1000);
lcd.clear();
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(" TIMER READY");
lcd.setCursor(0, 1);
lcd.print("PRESS START/SET");
if (digitalRead(start_counter) == LOW)
{
relay_toggle = true;
RUN = true;
count();
}
if (digitalRead(set) == LOW)
{
delay(100);
if (digitalRead(set) == LOW)
{
set_flag = true;
set_time();
}
}
}