LED Blinking Patterns

Solving Approach

How do you plan to solve it?

 led resistor = 220, anode to GPIO
pull up RC: R = 10k, C = 10nF, RC in series, connect 5V to R and GND to C, connect GPIO 2 to node between R and C
pushbutton: one node to GND, another node to GPIO 2
 The code uses edge detection and timing state machine to avoid blocking using delay().

Code

/*Paste your code here*/
#define jump 2
#define led1 3
#define led2 4
#define led3 5
#define led4 6
uint8_t state = 1;
uint8_t button_state;
uint8_t led_pattern[][4] = {
  {0b1111, 0b0000},       // state 1
  {0b1010, 0b0101},       // state 2
  {0b1000, 0b0100, 0b0010, 0b0001}, // state 3
  {0b1100, 0b0011},       // state 4
  {0b1001, 0b0110}        // state 5
};
const uint8_t pattern_lengths[] = {2,2,4,2,2}; 
uint8_t current_pattern_index = 0;
uint8_t last_button_state = HIGH;
unsigned long last_time = 0;
const uint8_t led_delay = 500;

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

void loop()
{
  unsigned long time = millis();
  button_state = digitalRead(jump);
  if(button_state == LOW && last_button_state == HIGH){
    state++;
      if(state > 5)
        state = 1;
   	current_pattern_index = 0;
    last_time = time;
  }
  last_button_state = button_state;
  if((time - last_time) >= led_delay){
    led_pattern_write(led_pattern[state-1][current_pattern_index]);
    current_pattern_index++;
    if(current_pattern_index >= pattern_lengths[state-1])
      current_pattern_index = 0;
    last_time = time;
  }
}


void led_pattern_write (uint8_t pattern){
  digitalWrite(led1, (pattern >> 0) & 1);
  digitalWrite(led2, (pattern >> 1) & 1);
  digitalWrite(led3, (pattern >> 2) & 1);
  digitalWrite(led4, (pattern >> 3) & 1);
}

 

 

 

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!