LED Blinking Patterns

AliToufaily
AliToufaily

Solving Approach

How do you plan to solve it?

 Create function for each pattern

decalre interrupt to detect switch changes

create software debouncing of switch


 

 

 

 

Code

// C++ code
//
#define LED1  3
#define LED2  4
#define LED3  5
#define LED4  6

#define INTRPIN 2

#define theDelay 500

void pattern1()
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(theDelay);
}

void pattern2()
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, LOW);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, HIGH);
  delay(theDelay);
}

void pattern3()
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, LOW);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, HIGH);
  delay(theDelay);
}

void pattern4()
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  delay(theDelay);
}

void pattern5()
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, HIGH);
  delay(theDelay);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, LOW);
  delay(theDelay);
}


#define PATTERNS 5
typedef void (*func_ptr)();
func_ptr pattern[PATTERNS]={pattern1, pattern2, pattern3, pattern4, pattern5};

int patternInEffect= 0;
int buttonStateChanged = 0;
long lastChange=0;
#define  DebounceTime 100

void myISR()
{
  buttonStateChanged = 1;
}

void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(INTRPIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(INTRPIN), myISR, CHANGE);
  Serial.begin(9600);
}

bool debouncedPress() {
  if (buttonStateChanged == 1) {
    if ((millis() - lastChange) >= DebounceTime) {
      lastChange = millis();
      return true;
    }
    else {
      lastChange = millis();
      return false;
    }
  }
  else {
    return false;
  }
}

void loop()
{
  if (debouncedPress()) {
    patternInEffect= (patternInEffect +1) % PATTERNS;
    buttonStateChanged=0;
    Serial.print("flag raised, pattern now is: ");
    Serial.println(patternInEffect+1);
  }
  pattern[patternInEffect]();
}


 

 

 

Output

Video

Add a video of the output (know more)

 

 

 

Submit Your Solution

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