Multiple LED Patterns (Traffic Light) Using Arduino Uno in Wokwi – Step-by-Step Guide

 

Introduction

In this project, we will create multiple LED patterns simulating a traffic light system using Arduino Uno in the Wokwi simulator. This beginner-friendly Arduino project helps you understand:

  • Digital output control

  • LED sequencing

  • Traffic light timing logic

  • Delay functions

  • Basic embedded systems concepts

You can build and test this project completely online using Wokwi without physical hardware.


Components Required (Wokwi Simulation)


{
  "version": 1,
  "author": "Claude",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-arduino-uno",
      "id": "uno",
      "top": 0,
      "left": 0,
      "attrs": {}
    },
    {
      "type": "wokwi-led",
      "id": "led-red",
      "top": -120,
      "left": 250,
      "attrs": {
        "color": "red"
      }
    },
    {
      "type": "wokwi-led",
      "id": "led-yellow",
      "top": -60,
      "left": 250,
      "attrs": {
        "color": "yellow"
      }
    },
    {
      "type": "wokwi-led",
      "id": "led-green",
      "top": 0,
      "left": 250,
      "attrs": {
        "color": "green"
      }
    },
    {
      "type": "wokwi-led",
      "id": "led-ped-red",
      "top": 80,
      "left": 250,
      "attrs": {
        "color": "red"
      }
    },
    {
      "type": "wokwi-led",
      "id": "led-ped-green",
      "top": 140,
      "left": 250,
      "attrs": {
        "color": "green"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": -110,
      "left": 180,
      "attrs": {
        "value": "220"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r2",
      "top": -50,
      "left": 180,
      "attrs": {
        "value": "220"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r3",
      "top": 10,
      "left": 180,
      "attrs": {
        "value": "220"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r4",
      "top": 90,
      "left": 180,
      "attrs": {
        "value": "220"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r5",
      "top": 150,
      "left": 180,
      "attrs": {
        "value": "220"
      }
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn1",
      "top": 220,
      "left": 50,
      "attrs": {
        "color": "blue"
      }
    }
  ],
  "connections": [
    [
      "uno:13",
      "r1:1",
      "green",
      [
        "v0"
      ]
    ],
    [
      "r1:2",
      "led-red:A",
      "green",
      [
        "v0"
      ]
    ],
    [
      "led-red:C",
      "uno:GND.1",
      "black",
      [
        "v0"
      ]
    ],
    [
      "uno:12",
      "r2:1",
      "yellow",
      [
        "v0"
      ]
    ],
    [
      "r2:2",
      "led-yellow:A",
      "yellow",
      [
        "v0"
      ]
    ],
    [
      "led-yellow:C",
      "uno:GND.1",
      "black",
      [
        "v0"
      ]
    ],
    [
      "uno:11",
      "r3:1",
      "green",
      [
        "v0"
      ]
    ],
    [
      "r3:2",
      "led-green:A",
      "green",
      [
        "v0"
      ]
    ],
    [
      "led-green:C",
      "uno:GND.1",
      "black",
      [
        "v0"
      ]
    ],
    [
      "uno:10",
      "r4:1",
      "red",
      [
        "v0"
      ]
    ],
    [
      "r4:2",
      "led-ped-red:A",
      "red",
      [
        "v0"
      ]
    ],
    [
      "led-ped-red:C",
      "uno:GND.2",
      "black",
      [
        "v0"
      ]
    ],
    [
      "uno:9",
      "r5:1",
      "green",
      [
        "v0"
      ]
    ],
    [
      "r5:2",
      "led-ped-green:A",
      "green",
      [
        "v0"
      ]
    ],
    [
      "led-ped-green:C",
      "uno:GND.2",
      "black",
      [
        "v0"
      ]
    ],
    [
      "btn1:1.l",
      "uno:2",
      "blue",
      [
        "v0"
      ]
    ],
    [
      "btn1:2.r",
      "uno:GND.3",
      "black",
      [
        "v0"
      ]
    ]
  ],
  "dependencies": {}
}

  • Arduino Uno

  • Red LED

  • Yellow LED

  • Green LED

  • 220Ω Resistors (3)

  • Jumper wires


Circuit Connections

LED ColorArduino Pin
Red LEDPin 8
Yellow LEDPin 9
Green LEDPin 10

Connect:

  • LED anode → Arduino pin through resistor

  • LED cathode → GND

Code:
/*
 * Multiple LED Patterns - Traffic Light System
 * Features: Standard Traffic Light, Pedestrian Crossing, Emergency Mode, Night Mode
 * Control: Push button to cycle through different modes
 */

// LED Pin Definitions
const int redLED = 13;      // Red LED
const int yellowLED = 12;   // Yellow LED  
const int greenLED = 11;    // Green LED

// Pedestrian LEDs (optional)
const int pedRedLED = 10;   // Pedestrian Red
const int pedGreenLED = 9;  // Pedestrian Green

// Button Pin
const int buttonPin = 2;    // Mode change button

// Variables
int mode = 0;               // Current mode (0-4)
int lastButtonState = HIGH; // Previous button state
int buttonState;            // Current button state
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  // Initialize LED pins as outputs
  pinMode(redLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(pedRedLED, OUTPUT);
  pinMode(pedGreenLED, OUTPUT);
 
  // Initialize button pin as input with pullup
  pinMode(buttonPin, INPUT_PULLUP);
 
  // Initialize serial communication
  Serial.begin(9600);
  Serial.println("=================================");
  Serial.println("Traffic Light System Started");
  Serial.println("=================================");
  Serial.println("Press button to change modes:");
  Serial.println("Mode 0: Standard Traffic Light");
  Serial.println("Mode 1: Pedestrian Crossing");
  Serial.println("Mode 2: Emergency/Blinking");
  Serial.println("Mode 3: Night Mode");
  Serial.println("Mode 4: All Patterns Demo");
  Serial.println("=================================\n");
 
  // Turn off all LEDs initially
  allOff();
}

void loop() {
  // Read button with debouncing
  int reading = digitalRead(buttonPin);
 
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
     
      // Button pressed (LOW because of INPUT_PULLUP)
      if (buttonState == LOW) {
        mode++;
        if (mode > 4) mode = 0;
       
        Serial.print("\n>>> Mode Changed to: ");
        Serial.println(mode);
        printModeDescription(mode);
        allOff();
        delay(500); // Brief pause when changing modes
      }
    }
  }
 
  lastButtonState = reading;
 
  // Execute current mode
  switch(mode) {
    case 0:
      standardTrafficLight();
      break;
    case 1:
      pedestrianCrossing();
      break;
    case 2:
      emergencyMode();
      break;
    case 3:
      nightMode();
      break;
    case 4:
      allPatternsDemo();
      break;
  }
}

// ============================================
// MODE 0: Standard Traffic Light Sequence
// ============================================
void standardTrafficLight() {
  // Green Light - GO
  Serial.println("GREEN - GO");
  digitalWrite(greenLED, HIGH);
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, LOW);
  digitalWrite(pedRedLED, HIGH);  // Pedestrians STOP
  digitalWrite(pedGreenLED, LOW);
  delay(5000);  // Green for 5 seconds
 
  // Yellow Light - CAUTION
  Serial.println("YELLOW - CAUTION");
  digitalWrite(greenLED, LOW);
  digitalWrite(yellowLED, HIGH);
  digitalWrite(redLED, LOW);
  delay(2000);  // Yellow for 2 seconds
 
  // Red Light - STOP
  Serial.println("RED - STOP");
  digitalWrite(greenLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, HIGH);
  delay(5000);  // Red for 5 seconds
 
  Serial.println("---");
}

