Светофор на Ардуино для начинающих

Сделать светофор на Arduino для начинающих изучать микроконтроллер — это отличное занятие, которое позволит лучше разобраться в среде программирования Arduino IDE и понять принцип работы цифровых пинов общего назначения. Рассмотрим схему сборки светофора на Arduino Uno с помощью макетной платы и представим простой проект, который можно использовать на занятиях робототехники с детьми.

Как сделать светофор на Ардуино

Для этого проекта потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • цветные светодиоды и резисторы;
  • тактовая кнопка;
  • макетная плата;
  • провода «папа-папа», «папа-мама».
Схема светофора на Ардуино для начинающих
Схема светофора на Ардуино для начинающих

Для начала соберем простую схему светофора на беспаечной макетной плате, чтобы разобраться с кодом для микроконтроллера Ардуино и понять алгоритм работы светофоров на перекрестках. Это также полезно будет знать детям, чтобы понимать режим работы светофоров на дороге в реальной жизни. Подключите светодиоды к Ардуино по представленной выше схеме и загрузите следующий скетч в плату.

Скетч светофор на Arduino для начинающих

// присваиваем имена для портов со светодиодами
#define RED1 2
#define ORG1 3
#define GRN1 4
#define RED2 6
#define ORG2 7
#define GRN2 8

// задержка между переключением светофора 3 сек
int pause = 3000;

void setup() {
   pinMode(RED1, OUTPUT);
   pinMode(ORG1, OUTPUT);
   pinMode(GRN1, OUTPUT);
   pinMode(RED2, OUTPUT);
   pinMode(ORG2, OUTPUT);
   pinMode(GRN2, OUTPUT);
}

void loop() {
  // первая фаза
   digitalWrite(RED1, HIGH);
   digitalWrite(ORG1, LOW);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, LOW);
   digitalWrite(ORG2, LOW);
   digitalWrite(GRN2, HIGH);
   delay(pause);
  // вторая фаза
   digitalWrite(RED1, HIGH);
   digitalWrite(ORG1, HIGH);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, LOW);
   digitalWrite(ORG2, HIGH);
   digitalWrite(GRN2, LOW);
   delay(pause);
  // третья фаза
   digitalWrite(RED1, LOW);
   digitalWrite(ORG1, LOW);
   digitalWrite(GRN1, HIGH);
   digitalWrite(RED2, HIGH);
   digitalWrite(ORG2, LOW);
   digitalWrite(GRN2, LOW);
   delay(pause);
  // четвертая фаза
   digitalWrite(RED1, LOW);
   digitalWrite(ORG1, HIGH);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, HIGH);
   digitalWrite(ORG2, HIGH);
   digitalWrite(GRN2, LOW);
   delay(pause);
}

Пояснения к коду:

  1. для пинов со светодиодами заданы имена с помощью директивы #define;
  2. переключение светодиодов происходит каждые три секунды, интервал можно изменить, поменяв в программе значение переменной int pause = 3000;



Как сделать светофор на Arduino с кнопкой

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

Схема светофора на Ардуино с тактовой кнопкой
Схема светофора на Ардуино с тактовой кнопкой

Скетч Ардуино светофор с кнопкой

// присваиваем имена для портов со светодиодами
#define RED1 2
#define ORG1 3
#define GRN1 4
#define RED2 6
#define ORG2 7
#define GRN2 8
#define KNP 10

// задержка между переключением светофора 3 сек
int pause = 3000;

void setup() {
   pinMode(RED1, OUTPUT);
   pinMode(ORG1, OUTPUT);
   pinMode(GRN1, OUTPUT);
   pinMode(RED2, OUTPUT);
   pinMode(ORG2, OUTPUT);
   pinMode(GRN2, OUTPUT);
   pinMode(KNP, INPUT);
}

void loop() {
  // первая фаза
   digitalWrite(RED1, HIGH);
   digitalWrite(ORG1, LOW);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, LOW);
   digitalWrite(ORG2, LOW);
   digitalWrite(GRN2, HIGH);
  // цикл while не начнется, пока не будет нажата кнопка
while (digitalRead(10) == HIGH) {
      delay(pause);
     // вторая фаза
      digitalWrite(RED1, HIGH);
      digitalWrite(ORG1, HIGH);
      digitalWrite(GRN1, LOW);
      digitalWrite(RED2, LOW);
      digitalWrite(ORG2, HIGH);
      digitalWrite(GRN2, LOW);
      delay(pause);
     // третья фаза
      digitalWrite(RED1, LOW);
      digitalWrite(ORG1, LOW);
      digitalWrite(GRN1, HIGH);
      digitalWrite(RED2, HIGH);
      digitalWrite(ORG2, LOW);
      digitalWrite(GRN2, LOW);
      delay(pause);
     // четвертая фаза
      digitalWrite(RED1, LOW);
      digitalWrite(ORG1, HIGH);
      digitalWrite(GRN1, LOW);
      digitalWrite(RED2, HIGH);
      digitalWrite(ORG2, HIGH);
      digitalWrite(GRN2, LOW);
      delay(pause);
   }
}

