#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
Encoder encoder1(2, 3);
Encoder encoder2(4, 5);
LiquidCrystal_I2C lcd(0x27, 16, 4);
float onHour, offHour,onMinutes, offMinutes,onSeconds, offSeconds;
int encoder1Click = 0;
int encoder2Click = 0;
int b1 = 6;
int b2 = 7;
int relayPin = 8;
bool relayState = false;
unsigned long onTime;
unsigned long offTime;
void setup() {
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH); // initially turn the relay on
// initialize the LCD
pinMode(b1, INPUT_PULLUP);
pinMode(b2, INPUT_PULLUP);
Serial.begin(115200);
lcd.init();
lcd.backlight();
// set the on time
lcd.clear();
lcd.print("ON");
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 2);
lcd.print("Hour");
while (encoder1Click < 1) {
onHour = encoder1.read() / 4;
lcd.setCursor(0, 1);
lcd.print(onHour);
lcd.setCursor(0, 2);
lcd.print("Hour");
Serial.println(encoder1Click);
if (digitalRead(b1) == LOW) {
encoder1Click++;
delay(200);
}
}
lcd.clear();
lcd.print("ON");
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 2);
lcd.print("Hour");
while (encoder1Click < 2) {
onMinutes = encoder1.read() / 4;
lcd.setCursor(0, 1);
lcd.print(onMinutes);
lcd.setCursor(0, 2);
lcd.print("Minutes");
Serial.println(encoder1Click);
if (digitalRead(b1) == LOW) {
encoder1Click++;
delay(200);
}
}
lcd.clear();
lcd.print("ON");
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 2);
lcd.print("Hour");
while (encoder1Click < 3) {
onSeconds = encoder1.read() / 4;
lcd.setCursor(0, 1);
lcd.print(onSeconds);
lcd.setCursor(0, 2);
lcd.print("Seconds");
Serial.println(encoder1Click);
if (digitalRead(b1) == LOW) {
encoder1Click++;
delay(200);
}
}
onTime = (onHour * 60UL * 60UL* 1000UL) + (onMinutes * 60UL * 1000UL) + (onSeconds* 1000UL); // convert Hour,min and Sec to milliseconds
lcd.clear();
if (onHour>0 && onMinutes<=0 && onSeconds<=0 && digitalRead( relayPin)==HIGH ){
// the relay is currently on
lcd.print("ON ");
lcd.setCursor(0, 1);
lcd.print(onHour);
lcd.setCursor(0, 2);
lcd.print("Hour");
}
if (onHour<=0 && onMinutes>0 && onSeconds<=0 && digitalRead( relayPin)==HIGH ){
// the relay is currently on
lcd.print("ON ");
lcd.setCursor(0, 1);
lcd.print(onMinutes);
lcd.setCursor(0, 2);
lcd.print("Minutes");
}
if (onHour<=0 && onMinutes<=0 && onSeconds>0 && digitalRead( relayPin)==HIGH ){
// the relay is currently on
lcd.print("ON ");
lcd.setCursor(0, 1);
lcd.print(onSeconds);
lcd.setCursor(0, 2);
lcd.print("Seconds");
}
lcd.setCursor(10, 0);
lcd.print("OFF");
while (encoder2Click < 1) {
offHour = encoder2.read() / 4;
lcd.setCursor(10, 1);
lcd.print(offHour);
lcd.setCursor(10, 2);
lcd.print("Hour");
if (digitalRead(b2) == LOW) {
encoder2Click++;
delay(200);
}
}
while (encoder2Click < 2) {
offMinutes = encoder2.read() / 4;
lcd.setCursor(10, 1);
lcd.print(offMinutes);
lcd.setCursor(10, 2);
lcd.print("Minutes");
if (digitalRead(b2) == LOW) {
encoder2Click++;
delay(200);
}
}
while (encoder2Click < 3) {
offSeconds = encoder2.read() / 4;
lcd.setCursor(10, 1);
lcd.print(offSeconds);
lcd.setCursor(10, 2);
lcd.print("Seconds");
if (digitalRead(b2) == LOW) {
encoder2Click++;
delay(200);
}
}
offTime = (offHour * 60UL * 60UL* 1000UL) + (offMinutes * 60UL * 1000UL) + (offSeconds* 1000UL); // convert Hour,min and Sec to milliseconds
if (offHour>0 && offMinutes<=0 && offSeconds<=0 ){
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 1);
lcd.print(offHour);
lcd.setCursor(10, 2);
lcd.print("Hour");
}
if (offHour<=0 && offMinutes>0 && offSeconds<=0){
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 1);
lcd.print(offMinutes);
lcd.setCursor(10, 2);
lcd.print("Minutes");
}
if (offHour<=0 && offMinutes<=0 && offSeconds>0 ){
lcd.setCursor(10, 0);
lcd.print("OFF");
lcd.setCursor(10, 1);
lcd.print(offSeconds);
lcd.setCursor(10, 2);
lcd.print("Seconds");
}
}
void loop() {
Serial.println(digitalRead(relayPin));
unsigned long currentTime = millis();
if (digitalRead( relayPin)==HIGH) {
Serial.println("relay is on");
Serial.println(currentTime % onTime);
Serial.println( offTime);
if (currentTime % onTime >= (onTime-500)) {
digitalWrite(relayPin, LOW);
Serial.println(digitalRead(relayPin));
delay(100);
currentTime-=currentTime;
}
}
if(digitalRead( relayPin)==LOW){
Serial.println("relay is off");
Serial.println(currentTime % offTime);
Serial.println( onTime);
if (currentTime % offTime >= (offTime-500)) {
digitalWrite(relayPin, HIGH);
Serial.println("R TURN ON AGAIN");
}
}
delay(500);
}