LED Blinking Patterns

Solving Approach

How do you plan to solve it?

 
 

 

 

 

Code

/*Paste your code here*/
const int led1 = 5;
const int led2 = 4;
const int led3 = 3;
const int led4 = 2;

const int PB = 7;    

const int delayTime = 500;
const int totalPatterns = 5;

int currentPattern = 0;
int buttonPressed = 0;

int lastReading = HIGH;
int debouncedState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;

bool checkButton() {
  int reading = digitalRead(PB);

  if (reading != lastReading) {
    
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != debouncedState) {
      debouncedState = reading;
      if (debouncedState == LOW) { 
        buttonPressed = 1;
        lastReading = reading;
        return true;
      }
    }
  }

  lastReading = reading;
  return false;
}


bool delayWithButtonCheck(unsigned long ms) {
  unsigned long start = millis();
  while (millis() - start < ms) {
    if (checkButton()) return true;
    delay(8); 
  }
  return false;
}


void pattern1() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
}

void pattern2() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  if (delayWithButtonCheck(delayTime)) return;
}

void pattern3() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  if (delayWithButtonCheck(delayTime)) return;
}

void pattern4() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  if (delayWithButtonCheck(delayTime)) return;
}

void pattern5() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  if (delayWithButtonCheck(delayTime)) return;
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  if (delayWithButtonCheck(delayTime)) return;
}

typedef void (*func_ptr)();
func_ptr pattern[totalPatterns] = {pattern1, pattern2, pattern3, pattern4, pattern5};

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

  pinMode(PB, INPUT_PULLUP);
}

void loop() {
  checkButton();

  if (buttonPressed) {
    currentPattern = (currentPattern + 1) % totalPatterns;
    buttonPressed = 0;
  }

  pattern[currentPattern]();
}

 

 

 

Output

Video

Add a video of the output (know more)

 

 

 

Upvote
Downvote

Submit Your Solution

Note: Once submitted, your solution goes public, helping others learn from your approach!