Готовые решения скетчей для светофора "Роботраффик"
Правила:
Сигналы светофора:
Назначение круглых сигналов светофора определено в ст. 6.2 ПДД:
- ЗЕЛЕНЫЙ - разрешает движение (если мигает, значит время его действия истекает).
- ЖЕЛТЫЙ - запрещает движение (да! да! это запрещающий сигнал светофора).
- КРАСНЫЙ - запрещает движение (даже если он мигает или горит вместе с жёлтым).
- КРАСНЫЙ и ЖЁЛТЫЙ - запрещает движение, информируя о скором включении зеленого.
- ЖЕЛТЫЙ МИГАЮЩИЙ - информирует о нерегулируемом перекрестке или переходе.
Дополнительные секции поворота:
Назначение дополнительных секций поворота (стрелок поворота) определено в ст. 6.3 ПДД:
- ЗЕЛЁНАЯ СТРЕЛКА (дополнительная секция поворота) - разрешает движение в указанном направлении если она светится или мигает.
- Сигналы светофора, выполненные в виде стрелок, имеют то же значение, что и круглые сигналы соответствующего цвета, но их действие распространяется только на направлении, указываемом стрелкой.
Поведение на светофоре:
- Если светофор состоит только из трёх основных секций (красной, желтой и зеленой, без стрелок), то его сигналы распространяются на все направления. Например, при включении зелёного сигнала, можно ехать прямо, влево и вправо, если это не запрещено знаками ПДД. При манёврах влево и вправо необходимо убедиться, что вы не создаёте помех иным участникам движения.
- Если светофор имеет дополнительную секцию поворота (влево и/или вправо) - значит движение в указанном направлении разрешено только при включении зелёного сигнала секции поворота. Например, если у светофора есть секция левого поворота, а светится только зелёный сигнал основного направления, значит разрешено движение только прямо и вправо.
- Дополнительно о светофорах: При наличии дополнительных секций поворота, на зелёные сигналы светофора наносятся стрелки определяющие направления в которых разрешено движение. Сигнал светофора разрешающий движение влево, разрешает и разворот, если это не запрещено знаками ПДД.
Последовательность переключения сигналов светофора:
![]() |
Сигналы основных секций:
|
![]() |
Сигналы дополнительных секций поворота:
|
Обратите внимание на то, что запрет движения (переключение от зелёного к красному, или отключение секций поворота) выполняется дольше чем разрешение движения (переключение от красного к зелёному, или включение секции поворота).
Функции работы со светофором:
В данном разделе перечислен список функций библиотеки iarduino_I2C_Track часто используемых для работы с модулем светофор из линейки «Дорожное движение». Полный список функций библиотеки и их описание доступно на странице Wiki - Светофор и шлагбаум.
Функции настройки светофора:
- Функция: begin( MODUL_TLIGHT, ПЕРЕКРЁСТОК [, СЕКЦИИ] );
- Назначение: Инициализация работы с указанием направлений дорог перекрёстка и наличием у светофора дополнительных секций поворота или шлагбаума.
- Функция: changeAddress( АДРЕС );
- Назначение: Смена адреса модуля на шине I2C.
- Функция: indicator( ФЛАГ );
- Назначение: Разрешение работы светодиода информирующего о передаче данных.
- Функция irProtocol( ПРОТОКОЛ );
- Назначение: Установка протокола используемого для передачи данных по ИК-каналу.
- Функция timing( ДЛИТЕЛЬНОСТЬ );
- Назначение: Установка времени свечения жёлтого (и мигающего зелёного) сигнала.
- Функция irAutoSend( [ИНТЕРВАЛ] );
- Назначение: Автоматическая отправка пакетов данных по ИК-каналу.
- Функция irStop();
- Назначение: Остановка автоматической отправки пакетов по ИК-каналу.
Функции управления светофором:
- Функция set( ЦВЕТ, ЗНАЧЕНИЕ ); // Можно указать до 7 пар параметров.
- Назначение: Управление светофором в ручном режиме.
- Функция set( ДЕЙСТВИЕ [, ДЕЙСТВИЕ] [, ДЕЙСТВИЕ] );
- Назначение: Управление светофором в полуавтоматическом режиме.
Тип перекрестка №1 (регулируемый пешеходный переход)
На картинке, светофор 0x0A направлен влево, светофор 0x0B направлен вправо.

