In this project, we'll build a fun "Tug of War" game using an Arduino, a LED bar graph display, and buttons. The game mimics a classic tug-of-war, where two players compete to press their button rapidly to pull the "rope" (represented by a LED) to their side.
Components Needed
- Arduino Uno (or similar) – 1
- LED bar graph display (10-segment) – 1
- Push buttons – 2
- Resistors (10kΩ for pull-downs) – 2
- Resistors (220Ω or 330Ω for LEDs) – 10
- Breadboard – 1
- Jumper wires
Wiring Diagram
| Component | Arduino Pin | Notes |
| LED bar graph pins | D2–D11 | Each pin controls one LED |
| Button 1 | D12 | Player 1's button |
| Button 2 | D13 | Player 2's button |
| 10kΩ resistors | GND | Pull-down for buttons |
| 220Ω resistors | Series with LEDs | Protect LEDs |
- LED Bar Graph:
- Connect the cathodes of the LEDs to GND through a 220Ω resistor.
- Connect each anode to Arduino pins D2 to D11.
- Buttons:
- Connect one leg of each button to GND through a 10kΩ resistor (pull-down configuration).
- Connect the other leg to D12 (Player 1) and D13 (Player 2).
Gameplay Overview
- A "marker" (one lit LED) starts in the middle of the LED bar graph.
- Players press their respective buttons to move the marker toward their end.
- The game ends when the marker reaches one side, indicating the winner.
Code
Here's the Arduino sketch for the Tug of War game:
// Tug of War Game for Arduino const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // LED pins const int numLeds = 10; // Number of LEDs const int button1Pin = 12; // Player 1 button const int button2Pin = 13; // Player 2 button int markerPosition = numLeds / 2; // Start in the middle void setup() { // Initialize LED pins as output for (int i = 0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); } // Initialize button pins as input pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT); // Light up the starting LED updateLeds(); } void loop() { // Read button states int button1State = digitalRead(button1Pin); int button2State = digitalRead(button2Pin); // Check if Player 1 presses their button if (button1State == HIGH) { markerPosition = max(0, markerPosition - 1); // Move left updateLeds(); delay(200); // Debounce delay } // Check if Player 2 presses their button if (button2State == HIGH) { markerPosition = min(numLeds - 1, markerPosition + 1); // Move right updateLeds(); delay(200); // Debounce delay } // Check for win condition if (markerPosition == 0) { gameOver(1); // Player 1 wins } else if (markerPosition == numLeds - 1) { gameOver(2); // Player 2 wins } } void updateLeds() { for (int i = 0; i < numLeds; i++) { digitalWrite(ledPins[i], i == markerPosition ? HIGH : LOW); } } void gameOver(int winner) { for (int i = 0; i < 5; i++) { // Flash LEDs to indicate the winner for (int j = 0; j < numLeds; j++) { digitalWrite(ledPins[j], HIGH); } delay(200); for (int j = 0; j < numLeds; j++) { digitalWrite(ledPins[j], LOW); } delay(200); } // Display winner LED permanently if (winner == 1) { digitalWrite(ledPins[0], HIGH); // Player 1 wins } else { digitalWrite(ledPins[numLeds - 1], HIGH); // Player 2 wins } while (true) {} // Stop the game }
Explanation
- LED Control:
- The updateLeds() function ensures only one LED (the marker) is lit at any time, based on the markerPosition.
- Button Handling:
- The loop checks if either button is pressed and adjusts the marker's position accordingly.
- A debounce delay is added to prevent multiple detections from a single press.
- Win Condition:
- If the marker reaches the first or last LED, the game ends, and the LEDs flash to indicate the winner.
- Game Over:
- After flashing, the winner's LED stays lit, and the game stops.
Testing and Adjustments
- Ensure proper wiring of LEDs and buttons before uploading the code.
- Adjust the debounce delay (200 ms) if buttons feel too slow or too fast.
- Try increasing the number of LEDs for a longer game.




