#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int encoderPinA = 2;
const int encoderPinB = 3;
const int encoderButtonPin = 4;
const int relayPin = 5;
int encoderPos = 0;
int lastEncoderPos = 0;
bool encoderButtonState = false;
bool encoderButtonStateLast = false;
unsigned long countdownDuration = 10 * 60 * 1000;
unsigned long startTime;
unsigned long remainingTime;
const unsigned long relayOffDelay = 5000; // Delay before turning off the relay, in milliseconds
unsigned long relayOffTime; // Time when the relay should be turned off
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(encoderButtonPin, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
lcd.begin();
lcd.backlight();
startTime = millis();
remainingTime = countdownDuration;
relayOffTime = 0;
printTime();
}
void loop() {
int a = digitalRead(encoderPinA);
int b = digitalRead(encoderPinB);
if (a != lastEncoderPos) {
encoderPos += (a == b) ? 1 : -1;
lastEncoderPos = a;
}
encoderButtonState = !digitalRead(encoderButtonPin);
if (encoderButtonState && !encoderButtonStateLast) {
}
encoderButtonStateLast = encoderButtonState;
if (encoderPos != lastEncoderPos) {
if (encoderPos > lastEncoderPos) {
remainingTime += 1000;
} else {
if (remainingTime > 1000) {
remainingTime -= 1000;
}
}
printTime();
lastEncoderPos = encoderPos;
}
if (remainingTime <= 0) {
lcd.clear();
lcd.print("Time's up!");
digitalWrite(relayPin, HIGH);
relayOffTime = millis() + relayOffDelay;
while (true) {}
}
remainingTime = countdownDuration - (millis() - startTime);
printTime();
if (remainingTime <= relayOffDelay && !relayOffTime) {
relayOffTime = millis() + relayOffDelay;
}
if (relayOffTime && millis() >= relayOffTime) {
digitalWrite(relayPin, LOW);
relayOffTime = 0;
}
}
void printTime() {
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(remainingTime / 60000);
lcd.print(":");
lcd.print((remainingTime % 60000) / 1000);
}