Алгоритм работы светофоров:
Алгоритм управления движением автомобилей через пешеходный переход является самым простым, так как машины движутся по прямой дороге, без поворотов. Для регулировки движения достаточно двух светофоров без секций поворота, при этом их сигналы будут одинаковы.
Светофоры работают в двух фазах:
![]() |
|
![]() |
|
Алгоритм переключения сигналов от зелёного к красному и от красного к зелёному указан в разделе «Последовательность переключения сигналов светофора» данной статьи.
Скетч:
Управление светофорами в полуавтоматическом режиме:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором указав что на его перекрёстке есть дорога только прямо (TRACK_F).
tl_B.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором указав что на его перекрёстке есть дорога только прямо (TRACK_F).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_B.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
} //
//
void loop(){ //
// Фаза 1: //
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении.
tl_B.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении.
delay(13000); // Ждём 13 секунд. За это время оба светофора переключатся с красного на красный и жёлтый, подождут 3 секунды и включат зелёный, который будет светится оставшиеся 10 из 13 секунд.
// Фаза 2: //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении.
tl_B.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении.
delay(11000); // Ждём 11 секунд. За это время оба светофора переключатся с зелёного на мигающий зелёный, подождут 3, переключатся на жёлтый, подождут 3 секунды, переключатся на красный, который будет светится оставшиеся 5 из 11 секунд.
} //
Пример управления светофорами в ручном режиме:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором указав что на его перекрёстке есть дорога только прямо (TRACK_F).
tl_B.begin(MODUL_TLIGHT, TRACK_F); // Инициируем работу со светофором указав что на его перекрёстке есть дорога только прямо (TRACK_F).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.set(TL_GREEN,0, TL_YELLOW,0, TL_RED,1); // Устанавливаем начальное состояние светофора (горит только красный).
tl_B.set(TL_GREEN,0, TL_YELLOW,0, TL_RED,1); // Устанавливаем начальное состояние светофора (горит только красный).
} //
//
void loop(){ //
// Фаза 1: // Горел только красный на двух светофорах.
tl_A.set(TL_YELLOW,1); // Включаем жёлтый (горит красный и жёлтый).
tl_B.set(TL_YELLOW,1); // Включаем жёлтый (горит красный и жёлтый).
delay(3000); // Ждём 3 секунды.
tl_A.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный).
tl_B.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный).
delay(10000); // Ждём 10 секунд.
// Фаза 2: // Горел только зелёный на двух светофорах.
tl_A.set(TL_GREEN,2); // Мигаем зелёным, (светится только зелёный мигая).
tl_B.set(TL_GREEN,2); // Мигаем зелёным, (светится только зелёный мигая).
delay(3000); // Ждём 3 секунды.
tl_A.set(TL_GREEN,0, TL_YELLOW,1); // Отключаем зелёный, включаем жёлтый (горит только жёлтый).
tl_B.set(TL_GREEN,0, TL_YELLOW,1); // Отключаем зелёный, включаем жёлтый (горит только жёлтый).
delay(3000); // Ждём 3 секунды.
tl_A.set(TL_YELLOW,0, TL_RED,1); // Отключаем жёлтый, включаем красный (горит только красный).
tl_B.set(TL_YELLOW,0, TL_RED,1); // Отключаем жёлтый, включаем красный (горит только красный).
delay(5000); // Ждём 5 секунд.
} //
Оба представленных выше скетча выполняют одни и те же действия, но при управлении светофорами в полуавтоматическом режиме, модули сами осуществляют переключение с красного на зелёный и с зелёного на красный.
В коде setup() обоих скетчей выполняются следующие действия:
- Обращением к функции
begin()мы указываем что модуль является светофоромMODUL_TLIGHTи он регулирует дорогу с движением только прямоTRACK_F. При наличии перекрёстка вместоTRACK_Fнужно указатьTRACK_LF, илиTRACK_RF, илиTRACK_LFR. Так как третий параметр функции не указан, значит у светофора нет ни секций поворотов, ни шлагбаума. - Обращением к функции
irProtocol()мы указываем ИК-протокол передачи данных, для трассы лучше использоватьIR_IARDUINO, но можно использоватьIR_SAMSUNGилиIR_RC6. - Обращением к функции
irAutoSend()мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу. - В первом скетче выполнено обращение к функции
timing()которой мы указали длительность свечения жёлтого и мигающего зелёного равной3секундам. Это требуется так как в полуавтоматическом режиме модуль включает эти цвета без нашего участия. Во втором скетче функцияtiming()не вызывалась, так как в ручном режиме мы сами задавали задержки после включения жёлтого и мигающего зелёного сигнала.
В коде loop() обоих скетчей выполнялись обращения к функциям set() и delay().
- Обращением к функции
set()в первом скетче мы указывали модулю действия: переключиться на разрешающий сигнал прямого направленияTL_FORWARD_ONили запрещающий сигнал прямого направленияTL_FORWARD_OFF. При наличии секций поворотов, можно дополнительно указывать действия:TL_LEFT_ON,TL_LEFT_OFF,TL_RIGHT_ONиTL_RIGHT_OFF. - Обращением к функции
set()во втором скетче мы передавали пары параметров для управления каждым цветом секций светофора по отдельности. Первое значение пары определяет секцию:TL_GREEN,TL_YELLOW,TL_RED,TL_RIGHT,TL_LEFT,TL_BEEP,TL_GATEилиTL_ALL. А второе определяет её состояние:0выкл,1вкл,2мигать.
Как видно из примеров, первый скетч выглядит более компактно и читаемо, по этому скетчи остальных примеров будут приведены с полуавтоматическим управлением. При желании попробуйте самостоятельно переписать их для ручного управления.
Тип перекрестка №2 (Т-образный, без секций поворотов):
На картинке, светофор 0x0A направлен влево, светофор 0x0B направлен вниз, светофор 0x0C направлен вправо.

