void setup() {
// Настройка всех пинов как выходы
for(int i = 0; i <= 13; i++) pinMode(i, OUTPUT);
// Настройка кнопки
pinMode(A0, INPUT_PULLUP);
// Первоначальное состояние
digitalWrite(6, LOW); // Пешеходный GREEN
digitalWrite(7, HIGH); // Пешеходный RED
digitalWrite(8, LOW); // Машины GREEN гориз
digitalWrite(9, LOW); // Машины YELLOW гориз
digitalWrite(10, HIGH); // Машины RED гориз
digitalWrite(11, LOW); // Машины GREEN верт
digitalWrite(12, LOW); // Машины YELLOW верт
digitalWrite(13, HIGH); // Машины RED верт
Serial.begin(9600);
}
void loop() {
if(checkButton()) return;
phase1();
if(checkButton()) return;
phase2();
if(checkButton()) return;
phase3();
if(checkButton()) return;
phase4();
}
void phase1() {
digitalWrite(13, LOW);
digitalWrite(11, HIGH);
smartDelay(5000);
}
void phase2() {
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
smartDelay(2000);
}
void phase3() {
digitalWrite(13, HIGH);
digitalWrite(10, LOW);
digitalWrite(8, HIGH);
smartDelay(5000);
}
void phase4() {
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
smartDelay(2000);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
}
bool checkButton() {
// Антидребезг
if(digitalRead(A0) == HIGH) return false;
delay(20);
if(digitalRead(A0) == HIGH) return false;
Serial.println("Button pressed!");
allCarsRed();
pedestrianGreen();
// Ждем отпускания
while(digitalRead(A0) == LOW) delay(10);
allCarsRed();
pedestrianRed();
delay(1000);
return true;
}
void allCarsRed() {
digitalWrite(10, HIGH);
digitalWrite(13, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
void pedestrianGreen() {
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
}
void pedestrianRed() {
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
void smartDelay(unsigned long ms) {
unsigned long start = millis();
while(millis() - start < ms) {
if(checkButton()) break;
delay(10);
}
}