Пояснения к коду:

  1. для пинов со светодиодами и для тактовой кнопки заданы имена;
  2. цикл while выполняется только при нажатой кнопке.

Как сделать светофор на Arduino Uno

В следующем коде было добавлено мигание зеленого сигнала светофора, в остальном он ничем не отличается от первого скетча в этом обзоре. Для желающих сделать подобный проект, мы разместили все необходимые файлы в одном архиве здесь. По ссылке вы можете скачать чертеж перекрестка в формате CDR (Corel Draw) и 3D модель светофора в формате STL. Код для светофора Ардуино размещен далее.

Скетч для двух светофоров на Arduino Uno

// присваиваем имена для портов со светодиодами
#define RED1 2
#define ORG1 3
#define GRN1 4
#define RED2 6
#define ORG2 7
#define GRN2 8

// задержка между переключением светофора 3 сек
int pause = 3000;
int miganie = 500;

void setup() {
   pinMode(RED1, OUTPUT);
   pinMode(ORG1, OUTPUT);
   pinMode(GRN1, OUTPUT);
   pinMode(RED2, OUTPUT);
   pinMode(ORG2, OUTPUT);
   pinMode(GRN2, OUTPUT);
}

void loop() {
  // первая фаза
   digitalWrite(RED1, HIGH);
   digitalWrite(ORG1, LOW);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, LOW);
   digitalWrite(ORG2, LOW);
   digitalWrite(GRN2, HIGH);
   delay(pause);
  // мигание зеленого сигнала
   digitalWrite(GRN2, LOW);
   delay(miganie);
   digitalWrite(GRN2, HIGH);
   delay(miganie);
   digitalWrite(GRN2, LOW);
   delay(miganie);
   digitalWrite(GRN2, HIGH);
   delay(miganie);
   digitalWrite(GRN2, LOW);
   delay(miganie);
   digitalWrite(GRN2, HIGH);
   delay(miganie);
  // вторая фаза
   digitalWrite(RED1, HIGH);
   digitalWrite(ORG1, HIGH);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, LOW);
   digitalWrite(ORG2, HIGH);
   digitalWrite(GRN2, LOW);
   delay(pause);
  // третья фаза
   digitalWrite(RED1, LOW);
   digitalWrite(ORG1, LOW);
   digitalWrite(GRN1, HIGH);
   digitalWrite(RED2, HIGH);
   digitalWrite(ORG2, LOW);
   digitalWrite(GRN2, LOW);
   delay(pause);
  // мигание зеленого сигнала
   digitalWrite(GRN1, LOW);
   delay(miganie);
   digitalWrite(GRN1, HIGH);
   delay(miganie);
   digitalWrite(GRN1, LOW);
   delay(miganie);
   digitalWrite(GRN1, HIGH);
   delay(miganie);
   digitalWrite(GRN1, LOW);
   delay(miganie);
   digitalWrite(GRN1, HIGH);
   delay(miganie);
  // четвертая фаза
   digitalWrite(RED1, LOW);
   digitalWrite(ORG1, HIGH);
   digitalWrite(GRN1, LOW);
   digitalWrite(RED2, HIGH);
   digitalWrite(ORG2, HIGH);
   digitalWrite(GRN2, LOW);
   delay(pause);
}

Пояснения к коду:

  1. чтобы не усложнять код, светофоры подключены к плате парами;
  2. частота мигания зеленого сигнала меняется в переменной miganie;
  3. проект светофора можно усовершенствовать, заменив кнопку ультразвуковыми дальномерами hc-sr04 для Ардуино.


3 Replies to “Arduino светофор. Как сделать светофор на Ардуино”

  1. while (digitalRead(10) == LOW)

    — а почему так? Ведь получается, что если кнопка не нажата, то циклы выполняется, и все фазы идут по кругу.
    А вот если сделать while (digitalRead(10) == HIGH), то как раз и получится, что светофоры до нажатия кнопки будут гореть в начальном положении.

    По крайней мере, у меня вот так 🙂

    1. Все верно. Игорь, спасибо за комментарий. Все зависит от схемы подключения кнопки — у нас кнопка светофора подтянута через резистор на GND в отпущенном состоянии.

      Исправили скетч

  2. Случайно попал на Ваш сайт, интересные примеры… только светофор с кнопкой как бы не очень логично, тем более для детей или начинающих.

    Разумнее заменить конструкцию с while (digitalRead(10) == LOW) на if (digitalRead(KNP) == LOW)
    Тогда по нажатию на кнопку будет последовательное переключение светофора по фазам с возвращением к первой фазе, а вначале loop() первую фазу перенести в конец функции setup() и конец конструкции if()

    Фазу переключения светофора выделить в функцию…
    … получается изящно и логика работы светофора по нажатию на кнопку соответствует реальным светофорам для пешеходов…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.