Алгоритм работы светофоров:
Предлагаем алгоритм при котором светофоры 0x0A и 0x0C будут работать одинаково, одновременно разрешая или запрещая движение по прямой дороге. А светофор 0x0B будет работать наоборот, разрешая движение когда оно запрещено светофорами 0x0A и 0x0C. Так как все светофоры не имеют секций поворота, то светофоры 0x0A и 0x0C разрешая движение прямо, разрешат и поворот с прямой дороги на прилегающую. А светофор 0x0C разрешая движение будет разрешать только повороты влево и вправо.
Светофоры работают в двух фазах:
![]() |
|
![]() |
|
Алгоритм переключения сигналов от зелёного к красному и от красного к зелёному указан в разделе «Последовательность переключения сигналов светофора» данной статьи.
Скетч:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с 3 светофором, указав его адрес на шине I2C (0x0C).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_FR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и направо (TRACK_FR).
tl_B.begin(MODUL_TLIGHT, TRACK_LR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога налево и направо (TRACK_LR).
tl_C.begin(MODUL_TLIGHT, TRACK_FL); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и налево (TRACK_FL).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_B.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_C.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
} //
//
void loop(){ //
// Фаза 1: //
tl_B.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "B".
delay(3000); // Ждём 3 секунды. Всё это время светофор "B" будет мигать зелёным.
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "A".
tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "C".
delay(13000); // Ждём 13 секунд. В течении первых 3 секунд на светофорах "A" и "C" будет светится красный с жёлтым, а на светофоре "B" жёлтый. Оставшиеся 10 секунд на светофорах "A" и "C" будет светиться зелёный, а на светофоре "B" красный.
// Фаза 2: //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "A".
tl_C.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "C".
delay(3000); // Ждём 3 секунды. Всё это время светофоры "A" и "C" будут мигать зелёным.
tl_B.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "B".
delay(13000); // Ждём 13 секунд. В течении первых 3 секунд на светофоре "B" будет светится красный с жёлтым, а на светофорах "A" и "C" жёлтый. Оставшиеся 10 секунд на светофорах "A" и "C" будет светиться красный, а на светофоре "B" зелёный.
} //
В коде setup() выполняются следующие действия:
- Все функции кроме
begin()вызываются аналогично 1 скетчу для перекрёстка №1. - При обращении к функции
begin(), в качестве второго параметра указана константа определяющая все возможные направления движения машин для каждого светофора. Для светофора «A» этоTRACK_FRпрямо и направо, для светофора «B» этоTRACK_LRналево и направо, а для светофора «C» этоTRACK_FLпрямо и налево.
Код loop() разделён на 2 фазы в которых выполняются следующие действия:
- Вызов функций
set()для светофоров которым требуется запретить движение прямоTL_FORWARD_OFF. - Задержка
delay()на время свечения мигающего зелёного сигнала (3 сек). - Вызов функции
set()для светофоров которым требуется разрешить движение прямоTL_FORWARD_ON. - Задержка
delay()на время свечения жёлтого сигнала (3 сек) + желаемая длительность текущей фазы движения машин (10 сек).
Дело в том, что запрет движения (переключение от зелёного к красному) занимает два интервала свечения жёлтого, а разрешение движения (переключение от красного к зелёному) занимает один интервал свечения жёлтого. По этому выполняются сначала запреты движений, пауза на 1 интервал свечения жёлтого, а потом разрешения движений. Время свечения жёлтого сигнала мы указали функцией timing() равное 3 секундам. Выдержав указанную паузу, красный и зелёный сигналы всех светофоров перекрёстка будут включаться одновременно, что предотвратит возможность ДТП.
Тип перекрестка №3 (Х-образный, без секций поворотов):
На картинке, светофор 0x0A направлен влево, светофор 0x0B направлен вниз, светофор 0x0C направлен вправо, светофор 0x0D направлен вверх.

