#include <Arduino.h>
#include <ESP32Servo.h>
// LED pins (left → right)
const int ledPins[] = {9, 10, 11, 12, 14};
const int ledCount = 5;
// Button pins
const int redButtonPin = 4;
const int greenButtonPin = 5;
// Servo
const int servoPin = 13;
Servo myServo;
// Timing
const unsigned long ledInterval = 150; // milliseconds
// Toggle flags
bool redActive = false;
bool greenActive = false;
// Button debounce
bool lastRedState = HIGH;
bool lastGreenState = HIGH;
unsigned long lastRedTime = 0;
unsigned long lastGreenTime = 0;
const unsigned long debounce = 50;
// LED sequence control
int ledIndex = 0;
unsigned long lastLedTime = 0;
void setup() {
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
pinMode(redButtonPin, INPUT_PULLUP);
pinMode(greenButtonPin, INPUT_PULLUP);
myServo.attach(servoPin);
myServo.write(90); // center
}
void loop() {
unsigned long now = millis();
// --- Handle Red Button Toggle ---
bool redState = digitalRead(redButtonPin);
if (redState != lastRedState && (now - lastRedTime) > debounce) {
lastRedTime = now;
lastRedState = redState;
if (redState == LOW) {
redActive = !redActive;
greenActive = false; // mutually exclusive
ledIndex = 0; // reset LED sequence
}
}
// --- Handle Green Button Toggle ---
bool greenState = digitalRead(greenButtonPin);
if (greenState != lastGreenState && (now - lastGreenTime) > debounce) {
lastGreenTime = now;
lastGreenState = greenState;
if (greenState == LOW) {
greenActive = !greenActive;
redActive = false; // mutually exclusive
ledIndex = 0; // reset LED sequence
}
}
// --- LED sequence & Servo movement ---
if (redActive) {
if (now - lastLedTime > ledInterval) {
lastLedTime = now;
// Turn off all LEDs first
for (int i = 0; i < ledCount; i++) digitalWrite(ledPins[i], LOW);
// Turn on current LED
digitalWrite(ledPins[ledIndex], HIGH);
// Next LED
ledIndex = (ledIndex + 1) % ledCount;
}
myServo.write(160); // right
}
else if (greenActive) {
if (now - lastLedTime > ledInterval) {
lastLedTime = now;
for (int i = 0; i < ledCount; i++) digitalWrite(ledPins[i], LOW);
// Right-to-left sequence
int idx = ledCount - 1 - ledIndex;
digitalWrite(ledPins[idx], HIGH);
ledIndex = (ledIndex + 1) % ledCount;
}
myServo.write(20); // left
}
else {
// Neutral: all LEDs off, servo center
for (int i = 0; i < ledCount; i++) digitalWrite(ledPins[i], LOW);
myServo.write(90);
}
}