#include <EEPROM.h>
// Define pin numbers for LEDs
const int ledPinR1 = 2;
const int ledPinY1 = 3;
const int ledPinG1 = 4;
const int ledPinR2 = 5;
const int ledPinY2 = 6;
const int ledPinG2 = 7;
const int ledPinR3 = 8;
const int ledPinY3 = 9;
const int ledPinG3 = 10;
const int ledPinR4 = 11;
const int ledPinY4 = 12;
const int ledPinG4 = 13;
// Define pin numbers for buttons
const int incButtonPin1 = A0;
const int decButtonPin1 = A1;
const int incButtonPin2 = A2;
const int decButtonPin2 = A3;
const int incButtonPin3 = A4;
const int decButtonPin3 = A5;
// Define initial delay durations (in milliseconds)
unsigned long delayDuration1 = 7000;
unsigned long delayDuration2 = 2000;
unsigned long delayDuration3 = 400;
// EEPROM addresses for storing delay durations
const int addrDelayDuration1 = 0;
const int addrDelayDuration2 = sizeof(unsigned long);
const int addrDelayDuration3 = sizeof(unsigned long) * 2;
unsigned long previousMillis = 0;
unsigned long previousMillis1 = 0;
int ledState = 0;
int ledState1 = 0;
bool isLed1OnPeriod1 = false; // Track if it's LED1's on period
bool isLed1OnPeriod2 = false; // Track if it's LED1's on period
bool isLed1OnPeriod3 = false; // Track if it's LED1's on period
bool isLed1OnPeriod4 = false; // Track if it's LED1's on period
unsigned long led1PreviousBlinkMillis = 0; // Stores the last time LED1 was toggled
const unsigned long led1BlinkInterval = 500; // Blink interval for LED1 (in milliseconds)
bool led1State2 = LOW; // LED1 state
bool led1State3 = LOW; // LED1 state
bool led1State4 = LOW; // LED1 state
bool led1State5 = LOW; // LED1 state
void setup() {
// Initialize Serial Monitor
Serial.begin(9600);
// Initialize LED pins as outputs
pinMode(ledPinR1, OUTPUT);
pinMode(ledPinY1, OUTPUT);
pinMode(ledPinG1, OUTPUT);
pinMode(ledPinR2, OUTPUT);
pinMode(ledPinY2, OUTPUT);
pinMode(ledPinG2, OUTPUT);
pinMode(ledPinR3, OUTPUT);
pinMode(ledPinY3, OUTPUT);
pinMode(ledPinG3, OUTPUT);
pinMode(ledPinR4, OUTPUT);
pinMode(ledPinY4, OUTPUT);
pinMode(ledPinG4, OUTPUT);
// Initialize button pins as inputs with pull-up resistors
pinMode(incButtonPin1, INPUT_PULLUP);
pinMode(decButtonPin1, INPUT_PULLUP);
pinMode(incButtonPin2, INPUT_PULLUP);
pinMode(decButtonPin2, INPUT_PULLUP);
pinMode(incButtonPin3, INPUT_PULLUP);
pinMode(decButtonPin3, INPUT_PULLUP);
// Retrieve delay durations from EEPROM
//EEPROM.get(addrDelayDuration1, delayDuration1);
//EEPROM.get(addrDelayDuration2, delayDuration2);
//EEPROM.get(addrDelayDuration3, delayDuration3);
// Print initial delay durations to Serial Monitor
printDelayDurationsToSerial();
}
void loop() {
// Update delay durations based on button presses
updateDelayDurations();
// Blink LEDs using the current delay durations with millis()
blinkLEDs();
/////////////////////////////////////////////////////////////////////////////////////////////added
unsigned long currentMillis1 = millis(); // Get the current time
if (isLed1OnPeriod1) {
if (currentMillis1 - led1PreviousBlinkMillis >= delayDuration3) {
led1PreviousBlinkMillis = currentMillis1; // Update the last blink time
led1State2 = !led1State2; // Toggle LED1 state
digitalWrite(ledPinG1, led1State2); // Update the LED1 state
}
}
else if (isLed1OnPeriod2) {
if (currentMillis1 - led1PreviousBlinkMillis >= delayDuration3) {
led1PreviousBlinkMillis = currentMillis1; // Update the last blink time
led1State3 = !led1State3; // Toggle LED1 state
digitalWrite(ledPinG2, led1State3); // Update the LED1 state
}
}
else if (isLed1OnPeriod3) {
if (currentMillis1 - led1PreviousBlinkMillis >= delayDuration3) {
led1PreviousBlinkMillis = currentMillis1; // Update the last blink time
led1State4 = !led1State4; // Toggle LED1 state
digitalWrite(ledPinG3, led1State4); // Update the LED1 state
}
}
else if (isLed1OnPeriod4) {
if (currentMillis1 - led1PreviousBlinkMillis >= delayDuration3) {
led1PreviousBlinkMillis = currentMillis1; // Update the last blink time
led1State5 = !led1State5; // Toggle LED1 state
digitalWrite(ledPinG4, led1State5); // Update the LED1 state
}
}
else {
digitalWrite(ledPinG1, LOW);
digitalWrite(ledPinG2, LOW);
digitalWrite(ledPinG3, LOW);
digitalWrite(ledPinG4, LOW);
}
//////////////////////////////////////////////////////////////////////////////////////////////////added
}
void updateDelayDurations() {
bool updated = false;
// Update delay duration 1
if (digitalRead(incButtonPin1) == LOW) {
if (delayDuration1 < 10000) { // Limit maximum delay to 10 seconds
delayDuration1 += 1000; // Increase delay by 100 milliseconds
saveDelayDurationToEEPROM(addrDelayDuration1, delayDuration1);
updated = true;
delay(200); // Debounce delay
}
} else if (digitalRead(decButtonPin1) == LOW) {
if (delayDuration1 > 1000) { // Limit minimum delay to 100 milliseconds
delayDuration1 -= 1000; // Decrease delay by 100 milliseconds
saveDelayDurationToEEPROM(addrDelayDuration1, delayDuration1);
updated = true;
delay(200); // Debounce delay
}
}
// Update delay duration 2
if (digitalRead(incButtonPin2) == LOW) {
if (delayDuration2 < 10000) {
delayDuration2 += 1000;
saveDelayDurationToEEPROM(addrDelayDuration2, delayDuration2);
updated = true;
delay(200);
}
} else if (digitalRead(decButtonPin2) == LOW) {
if (delayDuration2 > 1000) {
delayDuration2 -= 1000;
saveDelayDurationToEEPROM(addrDelayDuration2, delayDuration2);
updated = true;
delay(200);
}
}
// Update delay duration 3
if (digitalRead(incButtonPin3) == LOW) {
if (delayDuration3 < 2000) {
delayDuration3 += 100;
saveDelayDurationToEEPROM(addrDelayDuration3, delayDuration3);
updated = true;
delay(200);
}
} else if (digitalRead(decButtonPin3) == LOW) {
if (delayDuration3 > 100) {
delayDuration3 -= 100;
saveDelayDurationToEEPROM(addrDelayDuration3, delayDuration3);
updated = true;
delay(200);
}
}
// Print updated delay durations to Serial Monitor if any changes were made
if (updated) {
printDelayDurationsToSerial();
}
}
void blinkLEDs() {
unsigned long currentMillis = millis();
if (ledState == 0 && currentMillis - previousMillis >= delayDuration2) {
previousMillis = currentMillis;
ledState = 1;
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR3, HIGH);
digitalWrite(ledPinR4, HIGH);
digitalWrite(ledPinG1, HIGH);
isLed1OnPeriod1 = true;
}
else if (ledState == 1 && currentMillis - previousMillis >= delayDuration1) {
previousMillis = currentMillis;
ledState = 2;
digitalWrite(ledPinR1, LOW);
digitalWrite(ledPinR2, LOW);
digitalWrite(ledPinY1, HIGH);
digitalWrite(ledPinY2, HIGH);
digitalWrite(ledPinG1, LOW);
isLed1OnPeriod1 = false;
}
else if (ledState == 2 && currentMillis - previousMillis >= delayDuration2) {
previousMillis = currentMillis;
ledState = 3;
digitalWrite(ledPinR1, HIGH);
digitalWrite(ledPinY1, LOW);
digitalWrite(ledPinY2, LOW);
digitalWrite(ledPinG2, HIGH);
isLed1OnPeriod2 = true;
}
else if (ledState == 3 && currentMillis - previousMillis >= delayDuration1) {
previousMillis = currentMillis;
ledState = 4;
digitalWrite(ledPinR2, LOW);
digitalWrite(ledPinR3, LOW);
digitalWrite(ledPinY2, HIGH);
digitalWrite(ledPinY3, HIGH);
digitalWrite(ledPinG2, LOW);
isLed1OnPeriod2 = false;
}
else if (ledState == 4 && currentMillis - previousMillis >= delayDuration2) {
previousMillis = currentMillis;
ledState = 5;
digitalWrite(ledPinR1, HIGH);
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR4, HIGH);
digitalWrite(ledPinY2, LOW);
digitalWrite(ledPinY3, LOW);
digitalWrite(ledPinG3, HIGH);
isLed1OnPeriod3 = true;
}
else if (ledState == 5 && currentMillis - previousMillis >= delayDuration1) {
previousMillis = currentMillis;
ledState = 6;
digitalWrite(ledPinR3, LOW);
digitalWrite(ledPinR1, HIGH);
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR4, LOW);
digitalWrite(ledPinY3, HIGH);
digitalWrite(ledPinY4, HIGH);
digitalWrite(ledPinG3, LOW);
isLed1OnPeriod3 = false;
}
else if (ledState == 6 && currentMillis - previousMillis >= delayDuration2) {
previousMillis = currentMillis;
ledState = 7;
digitalWrite(ledPinR1, HIGH);
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR3, HIGH);
digitalWrite(ledPinR4, LOW);
digitalWrite(ledPinY3, LOW);
digitalWrite(ledPinY4, LOW);
digitalWrite(ledPinG4, HIGH);
isLed1OnPeriod4 = true;
}
else if (ledState == 7 && currentMillis - previousMillis >= delayDuration1) {
previousMillis = currentMillis;
ledState = 8;
digitalWrite(ledPinR1, LOW);
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR3, HIGH);
digitalWrite(ledPinR4, LOW);
digitalWrite(ledPinY4, HIGH);
digitalWrite(ledPinY1, HIGH);
digitalWrite(ledPinG4, LOW);
isLed1OnPeriod4 = false;
}
else if (ledState == 8 && currentMillis - previousMillis >= delayDuration2) {
previousMillis = currentMillis;
ledState = 0;
digitalWrite(ledPinR1, LOW);
digitalWrite(ledPinR2, HIGH);
digitalWrite(ledPinR3, HIGH);
digitalWrite(ledPinR4, HIGH);
digitalWrite(ledPinY4, LOW);
digitalWrite(ledPinY1, LOW);
digitalWrite(ledPinG1, HIGH);
isLed1OnPeriod1 = true;
}
}
void saveDelayDurationToEEPROM(int address, unsigned long duration) {
EEPROM.put(address, duration);
}
void printDelayDurationsToSerial() {
Serial.print("Delay Duration 1: ");
Serial.print(delayDuration1);
Serial.println(" ms");
Serial.print("Delay Duration 2: ");
Serial.print(delayDuration2);
Serial.println(" ms");
Serial.print("Delay Duration 3: ");
Serial.print(delayDuration3);
Serial.println("ms");
}