Светофор на Arduino с двумя направлениями (обучение работе с Proteus)

Данная статья написана специально для обучения работе с симулятором Proteus и предназначена для пошагового освоения принципов управления цифровыми выходами Arduino. В качестве примера рассматривается модель двунаправленного светофора, реализованная на светодиодах, которые имитируют работу реального дорожного светофора.

Светофор с двумя направлениями

Проект отлично подходит для начинающих, так как не требует сложных датчиков или интерфейсов, но при этом демонстрирует:

  • работу с цифровыми пинами Arduino;
  • использование функций для структурирования кода;
  • реализацию логики состояний;
  • запуск и тестирование проекта в Proteus.

Назначение проекта

Цель проекта — смоделировать работу светофорной системы для автомобилей и пешеходов. Один комплект сигналов управляет движением транспорта, второй — разрешает или запрещает переход для пешеходов.

В каждый момент времени соблюдается следующая логика:

  • когда автомобилям разрешено движение (зелёный сигнал), пешеходам горит красный;
  • когда пешеходам разрешён переход (зелёный сигнал), транспорт останавливается на красный;
  • жёлтый сигнал используется как предупреждающий этап перед сменой состояний.

Подобная схема применяется в реальных светофорных контроллерах на пешеходных переходах и регулируемых участках дорог. В данном проекте логика реализована в упрощённом виде и предназначена для обучения работе с Arduino и симулятором Proteus.

Необходимые компоненты

  • Arduino UNO;
  • 6 светодиодов (красный, жёлтый, зелёный × 2);
  • 6 резисторов 220–330 Ом;
  • Proteus 8 или 9 с установленной Arduino-библиотекой.

Назначение пинов

Каждый светофор состоит из трёх светодиодов:

  • Первый светофор:
    • Красный — пин 13;
    • Жёлтый — пин 12;
    • Зелёный — пин 11.
  • Второй светофор:
    • Красный — пин 10;
    • Жёлтый — пин 9;
    • Зелёный — пин 8.

Принцип работы программы

В функции setup() все используемые пины настраиваются как выходы. После этого все светодиоды принудительно выключаются, чтобы исключить случайные состояния при старте.

Основная логика вынесена в отдельную функцию Traffic_Signals(), которая поочерёдно:

  • включает красный сигнал одного направления и зелёный другого;
  • включает оба жёлтых сигнала перед переключением;
  • меняет направления движения;
  • повторяет цикл бесконечно.

Использование отдельной функции делает код более читаемым и упрощает дальнейшее расширение проекта, например добавление кнопок, таймеров или датчиков.

Arduino-скетч

// Первый светофор
#define red1 13
#define green1 11
#define yellow1 12

// Второй светофор
#define red2 10
#define green2 8
#define yellow2 9

void setup() {
  pinMode(red1, OUTPUT);
  pinMode(yellow1, OUTPUT);
  pinMode(green1, OUTPUT);

  pinMode(red2, OUTPUT);
  pinMode(yellow2, OUTPUT);
  pinMode(green2, OUTPUT);

  // Выключаем все сигналы при старте
  digitalWrite(red1, LOW);
  digitalWrite(yellow1, LOW);
  digitalWrite(green1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(yellow2, LOW);
  digitalWrite(green2, LOW);
}

void loop() {
  // Вызов функции управления светофором
  Traffic_Signals();
}

// Функция управления сигналами светофора
void Traffic_Signals()
{
  // Красный для первого, зелёный для второго направления
  digitalWrite(yellow1, LOW);
  digitalWrite(yellow2, LOW);
  digitalWrite(red1, HIGH);
  digitalWrite(red2, LOW);
  digitalWrite(green1, LOW);
  digitalWrite(green2, HIGH);
  delay(3000);

  // Жёлтый сигнал перед переключением
  digitalWrite(yellow1, HIGH);
  digitalWrite(yellow2, HIGH);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(green1, LOW);
  digitalWrite(green2, LOW);
  delay(1000);

  // Красный для второго, зелёный для первого направления
  digitalWrite(yellow1, LOW);
  digitalWrite(yellow2, LOW);
  digitalWrite(red1, LOW);
  digitalWrite(red2, HIGH);
  digitalWrite(green1, HIGH);
  digitalWrite(green2, LOW);
  delay(3000);

  // Жёлтый сигнал перед повторным переключением
  digitalWrite(yellow1, HIGH);
  digitalWrite(yellow2, HIGH);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(green1, LOW);
  digitalWrite(green2, LOW);
  delay(1000);
}

Запуск проекта в Proteus

Для запуска симуляции:

  • откройте файл проекта .pdsprj в Proteus;
  • убедитесь, что в свойствах Arduino указан путь к файлу .hex;
  • нажмите кнопку Run Simulation;
  • наблюдайте поочерёдное переключение светодиодов.

Важно: подключение реальной платы Arduino не требуется — весь проект полностью работает в симуляции.

Если что-то не работает

Если у вас возникают сложности с запуском проекта или вы не уверены в базовых шагах, рекомендуется сначала пройти вводный урок.

Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода

📁 Скачать примеры