Алгоритм работы светофоров:
Предлагаем алгоритм при котором, если движение разрешено светофорами 0x0A и 0x0C, то оно запрещено светофорами 0x0B и 0x0D, и наоборот, если движение разрешено светофорами 0x0B и 0x0D, то оно запрещено светофорами 0x0A и 0x0C. Так как все светофоры не имеют секций поворота, то разрешая движение прямо, они разрешат и повороты в обе стороны.
Светофоры работают в двух фазах:
![]() |
|
![]() |
|
Алгоритм переключения сигналов от зелёного к красному и от красного к зелёному указан в разделе «Последовательность переключения сигналов светофора» данной статьи.
Скетч:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с 3 светофором, указав его адрес на шине I2C (0x0C).
iarduino_I2C_Track tl_D(0x0D); // Создаём объект tl_D для работы с 4 светофором, указав его адрес на шине I2C (0x0D).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR).
tl_B.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR).
tl_C.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR).
tl_D.begin(MODUL_TLIGHT, TRACK_LFR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога влево, прямо и направо (TRACK_LFR).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_D.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_D.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5сек.
tl_B.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5сек.
tl_C.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5сек.
tl_D.timing(5); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 5сек.
} //
//
void loop(){ //
// Фаза 1: //
tl_B.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "B".
tl_D.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "D".
delay(5000); // Ждём 5 секунд. Всё это время светофоры "B" и "D" будут мигать зелёным.
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "A".
tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "C".
delay(20000); // Ждём 20 секунд. В течении первых 5 секунд на светофорах "A" и "C" будет светится красный с жёлтым, а на светофорах "B" и "D" жёлтый. Оставшиеся 15 секунд на светофорах "A" и "C" будет светиться зелёный, а на светофорах "B" и "D" красный.
// Фаза 2: //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "A".
tl_C.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "C".
delay(5000); // Ждём 5 секунд. Всё это время светофоры "A" и "C" будут мигать зелёным.
tl_B.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "B".
tl_D.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "D".
delay(20000); // Ждём 20 секунд. В течении первых 5 секунд на светофорах "B" и "D" будет светится красный с жёлтым, а на светофорах "A" и "C" жёлтый. Оставшиеся 15 секунд на светофорах "A" и "C" будет светиться красный, а на светофорах "B" и "D" зелёный.
} //
В коде setup() выполняются следующие действия:
- Все функции кроме
begin()иtiming()вызываются аналогично предыдущему скетчу. - При обращении к функции
begin(), в качестве второго параметра указана константаTRACK_LFRсообщающая что на перекрёстке регулируемом светофором имеются дороги влево, прямо и направо. - При обращении к функции
timing()мы задали время свечения жёлтого (и мигающего зелёного) равным 5 секундам.
Код loop() разделён на 2 фазы в которых выполняются следующие действия:
- Вызов функций
set()для светофоров которым требуется запретить движение прямоTL_FORWARD_OFF. - Задержка
delay()на время свечения мигающего зелёного сигнала (5 сек). - Вызов функции
set()для светофоров которым требуется разрешить движение прямоTL_FORWARD_ON. - Задержка
delay()на время свечения жёлтого сигнала (5 сек) + желаемая длительность текущей фазы движения машин (15 сек).
Тип перекрестка №4 (Т-образный, с секциями поворотов):
На картинке, светофор 0x0A направлен влево, светофор 0x0B направлен вниз, светофор 0x0C направлен вправо.