// ============================================
// MODE 1: Pedestrian Crossing System
// ============================================
void pedestrianCrossing() {
  // Vehicles GO, Pedestrians STOP
  Serial.println("Vehicles: GREEN | Pedestrians: STOP");
  digitalWrite(greenLED, HIGH);
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, LOW);
  digitalWrite(pedRedLED, HIGH);
  digitalWrite(pedGreenLED, LOW);
  delay(4000);
 
  // Transition - Yellow
  Serial.println("Vehicles: YELLOW | Pedestrians: WAIT");
  digitalWrite(greenLED, LOW);
  digitalWrite(yellowLED, HIGH);
  delay(2000);
 
  // Vehicles STOP, Pedestrians GO
  Serial.println("Vehicles: RED | Pedestrians: WALK");
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, HIGH);
  digitalWrite(pedRedLED, LOW);
  digitalWrite(pedGreenLED, HIGH);
  delay(5000);
 
  // Pedestrian warning - blinking green
  Serial.println("Pedestrians: FINISH CROSSING (blinking)");
  for(int i = 0; i < 5; i++) {
    digitalWrite(pedGreenLED, LOW);
    delay(300);
    digitalWrite(pedGreenLED, HIGH);
    delay(300);
  }
 
  digitalWrite(pedGreenLED, LOW);
  digitalWrite(pedRedLED, HIGH);
  Serial.println("---");
}

// ============================================
// MODE 2: Emergency/Blinking Mode
// ============================================
void emergencyMode() {
  Serial.println("EMERGENCY MODE - All Red Blinking");
 
  // Blink all red LEDs
  for(int i = 0; i < 3; i++) {
    digitalWrite(redLED, HIGH);
    digitalWrite(pedRedLED, HIGH);
    delay(500);
    digitalWrite(redLED, LOW);
    digitalWrite(pedRedLED, LOW);
    delay(500);
  }
 
  Serial.println("---");
}

