СОДЕРЖАНИЕ ►
Сделать светофор на 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); }
Пояснения к коду:
- для пинов со светодиодами заданы имена с помощью директивы
#define; - переключение светодиодов происходит каждые три секунды, интервал можно изменить, поменяв в программе значение переменной
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); } }
Пояснения к коду:
- для пинов со светодиодами и для тактовой кнопки заданы имена;
- цикл 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); }
Пояснения к коду:
- чтобы не усложнять код, светофоры подключены к плате парами;
- частота мигания зеленого сигнала меняется в переменной
miganie; - проект светофора можно усовершенствовать, заменив кнопку ультразвуковыми дальномерами hc-sr04 для Ардуино.










while (digitalRead(10) == LOW)
— а почему так? Ведь получается, что если кнопка не нажата, то циклы выполняется, и все фазы идут по кругу.
А вот если сделать while (digitalRead(10) == HIGH), то как раз и получится, что светофоры до нажатия кнопки будут гореть в начальном положении.
По крайней мере, у меня вот так 🙂
Все верно. Игорь, спасибо за комментарий. Все зависит от схемы подключения кнопки — у нас кнопка светофора подтянута через резистор на GND в отпущенном состоянии.
Исправили скетч
Случайно попал на Ваш сайт, интересные примеры… только светофор с кнопкой как бы не очень логично, тем более для детей или начинающих.
Разумнее заменить конструкцию с while (digitalRead(10) == LOW) на if (digitalRead(KNP) == LOW)
Тогда по нажатию на кнопку будет последовательное переключение светофора по фазам с возвращением к первой фазе, а вначале loop() первую фазу перенести в конец функции setup() и конец конструкции if()
Фазу переключения светофора выделить в функцию…
… получается изящно и логика работы светофора по нажатию на кнопку соответствует реальным светофорам для пешеходов…