#define button 3              //Push button on D3
#define redLed 5              // redLed on D5
#define greenLed 6            // greenLed on D6
#define yellowLed 7           // yellowLed on D7
int state = 0;                // integer to hold current state
int old_state = 0;            // integer to hold old state
int button_state = 0;         // integer to hold button state
void setup() {
  pinMode(button, INPUT);     // button set as input
  pinMode(redLed, OUTPUT);    // led's set as output
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  digitalWrite(redLed, LOW);     // set initial as off
  digitalWrite(greenLed, LOW);   // set initial as off
  digitalWrite(yellowLed, LOW);  // set initial as off
  Serial.begin(115200);
}
void loop() {
  // debouncing routine to read button
  button_state = digitalRead(button);    // read the state of button
  if (button_state == 1) {               // check of it has been pressed
    delay(50);                        // wait 50 ms
    button_state = digitalRead(button);  // read the state of button again
    if (button_state == 0) {             // if it is 0 considered one press
      state = old_state + 1; 
      Serial.println(state);         // increase state by 1
    }
  }
  else {                              // if button is not been pressed
    delay(100);                       // wait 100 ms
  }
  switch (state) {                    // react to button state & pressed
    case 1:                           // if state = 1
      digitalWrite(redLed, HIGH);     // set redLed on
      digitalWrite(greenLed, LOW);    // set greenLed off
      digitalWrite(yellowLed, LOW);   // set yellowLed off
      old_state = state ;             // set old state as current state
      break;
    case 2:
      digitalWrite(redLed, LOW);      // set redLed off
      digitalWrite(greenLed, HIGH);   // set greenLed on
      digitalWrite(yellowLed, LOW);   // set yellowLed off
      old_state = state ;             // set old state as current state
      break;
    case 3:
      digitalWrite(redLed, LOW);      // set redLed off
      digitalWrite(greenLed, LOW);    // set greenLed off
      digitalWrite(yellowLed, HIGH);  // set yellowLed on
      old_state = state ;             // set old state as current state
      break;
    default:                          // if state is not 1, 2, 3,
      digitalWrite(redLed, LOW);      // set redLed off
      digitalWrite(greenLed, LOW);    // set greenLed off
      digitalWrite(yellowLed, LOW);   // set yellowLed off
      old_state = 0 ;                 // reset to 0
      break;
  }
}