#include <EEPROM.h>
#include <Servo.h>
#include <avr/sleep.h>
#define LED_PIN 6
#define BTN_INC 7
#define BTN_DEC 8
#define SERVO_PIN 9
Servo myServo;
volatile int timeSetting; // Time in minutes
const int minTime = 1;
const int maxTime = 10;
const int eepromAddress = 0;
unsigned long lastRun = 0; // Stores last time the servo activated
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BTN_INC, INPUT_PULLUP);
pinMode(BTN_DEC, INPUT_PULLUP);
myServo.attach(SERVO_PIN);
myServo.write(45); // Initial position
// Read saved time from EEPROM
timeSetting = EEPROM.read(eepromAddress);
if (timeSetting < minTime || timeSetting > maxTime) {
timeSetting = minTime; // Default to 1 min if invalid value found
}
// Show stored time on LED (non-blocking)
indicateTimeSetting();
// Start tracking time from here, so servo won't reset immediately
lastRun = millis();
}
void loop() {
checkButtons(); // Allow user to change time at any moment
// **Check if enough time has passed since last servo movement**
if (millis() - lastRun >= (timeSetting * 60000)) {
lastRun = millis(); // Reset timer
// Move Servo (45° → 90° → 45°)
Serial.println("Activating Servo...");
myServo.write(90);
delay(1000);
myServo.write(45);
delay(1000);
}
// Enter Sleep Mode to Save Power
//Serial.println("Entering Sleep Mode...");
enterSleepMode();
}
// **Improved LED Blink function with instant update**
void indicateTimeSetting() {
int blinkCount = 0;
unsigned long previousMillis = 0;
bool ledState = false;
int lastTimeSetting = timeSetting;
while (blinkCount < timeSetting) {
unsigned long currentMillis = millis();
checkButtons(); // Allow time change while blinking
// **Stop blinking and restart if time changed**
if (lastTimeSetting != timeSetting) {
lastTimeSetting = timeSetting;
Serial.println("Time changed! Restarting LED blink...");
blinkCount = 0; // Reset blink count
}
if (currentMillis - previousMillis >= 1000) { // Blink every 1 sec
previousMillis = currentMillis;
ledState = !ledState; // Toggle LED
digitalWrite(LED_PIN, ledState);
if (!ledState) blinkCount++; // Count only when LED turns off
}
}
digitalWrite(LED_PIN, LOW); // Ensure LED is OFF after blinking
}
// Function to check buttons and update time
void checkButtons() {
bool updated = false;
if (digitalRead(BTN_INC) == LOW) {
if (timeSetting < maxTime) {
timeSetting++;
updated = true;
Serial.print("Time increased to: ");
Serial.println(timeSetting);
}
delay(300);
}
if (digitalRead(BTN_DEC) == LOW) {
if (timeSetting > minTime) {
timeSetting--;
updated = true;
Serial.print("Time decreased to: ");
Serial.println(timeSetting);
}
delay(300);
}
if (updated) {
EEPROM.write(eepromAddress, timeSetting); // Save new setting
indicateTimeSetting(); // Show new time setting with LED
}
}
// Function to put Arduino into sleep mode
void enterSleepMode() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
}