#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Change 0x27 to 0x3F if needed
#define IR_SENSOR 2
#define SET_BTN 3
#define UP_BTN 4
#define DOWN_BTN 5
#define BUZZER 6
int count = 0;
int preset = 10;
bool lastIRState = HIGH;
bool setMode = false;
unsigned long lastDebounce = 0;
void setup() {
pinMode(IR_SENSOR, INPUT);
pinMode(SET_BTN, INPUT_PULLUP);
pinMode(UP_BTN, INPUT_PULLUP);
pinMode(DOWN_BTN, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
// Read from EEPROM
EEPROM.get(0, count);
EEPROM.get(10, preset);
if (preset == 0xFFFF) preset = 10; // First time default
if (count == 0xFFFF) count = 0;
updateDisplay();
}
void loop() {
// SET button - toggle set mode or long press to reset count
if (digitalRead(SET_BTN) == LOW && millis() - lastDebounce > 200) {
lastDebounce = millis();
if (!setMode) {
setMode = true;
} else {
setMode = false;
EEPROM.put(10, preset); // Save preset
}
updateDisplay();
while(digitalRead(SET_BTN) == LOW); // Wait release
}
// Long press SET to reset count
if (digitalRead(SET_BTN) == LOW) {
delay(2000);
if (digitalRead(SET_BTN) == LOW) {
count = 0;
EEPROM.put(0, count);
digitalWrite(BUZZER, LOW);
updateDisplay();
while(digitalRead(SET_BTN) == LOW);
}
}
// UP/DOWN only work in setMode
if (setMode) {
if (digitalRead(UP_BTN) == LOW && millis() - lastDebounce > 200) {
preset++;
lastDebounce = millis();
updateDisplay();
}
if (digitalRead(DOWN_BTN) == LOW && millis() - lastDebounce > 200) {
preset = max(1, preset - 1); // Min preset = 1
lastDebounce = millis();
updateDisplay();
}
}
else {
// Normal counting mode
bool irState = digitalRead(IR_SENSOR);
if (irState == LOW && lastIRState == HIGH) { // Object detected
delay(50); // debounce
if (digitalRead(IR_SENSOR) == LOW) {
count++;
EEPROM.put(0, count); // Save to EEPROM each count
updateDisplay();
if (count >= preset) {
digitalWrite(BUZZER, HIGH); // Preset reached
}
}
}
lastIRState = irState;
}
}
void updateDisplay() {
lcd.clear();
if (setMode) {
lcd.setCursor(0,0);
lcd.print("SET PRESET MODE");
lcd.setCursor(0,1);
lcd.print("Preset: ");
lcd.print(preset);
} else {
lcd.setCursor(0,0);
lcd.print("Count: ");
lcd.print(count);
lcd.setCursor(0,1);
lcd.print("Preset: ");
lcd.print(preset);
if (count >= preset) {
lcd.setCursor(13,0);
lcd.print("ALM");
}
}
}