#2: Switch with coding

For our second assignment, we were asked to use code within our switch to do something creative with the LED lights. I decided to create a car game of sorts (however, having run of time, it was reduced to a lesser parody).

I coded 3 different LED lights to turn on as a traffic light would. This took a lot of help and I ended up learning new methods I hadn’t used before. I also wanted to attach a button pin to turn the traffic lights on and off which proved to be very difficult.

Lastly, I also wanted lights to turn on once the car touched the finish line – I did this using a simple circuit using foil and without any code.

If I had more time, I would have liked to build a proper traffic light and circuit and also two cars that could actually race.

 

int red = 2;
int yellow = 3;
int green = 4;
int buttonPin = 5;
// boolean variable to keep track of whether our sequence is on or off
bool start = false;

// variable to keep track of our prevous button state
int prevButtonState = LOW;

// a very large container of memory used as a variable for numbers that continually increase (Like time)
unsigned long triggerTime = 0;

// the interval between light changes
int interval = 2000;

// which light are we currently activating
int whichLight = 0;

void setup() {
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);

}
void loop() {


  // read our button (switch)
  int currentButtonState = digitalRead(buttonPin);
  
  // if the button is currently being pressed and during the last frame it was not pressed then continue
  if (currentButtonState == HIGH && prevButtonState == LOW) {
    // flip start on or off
    start = !start;
    // reset our trigger time to the current time so we can trigger immediately
    triggerTime = millis();
    // reset our light sequence to the beginning
    whichLight = 0;
  }

  // if sequence is activated then call changeLights()
  if (start == true) {
    changeLights();
  } else { // otherwise turn everything off
    digitalWrite(yellow, LOW);
    digitalWrite(red, LOW);
    digitalWrite(green, LOW);
  }

  // remember the current button state so we can have a previous button state the next time through loop
  prevButtonState = currentButtonState;
}

// the actual sequence of light changes
void changeLights() {
  // boolean to trigger the next light or not, start off by not triggering
  bool triggerLight = false;

  // get our current time
  unsigned long currentMillis = millis();

  // if the current time is greater than the time when we should trigger, THEN LET'S TRIGGER!
  if (currentMillis >= triggerTime) {
    triggerLight = true; // LET's TRIGGER
    triggerTime = currentMillis + interval; // reset the trigger time for 2 seconds later
  }

  // if we're triggering the next light
  if (triggerLight == true) {
    // which light are we on
    if (whichLight == 0) { // red
      digitalWrite(red, HIGH);
    } else  if (whichLight == 1) { // yellow
      digitalWrite(yellow, HIGH);
    } else if (whichLight == 2) { // green
      digitalWrite(yellow, LOW);
      digitalWrite(red, LOW);
      digitalWrite(green, HIGH);
    } else if (whichLight == 3) { // then turn everything off
      start = false;
    }

    // increase the sequence to the next light, only to be triggered after the triggerTime == currentTime 
    whichLight = whichLight + 1;
  }
}

 

Leave a Reply