const int RED_A_PIN = 13;
const int YELLOW_A_PIN = 12;
const int GREEN_A_PIN = 11;
const int RED_B_PIN = 10;
const int YELLOW_B_PIN = 9;
const int GREEN_B_PIN = 8;
// Определяем пины для пешеходного светофора
const int RED_PED_PIN = 7;
const int GREEN_PED_PIN = 6;
// Определяем пин кнопки
const int BUTTON_PIN = 2;
// Определяем время задержек (в миллисекундах)
const unsigned long GREEN_TIME = 5000; // Время горения зеленого света
const unsigned long YELLOW_TIME = 2000; // Время горения желтого света
const unsigned long RED_TIME = 1000; // Время горения красного света (между переключениями)
const unsigned long PED_GREEN_TIME = 5000; // Время горения зеленого для пешеходов
// Переменные для отслеживания времени и состояния
unsigned long timer = 0;
bool pedestrianRequest = false;
// Переменные для дребезга кнопки
unsigned long lastButtonPress = 0;
const unsigned long DEBOUNCE_DELAY = 50;
// Функция для установки состояния светофора
void setTrafficLight(int redPin, int yellowPin, int greenPin, bool red, bool yellow, bool green) {
digitalWrite(redPin, red);
digitalWrite(yellowPin, yellow);
digitalWrite(greenPin, green);
}
void setup() {
// Настраиваем пины как выходы
pinMode(RED_A_PIN, OUTPUT);
pinMode(YELLOW_A_PIN, OUTPUT);
pinMode(GREEN_A_PIN, OUTPUT);
pinMode(RED_B_PIN, OUTPUT);
pinMode(YELLOW_B_PIN, OUTPUT);
pinMode(GREEN_B_PIN, OUTPUT);
pinMode(RED_PED_PIN, OUTPUT);
pinMode(GREEN_PED_PIN, OUTPUT);
// Настраиваем пин кнопки как вход с подтягивающим резистором
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Начальное состояние: Зеленый для A, Красный для B и пешеходов
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, false, false, true); // Зеленый для A
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, true, false, false); // Красный для B
digitalWrite(RED_PED_PIN, HIGH);
digitalWrite(GREEN_PED_PIN, LOW);
timer = millis();
}
void loop() {
// Читаем состояние кнопки
int buttonState = digitalRead(BUTTON_PIN);
// Проверяем нажатие кнопки с защитой от дребезга
if (buttonState == LOW && (millis() - lastButtonPress) > DEBOUNCE_DELAY) {
lastButtonPress = millis();
pedestrianRequest = true; // Устанавливаем флаг запроса пешехода
}
// Основная логика работы светофора
if (!pedestrianRequest) {
// Если прошло время для зеленого света на A
if (digitalRead(GREEN_A_PIN) == HIGH && (millis() - timer > GREEN_TIME)) {
// Переключаемся на желтый для A
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, false, true, false);
delay(YELLOW_TIME);
// Переключаемся на красный для A и зеленый для B
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, true, false, false);
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, false, false, true);
timer = millis(); // Перезапускаем таймер
}
// Если прошло время для зеленого света на B
else if (digitalRead(GREEN_B_PIN) == HIGH && (millis() - timer > GREEN_TIME)) {
// Переключаемся на желтый для B
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, false, true, false);
delay(YELLOW_TIME);
// Переключаемся на красный для B и зеленый для A
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, true, false, false);
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, false, false, true);
timer = millis(); // Перезапускаем таймер
}
} else {
// Если есть запрос пешехода
// Если сейчас горит зеленый на A
if (digitalRead(GREEN_A_PIN) == HIGH) {
// Переключаемся на желтый для A
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, false, true, false);
delay(YELLOW_TIME);
// Переключаемся на красный для A
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, true, false, false);
}
// Если сейчас горит зеленый на B
else if (digitalRead(GREEN_B_PIN) == HIGH) {
// Переключаемся на желтый для B
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, false, true, false);
delay(YELLOW_TIME);
// Переключаемся на красный для B
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, true, false, false);
}
// Включаем красный для всех машин и зеленый для пешеходов
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, true, false, false);
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, true, false, false);
digitalWrite(RED_PED_PIN, LOW);
digitalWrite(GREEN_PED_PIN, HIGH);
delay(PED_GREEN_TIME);
// Возвращаемся в исходное состояние (зеленый для A, красный для B)
digitalWrite(RED_PED_PIN, HIGH);
digitalWrite(GREEN_PED_PIN, LOW);
setTrafficLight(RED_A_PIN, YELLOW_A_PIN, GREEN_A_PIN, false, false, true);
setTrafficLight(RED_B_PIN, YELLOW_B_PIN, GREEN_B_PIN, true, false, false);
timer = millis(); // Перезапускаем таймер
pedestrianRequest = false; // Сбрасываем запрос пешехода
}
}