#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
Encoder encoder1(2, 3);
Encoder encoder2(4, 5);
LiquidCrystal_I2C lcd(0x27, 16, 4);
int onMinutes, offMinutes;
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, LOW); // 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("Set On Time");
lcd.setCursor(0, 1);
lcd.print("Minutes: ");
while (encoder1Click < 1) {
onMinutes = encoder1.read() / 4;
lcd.setCursor(9, 2);
lcd.print(onMinutes);
Serial.println(encoder1Click);
if (digitalRead(b1) == LOW) {
encoder1Click++;
delay(200);
}
}
onTime = onMinutes * 60UL * 1000UL; // convert minutes to milliseconds
// set the off time
lcd.clear();
lcd.print("Set Off Time");
lcd.setCursor(0, 1);
lcd.print("Minutes: ");
while (encoder2Click < 1) {
offMinutes = encoder2.read() / 4;
lcd.setCursor(9, 2);
lcd.print(offMinutes);
if (digitalRead(b2) == LOW) {
encoder2Click++;
delay(200);
}
}
offTime = offMinutes * 60UL * 1000UL; // convert minutes to milliseconds
}
void loop() {
Serial.println(digitalRead(relayPin));
unsigned long currentTime = millis();
lcd.clear();
if (digitalRead( relayPin)==HIGH) {
// the relay is currently on
lcd.print("On Time: ");
lcd.setCursor(0, 1);
lcd.print(onMinutes);
lcd.setCursor(0, 2);
lcd.print("Remaining: ");
lcd.print((onTime - (currentTime % onTime)) / 1000UL);
lcd.print("s");
lcd.setCursor(0, 3);
lcd.print("Relay: ON");
Serial.println(currentTime % onTime);
Serial.println( offTime);
if (currentTime % onTime >= (offTime-500)) {
Serial.println("RELAY IS OFF");
digitalWrite(relayPin, LOW);
Serial.println(digitalRead(relayPin));
delay(100);
currentTime-=currentTime;
}
}
if(digitalRead( relayPin)==LOW){
Serial.println("relay is off");
// the relay is currently off
lcd.print("Off Time: ");
lcd.setCursor(0, 1);
lcd.print(offMinutes);
lcd.setCursor(0, 2);
lcd.print("Remaining: ");
lcd.print((offTime - (currentTime % offTime)) / 1000UL);
lcd.print("s");
lcd.setCursor(0, 3);
lcd.print("Relay: OFF");
Serial.println(currentTime % offTime);
Serial.println( onTime);
if (currentTime % offTime >= (onTime-500)) {
digitalWrite(relayPin, HIGH);
Serial.println("R TURN ON AGAIN");
}
}
delay(500);
}