START A BIT > Projects Library > This page
Connect the external 3 LEDs, understand physical wiring in practice
Use digitalWrite to output a digital (0 or 1) signal
The Swedish Traffic Light Sequence
Red: Stop.
Red + Yellow: "Get ready." The light is about to turn green. You should prepare to move but not cross the line yet.
Green: Go.
Yellow: Stop! (Unless you are so close to the intersection that stopping would be dangerous).
Red: Stop.
Repeat from step 1
# The "Setup"
RED = DigitalPin.P0
YELLOW = DigitalPin.P1
GREEN = DigitalPin.P2
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 0)
def on_forever():
# 1. RED ONLY (Explicitly turn others off)
pins.digital_write_pin(RED, 1)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 0)
basic.pause(3000)
# 2. RED + YELLOW (Swedish "Prepare")
pins.digital_write_pin(RED, 1)
pins.digital_write_pin(YELLOW, 1)
pins.digital_write_pin(GREEN, 0)
basic.pause(1000)
# 3. GREEN ONLY
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 1)
basic.pause(3000)
# 4. YELLOW ONLY (Clear intersection)
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 1)
pins.digital_write_pin(GREEN, 0)
basic.pause(1200)
basic.forever(on_forever)
const int RED = 2;
const int YELLOW = 3;
const int GREEN = 4;
void setup() {
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
// Explicitly force all LEDs to OFF at startup
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, LOW);
}
void loop() {
// 1. RED ONLY
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, LOW);
delay(3000);
// 2. RED + YELLOW
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, LOW);
delay(1000);
// 3. GREEN ONLY
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
delay(3000);
// 4. YELLOW ONLY
digitalWrite(RED, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, LOW);
delay(1200);
}
Challenging fun task, motivating using looping and function
In the previous story, the traffic light was always changing. Now, the traffic light has a "Default" or "Idle" state: Green. It will stay Green forever unless a pedestrian interrupts it by asking to cross.
Micro:bit: Keep as is, use internal button A or B
Arduino: Upgrade with a button
# Setup pins
RED = DigitalPin.P0
YELLOW = DigitalPin.P1
GREEN = DigitalPin.P2
# Initialization: Start in the "Idle" state (Cars Go)
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 1)
def on_forever():
# Check if the pedestrian pressed Button A
if input.button_is_pressed(Button.A):
# 1. YELLOW: Warn cars to stop
pins.digital_write_pin(GREEN, 0)
pins.digital_write_pin(YELLOW, 1)
basic.pause(2000)
# 2. RED: Cars stop, pedestrians cross
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(RED, 1)
basic.pause(5000)
# Give them 5 seconds to cross
# 3. RED + YELLOW (Swedish rule: Prepare cars to go)
pins.digital_write_pin(YELLOW, 1)
basic.pause(1000)
# 4. GREEN: Back to idle state
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 1)
# Anti-Spam: Force a 5-second wait before the button works again
basic.pause(5000)
else:
# If button is NOT pressed, explicitly ensure Green is ON
pins.digital_write_pin(RED, 0)
pins.digital_write_pin(YELLOW, 0)
pins.digital_write_pin(GREEN, 1)
basic.forever(on_forever)
const int RED = 2;
const int YELLOW = 3;
const int GREEN = 4;
const int BUTTON = 12; // Pedestrian button
void setup() {
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
// CRITICAL: Use INPUT_PULLUP to prevent the pin from floating
// This means the button reads HIGH when NOT pressed, and LOW when pressed.
pinMode(BUTTON, INPUT_PULLUP);
// Initialization: Start with Green ON
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
}
void loop() {
// Check if button is pressed (Reads LOW because of INPUT_PULLUP)
if (digitalRead(BUTTON) == HIGH) {
// Optional: Add a 1-second delay so the light doesn't change instantly
delay(1000);
// 1. YELLOW (Warn cars)
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, HIGH);
delay(2000);
// 2. RED (Pedestrians cross)
digitalWrite(YELLOW, LOW);
digitalWrite(RED, HIGH);
delay(5000); // 5 seconds to cross
// 3. RED + YELLOW (Swedish rule: Prepare to go)
digitalWrite(YELLOW, HIGH);
delay(1000);
// 4. GREEN (Back to idle)
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
// ANTI-SPAM: Give cars at least 5 seconds to drive
// before allowing another pedestrian to trigger the light
delay(5000);
}
// No "else" statement needed here because the loop will just repeat
// and the LEDs will stay in the state they were last left (Green ON).
}
Do they work? Any risk of ocassional or corner case faults? How to fix
Enhance basic knowledge understanding, reflect and summarize what we have learnt
Do you dare to cross the street controlled by the traffic lights system built by you?
What to consider to make a safety-critical program like traffic lights?
What could cause faults or unstability?
Electrical noise?
Perdestrains spaming pressing?