Алгоритм работы светофоров:
Предлагаем алгоритм при котором светофоры работают в три фазы. Для удобства описания работы, назовём левую часть дороги - "A", нижнюю часть дороги - "B" и правую часть дороги - "C". Тогда светофоры перекрёстка разрешают движение следующим образом:
- В 1 фазе: между дорогам "A" и "B" в обоих направлениях, дополнительно от "B" к "C".
- В 2 фазе: между дорогами "C" и "B" в обоих направлениях, дополнительно от "C" к "A".
- В 3 фазе: между дорогами "A" и "C" в обоих направлениях, дополнительно от "A" к "B".
Реализуется данный алгоритм следующим образом:
![]() |
|
![]() |
|
![]() |
|
Алгоритм переключения сигналов от зелёного к красному и от красного к зелёному указан в разделе «Последовательность переключения сигналов светофора» данной статьи.
Скетч:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с 3 светофором, указав его адрес на шине I2C (0x0C).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_FR, SECTION_R ); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и направо (TRACK_FR), светофор оснащён секцией правого поворота (SECTION_R ).
tl_B.begin(MODUL_TLIGHT, TRACK_LR, SECTION_LR); // Инициируем работу со светофором указав что на его перекрёстке есть дорога налево и направо (TRACK_LR), светофор оснащён двумя секциями поворота (SECTION_LR).
tl_C.begin(MODUL_TLIGHT, TRACK_FL, SECTION_L ); // Инициируем работу со светофором указав что на его перекрёстке есть дорога прямо и налево (TRACK_FL), светофор оснащён секцией левого поворота (SECTION_L ).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_B.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_C.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
// Определяем начальное состояние: //
tl_A.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "A".
tl_B.set(TL_FORWARD_OFF, TL_LEFT_ON, TL_RIGHT_ON); // Запрещаем движение прямо и разрешаем повороты влево и вправо на светофоре "B".
} //
//
void loop(){ //
// ================================== // =============================================================================
// Фаза 1: // Было: "A"-зелёный и стрелка направо, "B"-красный , "C"-зелёный.
// Станет: "A"-красный и стрелка направо, "B"-красный и обе стрелки, "C"-красный.
// Нужно: "A"-переключить на красный , "B"-включить обе стрелки , "C"-переключить на красный.
// ----------------1----------------- //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "A".
tl_C.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении светофора "C".
delay(3000); // В течении 3 секунд на светофорах "A" и "C" будет мигать зелёный.
// ----------------2----------------- //
delay(3000); // В течении 3 секунд на светофорах "A" и "C" будет светиться жёлтый.
// ----------------3----------------- //
tl_B.set(TL_LEFT_ON, TL_RIGHT_ON); // Разрешаем повороты влево и вправо на светофоре "B". Стрелки включатся сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 2: // Было: "A"-красный и стрелка направо, "B"-красный и обе стрелки , "C"-красный.
// Станет: "A"-красный , "B"-красный и стрелка направо, "C"-зелёный и стрелка налево.
// Нужно: "A"-выключить стрелку направо, "B"-выключить стрелку налево , "C"-переключить на зелёный и включить стрелку налево.
// ----------------1----------------- //
tl_A.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "A".
tl_B.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "B".
delay(3000); // В течении 3 секунд на светофорах "A" и "B" будут мигать отключаемые стрелки.
// ----------------2----------------- //
tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "C".
delay(3000); // В течении 3 секунд на светофоре "C" будет светиться красный с жёлтым.
// ----------------3----------------- //
tl_C.set(TL_LEFT_ON); // Разрешаем поворот влево на светофоре "C". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 3: // Было: "A"-красный , "B"-красный и стрелка направо, "C"-зелёный и стрелка налево.
// Станет: "A"-зелёный и стрелка направо , "B"-красный , "C"-зелёный.
// Нужно: "A"-переключить на зелёный и включить стрелку направо, "B"-выключить стрелку направо, "C"-выключить стрелку налево.
// ----------------1----------------- //
tl_B.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "B".
tl_C.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "C".
delay(3000); // В течении 3 секунд на светофорах "B" и "C" будут мигать отключаемые стрелки.
// ----------------2----------------- //
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "A".
delay(3000); // В течении 3 секунд на светофоре "A" будет светиться красный с жёлтым.
// ----------------3----------------- //
tl_A.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "A". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
} //
В коде setup() выполняются следующие действия:
- Это первый скетч в котором при обращении к функции
begin(), в качестве третьего параметра указывается наличие дополнительных секций поворота:SECTION_L- есть секция поворота влево,SECTION_R- есть секция поворота вправо,SECTION_LR- есть обе секции поворота. - При обращении к функции
timing()мы задали время свечения жёлтого (и мигающего зелёного) равным 3 секундам. - В конце кода
setup()выполнено обращение к функцииset()для установки цветов необходимых для корректной работы циклаloop()при его первом проходе.
Код loop() разделён на 3 фазы в которых выполняются по 3 действия:
- Действие №1 - запрет движения для любых направлений:
- Вызов функции
set()для светофоров которым требуется запретить движение прямоTL_FORWARD_OFF, влевоTL_LEFT_OFF, вправоTL_RIGHT_OFF. - Задержка
delay()на время свечения мигающего зелёного сигнала. - Действие №2 - разрешение движения в прямом направлении:
- Вызов функции
set()для светофоров которым требуется разрешить движение прямоTL_FORWARD_ON. - Задержка
delay()на время свечения жёлтого сигнала. - Действие №3 - включение секций поворотов:
- Вызов функции
set()для светофоров которым требуется разрешить движение влевоTL_LEFT_ON, вправоTL_RIGHT_ON(стрелки поворотов включаются сразу, без задержек). - После выполнения всех действий, на светофорах перекрёстка установлены требуемые сигналы. Осталось приостановить выполнение скетча функцией
delay()на желаемую длительность текущей фазы движения машин.
Обратите внимание на то, что в 1 фазе нет команд на разрешение движений в прямом направлении, поэтому задержка между запретом движения и разрешением поворотов равна двум периодам свечения жёлтого сигнала.
Тип перекрестка №5 (Х-образный, с секциями поворотов):
На картинке, светофор 0x0A направлен влево, светофор 0x0B направлен вниз, светофор 0x0C направлен вправо, светофор 0x0D направлен вверх.

