#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Encoder pins
int encoderPinA = 2;
int encoderPinB = 3;
int encoderButtonPin = 4;
// Alarm pin
int alarmPin = 5;
// Variables
long counter = 0;
long presetValue = 0;
bool setMode = false;
unsigned long buttonPressTime = 0;
// Rotary encoder state
int encoderLastStateA = 0;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(encoderButtonPin, INPUT_PULLUP);
pinMode(alarmPin, OUTPUT);
digitalWrite(alarmPin, LOW);
lcd.setCursor(0, 0);
lcd.print("Counter: ");
lcd.setCursor(0, 1);
lcd.print(counter);
encoderLastStateA = digitalRead(encoderPinA);
}
void loop() {
int encoderStateA = digitalRead(encoderPinA);
int encoderStateB = digitalRead(encoderPinB);
if (encoderStateA != encoderLastStateA) {
if (encoderStateB != encoderStateA) {
counter++;
} else {
counter--;
}
if (setMode) {
presetValue = counter;
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(presetValue);
lcd.print(" ");
} else {
lcd.setCursor(0, 1);
lcd.print("Counter: ");
lcd.print(counter);
lcd.print(" ");
}
}
encoderLastStateA = encoderStateA;
if (digitalRead(encoderButtonPin) == LOW) {
if (millis() - buttonPressTime > 3000) {
setMode = !setMode;
buttonPressTime = millis();
if (setMode) {
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(presetValue);
lcd.print(" ");
} else {
lcd.setCursor(0, 1);
lcd.print("Counter: ");
lcd.print(counter);
lcd.print(" ");
}
}
} else {
buttonPressTime = millis();
}
if (counter == presetValue) {
digitalWrite(alarmPin, HIGH);
} else {
digitalWrite(alarmPin, LOW);
}
if (setMode) {
lcd.cursor();
lcd.blink();
} else {
lcd.noCursor();
lcd.noBlink();
}
}