// ============================================
// MODE 3: Night Mode (Blinking Yellow)
// ============================================
void nightMode() {
  Serial.println("NIGHT MODE - Blinking Yellow");
 
  // Blink yellow LED
  digitalWrite(yellowLED, HIGH);
  delay(1000);
  digitalWrite(yellowLED, LOW);
  delay(1000);
}

// ============================================
// MODE 4: All Patterns Demo
// ============================================
void allPatternsDemo() {
  Serial.println("\n=== DEMO MODE ===");
 
  // Pattern 1: Sequential
  Serial.println("Pattern: Sequential");
  for(int i = 0; i < 2; i++) {
    digitalWrite(redLED, HIGH);
    delay(500);
    digitalWrite(redLED, LOW);
   
    digitalWrite(yellowLED, HIGH);
    delay(500);
    digitalWrite(yellowLED, LOW);
   
    digitalWrite(greenLED, HIGH);
    delay(500);
    digitalWrite(greenLED, LOW);
  }
 
  // Pattern 2: All Blink Together
  Serial.println("Pattern: All Blink");
  for(int i = 0; i < 3; i++) {
    digitalWrite(redLED, HIGH);
    digitalWrite(yellowLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(pedRedLED, HIGH);
    digitalWrite(pedGreenLED, HIGH);
    delay(500);
    allOff();
    delay(500);
  }
 
  // Pattern 3: Chase Effect
  Serial.println("Pattern: Chase");
  for(int i = 0; i < 2; i++) {
    digitalWrite(greenLED, HIGH);
    delay(200);
    digitalWrite(greenLED, LOW);
    digitalWrite(yellowLED, HIGH);
    delay(200);
    digitalWrite(yellowLED, LOW);
    digitalWrite(redLED, HIGH);
    delay(200);
    digitalWrite(redLED, LOW);
    digitalWrite(pedGreenLED, HIGH);
    delay(200);
    digitalWrite(pedGreenLED, LOW);
    digitalWrite(pedRedLED, HIGH);
    delay(200);
    digitalWrite(pedRedLED, LOW);
  }
 
  // Pattern 4: Alternating
  Serial.println("Pattern: Alternating");
  for(int i = 0; i < 3; i++) {
    digitalWrite(redLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(pedRedLED, HIGH);
    delay(500);
    digitalWrite(redLED, LOW);
    digitalWrite(greenLED, LOW);
    digitalWrite(pedRedLED, LOW);
   
    digitalWrite(yellowLED, HIGH);
    digitalWrite(pedGreenLED, HIGH);
    delay(500);
    digitalWrite(yellowLED, LOW);
    digitalWrite(pedGreenLED, LOW);
  }
 
  Serial.println("=== END DEMO ===\n");
}

// ============================================
// Helper Functions
// ============================================
void allOff() {
  digitalWrite(redLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED, LOW);
  digitalWrite(pedRedLED, LOW);
  digitalWrite(pedGreenLED, LOW);
}

void printModeDescription(int m) {
  Serial.print("Active Mode: ");
  switch(m) {
    case 0:
      Serial.println("Standard Traffic Light");
      break;
    case 1:
      Serial.println("Pedestrian Crossing");
      break;
    case 2:
      Serial.println("Emergency/Blinking");
      break;
    case 3:
      Serial.println("Night Mode");
      break;
    case 4:
      Serial.println("All Patterns Demo");
      break;
  }
  Serial.println();
}

How the Traffic Light Code Works

  1. pinMode() sets LED pins as OUTPUT.

  2. digitalWrite() controls LED ON (HIGH) and OFF (LOW).

  3. delay() controls timing between light changes.

  4. The loop continuously cycles through:

    • Green → Yellow → Red

This simulates a real-world traffic signal system.


Adding Multiple LED Patterns

You can enhance the project by:

  • Adding pedestrian crossing button

  • Adding blinking yellow mode

  • Creating night mode flashing signal

  • Using millis() instead of delay()

  • Expanding to 4-way traffic control


Applications of Traffic Light Arduino Project

  • School exhibition project

  • Smart city simulation

  • Embedded systems learning

  • Robotics beginner project

  • IoT traffic automation prototype


Why Use Wokwi Simulator?

  • No physical components required

  • Fast debugging

  • Ideal for beginners

  • Easy to modify and test code

Wokwi makes Arduino learning simple and interactive.


FAQ

Q1: Can I use this project without resistors?

No, resistors protect LEDs from excess current.

Q2: Can I add a buzzer?

Yes, you can add a buzzer for pedestrian alerts.

Q3: Is this suitable for beginners?

Yes, this is one of the best starter Arduino LED projects.


Conclusion

The Multiple LED Patterns (Traffic Light) using Arduino Uno in Wokwi is a simple yet powerful beginner project. It teaches digital output control, timing logic, and real-world embedded system applications.

This project is ideal for students, robotics learners, and electronics beginners.

Comments