Алгоритм работы светофоров:
Движение на данном перекрёстке в любых направлениях можно организовать за 4 фазы работы светофоров, но мы предлагаем алгоритм при котором светофоры работают за 8 фаз. В предложенном алгоритме каждый светофор разрешает движение: только прямо, только вправо, прямо и налево, во всех направлениях.
Для удобства описания работы, назовём левую часть дороги - "A", нижнюю - "B", правую - "C", верхнюю - "D". Тогда светофоры перекрёстка разрешают движение следующим образом:
- В 1 фазе: между дорогами "A" и "B" в обоих направлениях, дополнительно от "B" к "C" и "D".
- В 8 фазе: между дорогами "B" и "C" в обоих направлениях, дополнительно от "C" к "A" и "D".
- В 4 фазе: между дорогами "C" и "D" в обоих направлениях, дополнительно от "D" к "A" и "B".
- В 5 фазе: между дорогами "D" и "A" в обоих направлениях, дополнительно от "A" к "B" и "C".
- В 6 фазе: между дорогами "A" и "C" в обоих направлениях, дополнительно от "A" к "B".
- В 7 фазе: между дорогами "A" и "C" в обоих направлениях, дополнительно от "C" к "D".
- В 2 фазе: между дорогами "B" и "D" в обоих направлениях, дополнительно от "B" к "C".
- В 3 фазе: между дорогами "B" и "D" в обоих направлениях, дополнительно от "D" к "A".
Реализуется данный алгоритм следующим образом:
![]() |
|
![]() |
|
![]() |
|
![]() |
|
|
Алгоритм переключения сигналов от зелёного к красному и от красного к зелёному указан в разделе «Последовательность переключения сигналов светофора» данной статьи.
Скетч:
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы.
iarduino_I2C_Track tl_A(0x0A); // Создаём объект tl_A для работы с 1 светофором, указав его адрес на шине I2C (0x0A).
iarduino_I2C_Track tl_B(0x0B); // Создаём объект tl_B для работы с 2 светофором, указав его адрес на шине I2C (0x0B).
iarduino_I2C_Track tl_C(0x0C); // Создаём объект tl_C для работы с 3 светофором, указав его адрес на шине I2C (0x0C).
iarduino_I2C_Track tl_D(0x0D); // Создаём объект tl_D для работы с 4 светофором, указав его адрес на шине I2C (0x0D).
//
void setup(){ //
tl_A.begin(MODUL_TLIGHT, TRACK_LFR, SECTION_LR); // Инициируем работу с 4 светофорами,
tl_B.begin(MODUL_TLIGHT, TRACK_LFR, SECTION_LR); // указав что на перекрёстках есть дорога
tl_C.begin(MODUL_TLIGHT, TRACK_LFR, SECTION_LR); // влево, прямо и направо (TRACK_LFR), и каждый
tl_D.begin(MODUL_TLIGHT, TRACK_LFR, SECTION_LR); // светофор оснащён стрелками влево, и вправо (SECTION_LR).
tl_A.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_B.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_C.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_D.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: "IARDUINO".
tl_A.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_B.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_C.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_D.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50%.
tl_A.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_B.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_C.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
tl_D.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3сек.
// Определяем начальное состояние: //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение прямо на светофоре "A".
tl_B.set(TL_FORWARD_OFF, TL_RIGHT_ON); // Запрещаем движение прямо на светофоре "B", но разрешаем поворот вправо.
tl_D.set(TL_FORWARD_OFF); // Запрещаем движение прямо на светофоре "D".
} //
//
void loop(){ //
// ================================== // =============================================================================
// Фаза 1: // Было: "A" X-X-X , "B" X-X-> , "C" <-^-> , "D" X-X-X.
// Станет: "A" X-X-> , "B" <-^-> , "C" X-X-X , "D" X-X-X.
// Нужно: "A"-включить стрелку направо, "B"-переключить на зелёный и включить стрелку налево, "C"-переключить на красный и отключить обе стрелки, "D"-оставить без изменений.
// ----------------1----------------- //
tl_C.set(TL_FORWARD_OFF, TL_LEFT_OFF, TL_RIGHT_OFF); // Запрещаем движение в прямом направлении и оба поворота на светофоре "C".
delay(3000); // В течении 3 секунд на светофоре "C" будут мигать отключаемые стрелки и основной зелёный.
// ----------------2----------------- //
tl_B.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "B".
delay(3000); // В течении 3 секунд на светофоре "B" будет светиться красный с жёлтым.
// ----------------3----------------- //
tl_A.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "A". Стрелка включается сразу.
tl_B.set(TL_LEFT_ON); // Разрешаем поворот влево на светофоре "B". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 2: // Было: "A" X-X-> , "B" <-^-> , "C" X-X-X , "D" X-X-X.
// Станет: "A" X-X-X , "B" X-^-> , "C" X-X-X , "D" X-^-X.
// Нужно: "A"-отключить стрелку направо, "B"-отключить стрелку налево, "C"-оставить без изменений, "D"-переключить на зелёный.
// ----------------1----------------- //
tl_A.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "A".
tl_B.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "B".
delay(3000); // В течении 3 секунд на светофорах "A" и "B" будут мигать отключаемые стрелки.
// ----------------2----------------- //
tl_D.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "D".
delay(3000); // В течении 3 секунд на светофоре "D" будет светиться красный с жёлтым.
// ----------------3----------------- //
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 3: // Было: "A" X-X-X , "B" X-^-> , "C" X-X-X , "D" X-^-X.
// Станет: "A" X-X-X , "B" X-^-X , "C" X-X-X , "D" X-^->.
// Нужно: "A"-оставить без изменений, "B"-отключить стрелку направо, "C"-оставить без изменений, "D"-включить стрелку направо.
// ----------------1----------------- //
tl_B.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "B".
delay(3000); // В течении 3 секунд на светофоре "B" будет мигать отключаемая стрелка.
// ----------------2----------------- //
delay(3000); // В данной фазе нет переключений светофоров на разрешающий сигнал в прямом направлении.
// ----------------3----------------- //
tl_D.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "D". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 4: // Было: "A" X-X-X , "B" X-^-X , "C" X-X-X , "D" X-^->.
// Станет: "A" X-X-X , "B" X-X-X , "C" X-X-> , "D" <-^->.
// Нужно: "A"-оставить без изменений, "B"-переключить на красный, "C"-включить стрелку направо, "D"-включить стрелку налево.
// ----------------1----------------- //
tl_B.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении на светофоре "B".
delay(3000); // В течении 3 секунд на светофоре "B" будет мигать зелёный.
// ----------------2----------------- //
delay(3000); // В данной фазе нет переключений светофоров на разрешающий сигнал в прямом направлении.
// ----------------3----------------- //
tl_C.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "C". Стрелка включается сразу.
tl_D.set(TL_LEFT_ON); // Разрешаем поворот влево на светофоре "D". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 5: // Было: "A" X-X-X , "B" X-X-X , "C" X-X-> , "D" <-^->.
// Станет: "A" <-^-> , "B" X-X-X , "C" X-X-X , "D" X-X->.
// Нужно: "A"-переключить на зелёный и включить обе стрелки, "B"-оставить без изменений, "C"-отключить стрелку направо, "D"-переключить на красный и отключить стрелку налево.
// ----------------1----------------- //
tl_C.set(TL_RIGHT_OFF); // Запрещаем поворот направо на светофоре "C".
tl_D.set(TL_FORWARD_OFF, TL_LEFT_OFF); // Запрещаем движение в прямом направлении и поворот влево на светофоре "D".
delay(3000); // В течении 3 секунд на светофорах "C" и "D" будут мигать отключаемые зелёные сигналы.
// ----------------2----------------- //
tl_A.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "A".
delay(3000); // В течении 3 секунд на светофоре "A" будет светиться красный с жёлтым.
// ----------------3----------------- //
tl_A.set(TL_LEFT_ON, TL_RIGHT_ON); // Разрешаем повороты влево и вправо на светофоре "A". Стрелки включатся сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 6: // Было: "A" <-^-> , "B" X-X-X , "C" X-X-X , "D" X-X->.
// Станет: "A" X-^-> , "B" X-X-X , "C" X-^-X , "D" X-X-X.
// Нужно: "A"-отключить стрелку налево, "B"-оставить без изменений, "C"-переключить на зелёный, "D"-отключить стрелку направо.
// ----------------1----------------- //
tl_A.set(TL_LEFT_OFF); // Запрещаем поворот влево на светофоре "A".
tl_D.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "D".
delay(3000); // В течении 3 секунд на светофорах "A" и "D" будут мигать отключаемые стрелки.
// ----------------2----------------- //
tl_C.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении светофора "C".
delay(3000); // В течении 3 секунд на светофоре "C" будет светиться красный с жёлтым.
// ----------------3----------------- //
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 7: // Было: "A" X-^-> , "B" X-X-X , "C" X-^-X , "D" X-X-X.
// Станет: "A" X-^-X , "B" X-X-X , "C" X-^-> , "D" X-X-X
// Нужно: "A"-отключить стрелку направо, "B"-оставить без изменений, "C"-включить стрелку направо, "D"-оставить без изменений.
// ----------------1----------------- //
tl_A.set(TL_RIGHT_OFF); // Запрещаем поворот вправо на светофоре "A".
delay(3000); // В течении 3 секунд на светофоре "A" будет мигать отключаемая стрелка.
// ----------------2----------------- //
delay(3000); // В данной фазе нет переключений светофоров на разрешающий сигнал в прямом направлении.
// ----------------3----------------- //
tl_C.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "C". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
// Фаза 8: // Было: "A" X-^-X , "B" X-X-X , "C" X-^-> , "D" X-X-X
// Станет: "A" X-X-X , "B" X-X-> , "C" <-^-> , "D" X-X-X
// Нужно: "A"-переключить на красный, "B"-включить стрелку направо, "C"-включить стрелку налево, "D"-оставить без изменений
// ----------------1----------------- //
tl_A.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении на светофоре "A".
delay(3000); // В течении 3 секунд на светофоре "A" будет мигать зелёный.
// ----------------2----------------- //
delay(3000); // В данной фазе нет переключений светофоров на разрешающий сигнал в прямом направлении.
// ----------------3----------------- //
tl_B.set(TL_RIGHT_ON); // Разрешаем поворот вправо на светофоре "B". Стрелка включается сразу.
tl_C.set(TL_LEFT_ON); // Разрешаем поворот влево на светофоре "C". Стрелка включается сразу.
delay(10000); // Ждём 10 секунд пока едут машины.
// ================================== // =============================================================================
} //
В коде setup() выполняются следующие действия:
- Как и в предыдущем скетче, при обращении к функции
begin(), в качестве третьего параметра указывается наличие дополнительных секций поворота, но в данном случае у всех светофоров есть секции двух поворотовSECTION_LR. - При обращении к функции
timing()мы задали время свечения жёлтого (и мигающего зелёного) равным 3 секундам. - В конце кода
setup()выполнено обращение к функцииset()для установки цветов необходимых для корректной работы циклаloop()при его первом проходе.
Код loop() разделён на 8 фаз в которых выполняются по 3 действия:
- Действие №1 - запрет движения для любых направлений:
- Вызов функции
set()для светофоров которым требуется запретить движение прямоTL_FORWARD_OFF, влевоTL_LEFT_OFF, вправоTL_RIGHT_OFF. - Задержка
delay()на время свечения мигающего зелёного сигнала. - Действие №2 - разрешение движения в прямом направлении:
- Вызов функции
set()для светофоров которым требуется разрешить движение прямоTL_FORWARD_ON. - Задержка
delay()на время свечения жёлтого сигнала. - Действие №3 - включение секций поворотов:
- Вызов функции
set()для светофоров которым требуется разрешить движение влевоTL_LEFT_ON, вправоTL_RIGHT_ON(стрелки поворотов включаются сразу, без задержек). - После выполнения всех действий, на светофорах перекрёстка установлены требуемые сигналы. Осталось приостановить выполнение скетча функцией
delay()на желаемую длительность текущей фазы движения машин.
Обратите внимание на то, что в 3,4,7,8 фазах нет команд на разрешение движения в прямом направлении, но задержка delay() осталась. Благодаря этой задержке выполняется сразу два условия: Запрет движения влево и вправо завершится за 1 цикл свечения жёлтого сигнала до того как осуществится включение других секций поворотов. Включение секций поворотов совпадёт с включением красного или основного зелёного сигналов светофоров.
Файлы и библиотеки
- iarduino_I2C_Track Библиотека GitHub














