#define LED_R 13
#define LED_Y 12
#define LED_G 11
#define LED_R_P 9
#define LED_G_P 8
#define BUT 4
#define POT A2
#define BUZZ A5
void cars(bool r, bool y, bool g) {
digitalWrite(LED_R, r);
digitalWrite(LED_Y, y);
digitalWrite(LED_G, g);
}
void peds(bool r, bool g) {
digitalWrite(LED_R_P, r);
digitalWrite(LED_G_P, g);
}
bool requestCross = false;
void waitWithButton(uint32_t ms) {
const uint16_t step = 20;
uint32_t t0 = millis();
while (millis() - t0 < ms) {
if (digitalRead(BUT) == LOW) {
delay(20);
if (digitalRead(BUT) == LOW) {
requestCross = true;
while (digitalRead(BUT) == LOW) {}
}
}
delay(step);
}
}
void pedestrianPhase(uint32_t cross_ms) {
cars(true, false, false);
peds(false, true);
uint32_t t0 = millis();
while (millis() - t0 < cross_ms) {
uint32_t elapsed = millis() - t0;
uint32_t remain = (cross_ms > elapsed) ? (cross_ms - elapsed) : 0;
if ((elapsed % 500) < 120) tone(BUZZ, 1000, 100);
if (remain <= 2000) {
digitalWrite(LED_G_P, (millis() / 200 ) % 2);
}
else {
digitalWrite(LED_G_P, HIGH);
}
delay(20);
}
peds(true, false);
}
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_R_P, OUTPUT);
pinMode(LED_G_P, OUTPUT);
pinMode(BUZZ, OUTPUT);
pinMode(BUT, INPUT_PULLUP);
pinMode(POT, INPUT);
cars(false, false, true);
peds(true, false);
}
void loop() {
uint32_t cross_ms = map(analogRead(POT), 0, 1023, 3000, 10000);
cars(false, false, true);
peds(true, false);
waitWithButton(5000);
cars(false, true, false);
delay(1000);
cars(true, false, false);
delay(300);
if (requestCross) {
pedestrianPhase(cross_ms);
requestCross = false;
}
else {
delay(2000);
}
cars(false, true, false);
delay(800);
cars(false, false, true);
}