Шлагбаум — это специальное устройство, предназначенное для контроля проезда транспорта. В данной статье шлагбаум устанавливается вместе со светофором, назначение сигналов которого доступно в следующих разделах: автоматический светофор и светофор с внешним управлением.
Инструкция по сборке шлагбаума
1. Установите блок светофора на стойку-основание.
![](http://iarduino.ru/img/upload/66b90d3a6176da75e487ba0e073e8ab7.png)
2. В случае, если Вы используете шлагбаум без модуля питания, соедините детали при помощи крепежа, винтов и гаек с правой стороны.
Если же Вы используете модуль питания, прикрутите его с правой стороны.
![](http://iarduino.ru/img/upload/de0684b08ea6dda69f83ef4c4ff9d1f2.png)
3. Соедините крестовину, как показано на рисунке.
![](http://iarduino.ru/img/upload/fb52f66c76e65fdd0b741fff65d0f713.png)
4. Установите собранное основание на крестовину.
![](http://iarduino.ru/img/upload/4a8a11c5f95a6e5881208a3de3a72de3.png)
5. Установите сервопривод между двумя элементами, скрепив их винтами.
![](http://iarduino.ru/img/upload/8c24342cf86af795d3ab7060cb2c054b.png)
6. Закрепите винтами блок шлагбаума. Также закрепите винтом нижнюю часть основания (см. рисунок).
![](http://iarduino.ru/img/upload/dd66cb035e4ed07d4b42239745d1ee3a.png)
7. Соедините вместе части шлагбаума, как показано на рисунке, при помощи винтов и гаек.
![](http://iarduino.ru/img/upload/f8be844efe72364480aa18e11938a7df.png)
8. Закрепите насадку сервопривода на шлагбауме с обратной стороны. На втором и третьем видах рисунка показан результат спереди и сверху.
![](http://iarduino.ru/img/upload/cb17568be6773118cd102e8337cc52df.png)
9. Подключите сервопривод к колодке с надписью «СЕРВО». Закрепите шлагбаум на валу сервопривода при помощи шурупа.
Во избежание порчи сервопривода, мы рекомендуем перед креплением к нему шлагбаума загрузить скетч и дождаться установки вала сервопривода в положение, при котором шлагбаум будет располагаться горизонтально, и только после этого установить шлагбаум (предварительно выключив питание).
![](http://iarduino.ru/img/upload/a3bd26e7bd1f4600b459672ff811eda1.png)
Схема установки шлагбаума на трассе
![](http://iarduino.ru/img/upload/901e66c0f8982b71b38788573f2d57c7.png)
Мы предполагаем, что шлагбаум устанавливается перпендикулярно дороге, а его наличие фиксируется ультразвуковым датчиком расстояния (левая часть рисунка). В этом случае центр модуля-шлагбаума устанавливается таким образом, чтобы круглая часть шлагбаума (с надписью «STOP» располагалась над линией трассы. Обращаем внимание, что в данном случае ИК-сигнал не будет фиксироваться автомобилем.
Также возможен вариант установки аналогично всем остальным знакам — под углом 45° относительно линии движения автомобиля. Угол распространения ИК-данных составляет около 80°, а дальность передачи ИК данных настраивается поворотом крестовины резистора на обратной стороне платы основания. В данном случае центр модуля-шлагбаума должен находиться в 15 см от линии трассы.
Первое включение и настройка шлагбаума:
После сборки шлагбаума, его требуется подключить к Piranha UNO по шине I2C, как указано ниже:
![](http://iarduino.ru/img/upload/f82122932ceca70fc7a8d046f77136c8.png)
Сверху изображено подключение к Piranha UNO напрямую, а ниже — через Trema Shield.
После подключения модуля к шине I2C, его нужно настроить на работу в качестве светофора с установленным шлагбаумом.
Данные, отправляемые светофором по ИК-каналу, содержат не только информацию о его цветах и состоянии шлагбаума. Они также включают информацию о типе регулируемого им перекрёстка, наличии секций поворота и наличии шлагбаума. Эта информация указывается при инициализации модуля функцией begin()
, которая может принимать до 3 параметров:
Параметры функции begin():
Назначение: | Возможные значения: |
---|---|
1 параметр определяет тип модуля |
![]() MODUL_TLIGHT — модуль является светофором; |
![]() MODUL_TLIGHT_AUTO — светофор с автопереключением цветов; | |
2 параметр определяет тип перекрёстка |
![]() TRACK_F — на светофоре есть дорога только прямо; |
![]() TRACK_FL — на светофоре есть дорога прямо и налево; | |
![]() TRACK_FR — на светофоре есть дорога прямо и направо; | |
![]() TRACK_LR — на светофоре есть дорога налево и направо; | |
![]() TRACK_LRF — на светофоре есть дорога прямо, налево и направо; | |
Буквы L (left), R (right), F (forward) можно указывать в любом порядке; |
|
3 параметр определяет наличие секций если нет секций и нет шлагбаума, то параметр не указывается |
![]() SECTION_L — у светофора есть секция левого поворота; |
![]() SECTION_R — у светофора есть секция правого поворота; | |
![]() SECTION_G — у светофора есть шлагбаум; | |
![]() SECTION_LR — есть секции левого и правого поворота; | |
![]() SECTION_LG — есть секция левого поворота и шлагбаум; | |
![]() SECTION_RG — есть секция правого поворота и шлагбаум; | |
![]() SECTIONT_LRG — есть обе секции поворота и шлагбаум; | |
Буквы L (left), R (right), G (gate) можно указывать в любом порядке; |
|
Пример инициализации | begin(MODUL_TLIGHT_AUTO , TRACK_F , SECTION_G );модуль инициирован как светофор, автоматически переключающий цвета, регулирующий проезд по дороге с движением только прямо, светофор оснащён шлагбаумом. |
Пример работы светофора со шлагбаумом в автоматическом режиме:
В автоматическом режиме шлагбаум опускается при включении красного и поднимается при включении красного с жёлтым.
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы iarduino_I2C_Track tlight; // Объявляем объект tlight для работы с функциями и методами библиотеки iarduino_I2C_Track // Если при объявлении объекта указать адрес, например, iarduino_I2C_Track tlight(0x09), то пример будет работать с тем модулем, адрес которого был указан void setup(){ // tlight.begin(MODUL_TLIGHT_AUTO, TRACK_F, SECTION_G); // Инициируем работу модуля в режиме светофора с автопереключением. Дорога только прямо. У светофора есть шлагбаум tlight.timing(10, 3, 5); // Указываем время свечения зелёного (10 сек), жёлтого или мигающего зелёного (3 сек) и красного (5 сек) цветов для автоматического светофора tlight.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO» tlight.indicator(true); // Разрешаем работу светодиода, информирующего об отправке данных tlight.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с паузой между пакетами, определённой ИК-протоколом по умолчанию ±50% tlight.offline(true); // Указываем модулю сохранить все полученные настройки в энергонезависимую память и работать в автономном режиме } // Отключить автономный режим можно функцией offline() с параметром false // void loop(){} //
Данный скетч можно запустить всего один раз, при наличии модуля на шине I2C. Далее светофор будет постоянно и самостоятельно переключать свои цвета, управлять шлагбаумом и передавать информацию о своём состоянии при наличии питания. Для дальнейшей работы светофора не требуется его подключение к Piranha UNO, кроме случаев, когда Вы пожелаете изменить алгоритм работы модуля. Питание модуля без подключения к Piranha UNO удобно организовать, используя батарейный отсек.
Весь код скетча находится в теле функции setup()
:
- Первой строкой кода мы обращаемся к функции
begin()
указывая, что модуль является светофором, который должен автоматически переключать цветаMODUL_TLIGHT_AUTO
. Он регулирует движение через переход или переезд с дорогой только прямоTRACK_F
(Forward), и у модуля есть шлагбаумSECTION_G
(Gate). - Обращением к функции
timing()
задаются временные интервалы свечения зелёного, жёлтого (и мигающего зелёного) и красного цветов светофора в секундах. - Функция
irProtocol()
позволяет назначить протокол для передачи данных по ИК-каналу. В скетче используется протоколIR_IARDUINO
. - Функция
indicator()
позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметромtrue
, разрешая работу индикаторного светодиода. Если вместоtrue
указатьfalse
, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных. - Функция
irAutoSend()
указывает модулю начать постоянную отправку пакетов данных с информацией о текущем состоянии светофора и шлагбаума. Если в качестве параметра указать число от 15 до 255 мс, то средняя пауза между отправляемыми по ИК-каналу пакетами будет равна указанному числу миллисекунд. В скетче функция вызвана без параметра, значит, средняя пауза между пакетами будет установлена в значение по умолчанию для выбранного протокола. Реальная пауза между отправляемыми пакетами устанавливается хаотично в диапазоне ±50% от указанного числа, что позволяет поставить знаки дорожного движения рядом со светофором, в одном направлении. - Функция
offline()
с параметромtrue
указывает модулю запомнить полученные настройки, сохранив их в энергонезависимую память. После этого модуль будет работать автономно (сразу после подачи питания), даже если он не подключён к Piranha UNO по шине I2C, так, как будто он вновь получил все команды кодаsetup()
. Для отключения автономного режима достаточно однократного обращения к функцииoffline()
с параметромfalse
.
Управление светофорами со шлагбаумом по шине I2C:
Важно: при управлении несколькими модулями, подключёнными к одной шине I2C, всем модулям необходимо предварительно задать разные адреса.
Для этого воспользуйтесь скетчем из меню Arduino IDE:
Файл / Примеры / iarduino I2C Track (модуль трассы) / NewAddress
Если модуль инициирован как светофор со шлагбаумом (без автоматического переключения цветов), то управление светофором и шлагбаумом осуществляется обращением к функции set()
в ручном или полуавтоматическом режиме. В первом случае Вы самостоятельно управляете каждым цветом светофора и состоянием шлагбаума, во втором — указываете разрешить или запретить движение в заданном направлении.
Параметры функции set():
Для управления каждым цветом светофора (ручное управление) функция SET()
вызывается с указанием от одной до семи пар параметров:
Назначение: | Возможные значения: |
---|---|
1 параметр пары указывает секцию для управления |
TL_RED — красный сигнал светофора; |
TL_YELLOW — жёлтый сигнал светофора; | |
TL_GREEN — зелёный сигнал светофора; | |
TL_RIGHT — стрелка светофора направо; | |
TL_LEFT — стрелка светофора налево; | |
TL_BEEP — звуковой сигнал шлагбаума; | |
TL_GATE — шлагбаум; | |
TL_ALL — все цвета, стрелки, звуковой сигнал и шлагбаум; | |
2 параметр пары указывает новое состояние для выбранной секции |
0 или false — отключить (или открыть шлагбаум); |
1 или true — включить (или закрыть шлагбаум); | |
2 — мигать с частотой 1 Гц; | |
Пример ручного управления | set(TL_GREEN, false , TL_RED, true , TL_GATE, true , TL_BEEP, 2 );Функция вызвана с четырьмя парами параметров, которые указывают: зелёный отключить, красный включить, шлагбаум закрыть, звук — звучать прерывисто, состояния остальных секции светофора останутся без изменений. Указанные значения моментально отражаются на состоянии светофора. Пары параметров можно указывать в любой комбинации. |
Для запрета или разрешения движения в заданном направлении (полуавтоматический режим) функция set()
вызывается с указанием от 1 до 3 параметров:
Направление: | Действие: |
---|---|
Основные секции | TL_FORWARD_ON — переключиться на разрешение движения; |
TL_FORWARD_OFF — переключиться на запрет движения; | |
Секция налево | TL_LEFT_ON — разрешить движение; |
TL_LEFT_OFF — переключиться на запрет движения; | |
Секция направо | TL_RIGHT_ON — разрешить движение; |
TL_RIGHT_OFF — переключиться на запрет движения; | |
Пример полуавтоматического управления | set(TL_FORWARD_ON , TL_RIGHT_OFF );Функция вызвана с двумя параметрами, которые указывают: переключиться на разрешение движения основными секциями, переключиться на запрет движения направо, состояние левой секции светофора останется без изменений. Переключение сигналов (включение жёлтого, мигание зелёным) осуществляется модулем самостоятельно. Параметры можно указывать в любой последовательности. |
У функции set()
нет параметра для управления шлагбаумом в полуавтоматическом режиме. В этом режиме он автоматически открывается (при разрешении движения прямо, налево или направо) и закрывается при запрете движения прямо, если запрещено движение налево и направо.
Функция допускает комбинировать параметры ручного и полуавтоматического управления.
Вы сами решаете, как Вам легче управлять светофором и шлагбаумом. Ниже представлены примеры ручного и полуавтоматического управления двумя светофорами со шлагбаумами.
Пример управления светофором со шлагбаумами в ручном режиме:
В данном примере светофор настроен на регулировку движения через переход или переезд, на котором есть дорога только в прямом направлении. Светофор оснащен шлагбаумом, и у него нет дополнительных секций поворотов. Зелёный сигнал основного направления будет светиться в течение 10 секунд. Жёлтый сигнал и мигающий зелёный будут светиться 3 секунды, а красный сигнал — 5 секунд. Шлагбаум будет закрыт в течение 5 секунд, пока светится только красный сигнал светофора.
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы iarduino_I2C_Track a(0x09); // Создаём объект «a», для работы со светофором, указав его адрес на шине I2C (0x09) // void setup(){ // a.begin(MODUL_TLIGHT, TRACK_F, SECTION_G); // Инициируем работу со светофором (MODUL_TLIGHT), указав, что на его перекрёстке есть дорога только прямо (TRACK_F), светофор оснащён шлагбаумом (SECTION_G) a.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO» a.indicator(true); // Разрешаем работу светодиода, информирующего об отправке данных a.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50% a.set(TL_ALL,0); a.set(TL_GREEN,1); // Устанавливаем начальное состояние светофора (горит только зелёный) delay(10000); // Ждём 10 секунд } // // void loop(){ // // Фаза 1: (запрещаем проезд) // Горел только зелёный, и был открыт шлагбаум a.set(TL_GREEN,2); // Мигаем зелёным (светится только зелёный, мигая) delay(3000); // Ждём 3 секунды a.set(TL_GREEN,0, TL_YELLOW,1); // Отключаем зелёный, включаем жёлтый (горит только жёлтый) delay(3000); // Ждём 3 секунды a.set(TL_YELLOW,0, TL_RED,1, TL_GATE,1, TL_BEEP,2); // Отключаем жёлтый, включаем красный, закрываем шлагбаум, включаем прерывистый звук (горит только красный) delay(5000); // Ждём 5 секунд // Фаза 2: (разрешаем проезд) // Горел только красный, и был закрыт шлагбаум a.set(TL_YELLOW,1, TL_GATE,0, TL_BEEP,0); // Включаем жёлтый, открываем шлагбаум, отключаем звук (горит красный и жёлтый) delay(3000); // Ждём 3 секунды a.set(TL_GREEN,1, TL_YELLOW,0, TL_RED,0); // Включаем зелёный, отключаем жёлтый и красный (горит только зелёный) delay(10000); // Ждём 10 секунд } //
Пример управления светофором, оснащённым шлагбаумом, в полуавтоматическом режиме:
Данный пример отличается от предыдущего только параметрами обращения к функции set()
и наличием функции timing()
. Светофор данного примера будет работать как светофор предыдущего примера.
#include <iarduino_I2C_Track.h> // Подключаем библиотеку для работы с модулем трассы iarduino_I2C_Track a(0x09); // Создаём объект «a» для работы со светофором, указав его адрес на шине I2C (0x09) // void setup(){ // a.begin(MODUL_TLIGHT, TRACK_F, SECTION_G); // Инициируем работу со светофором (MODUL_TLIGHT), указав, что на его перекрёстке есть дорога только прямо (TRACK_F), светофор оснащён шлагбаумом (SECTION_G) a.irProtocol(IR_IARDUINO); // Указываем протокол передачи данных по ИК-каналу: «IARDUINO» a.indicator(true); // Разрешаем работу светодиода, информирующего об отправке данных a.irAutoSend(); // Указываем модулю постоянно отправлять информацию о состоянии светофора по ИК-каналу с интервалами по умолчанию ±50% a.timing(3); // Указываем время свечения жёлтого (и мигающего зелёного) сигнала светофора = 3 сек } // // void loop(){ // // Фаза 1: (запрещаем проезд) // a.set(TL_FORWARD_OFF); // Запрещаем движение в прямом направлении delay(11000); // Ждём 11 секунд. За это время светофор переключится с зелёного на мигающий зелёный, подождёт 3 секунды, переключится на жёлтый, подождёт 3 секунды, переключится на красный, который будет светиться оставшиеся 5 из 11 секунд // Фаза 2: (разрешаем проезд) // a.set(TL_FORWARD_ON ); // Разрешаем движение в прямом направлении delay(13000); // Ждём 13 секунд. За это время светофор переключится с красного на красный и жёлтый, подождёт 3 секунды и включит зелёный, который будет светиться оставшиеся 10 из 13 секунд } //
Оба представленных выше скетча выполняют одни и те же действия, но при управлении светофором в полуавтоматическом режиме модуль сам осуществляет переключение с красного на зелёный и с зелёного на красный, а также открывает и закрывает шлагбаум.
В коде setup()
обоих скетчей выполняются следующие действия:
- Обращением к функции
begin()
мы указываем, что модуль является светофоромMODUL_TLIGHT
и он регулирует дорогу с движением только прямоTRACK_F
, модуль оснащён шлагбаумомSECTION_G
. - Обращением к функции
irProtocol()
мы указываем ИК-протокол передачи данных. Для трассы лучше использоватьIR_IARDUINO
, но можно использоватьIR_SAMSUNG
илиIR_RC6
. - Функция
indicator()
позволяет управлять светодиодом, информирующем о передаче данных. В скетче функция вызвана с параметромtrue
, разрешая работу индикаторного светодиода. Если вместоtrue
указатьfalse
, то индикаторный светодиод будет выключен. Индикаторный светодиод позволяет видеть, когда модуль отправляет данные, отключение этого светодиода не отключает передачу данных. - Обращением к функции
irAutoSend()
мы заставляем модуль самостоятельно постоянно отправлять данные о состоянии светофора по ИК-каналу. - В первом скетче выполнено обращение к функции
set()
для установки начального состояния светофора (горит только зелёный). Это требуется для корректной работы светофора при первом проходе циклаloop()
. - Во втором скетче выполнено обращение к функции
timing()
, которой мы указали длительность свечения жёлтого и мигающего зелёного, равной трём секундам. Это требуется, так как в полуавтоматическом режиме модуль включает данные цвета без нашего участия. В первом скетче функцияtiming()
не вызывалась, так как в ручном режиме мы сами задавали задержки после включения жёлтого и мигающего зелёного сигнала.
В коде loop()
обоих скетчей выполняются обращения к функциям set()
и delay()
.
- В первом скетче функции
set()
передаются пары параметров для управления теми секциями, состояние которых требуется изменить, включая шлагбаум и звук. - Во втором скетче функция
set()
вызывается с одним параметром, указывающим разрешить или запретить движение в прямом направлении.
Как видно из примеров, второй скетч выглядит более компактно и читаемо.
Пример получения данных от светофора на стороне приёмника:
Получение данных, отправленных светофором по ИК-каналу, осуществляется при помощи Trema модуля ИК-приёмник/передатчик, Flash-I2C.
#include <iarduino_I2C_IR.h> // Подключаем библиотеку для работы с Trema модулями ИК-приёмник/передатчик I2C-flash iarduino_I2C_IR ir(0x09); // Объявляем объект ir для работы с функциями и методами библиотеки iarduino_I2C_IR, указывая адрес модуля на шине I2C // Если объявить объект без указания адреса (iarduino_I2C_IR ir;), то адрес будет найден автоматически void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек ir.begin(); // Инициируем работу с ИК-приёмником/передатчиком I2C-flash ir.setProtocol(IR_IARDUINO); // Указываем протокол для приёма/передачи данных по ИК-каналу } // // void loop(){ // // Если приняты ИК-данные: // if( ir.check(true) ){ // Если принят пакет данных или пакет повтора // Если устройство, отправившее данные, является светофором: if( ir.device==MODUL_TLIGHT ){ // Если устройство отправившее данные является светофором Serial.print("Светофор: регулирует "); // // Выводим направления дорог перекрёстка: // Serial.print("перекрёсток с проездом "); // if( ir.track_L ){Serial.print("налево, " );} // Если track_L равен true, значит, на перекрёстке есть поворот налево if( ir.track_F ){Serial.print("прямо, " );} // Если track_F равен true, значит, на перекрёстке есть движение прямо if( ir.track_R ){Serial.print("направо, ");} // Если track_R равен true, значит, на перекрёстке есть поворот направо // Выводим состояние светофора: // Serial.print("сигналы светофора "); // if( !ir.left && !ir.forvard && !ir.right ){ // Если left и forvard и right равны 0, значит, Serial.print("запрещают движение, "); // светофор запрещает движение в любом направлении }else{ // Serial.print("разрешают движение "); // } // if( ir.left ){Serial.print("налево, " );} // Если left больше 0, значит, светофор разрешает поворот налево if( ir.forvard ){Serial.print("прямо, " );} // Если forvard больше 0, значит, светофор разрешает движение прямо if( ir.right ){Serial.print("направо, ");} // Если right больше 0, значит, светофор разрешает поворот направо Serial.print("шлагбаум "); // if( ir.gate ){Serial.print("поднят." );} // Если gate больше 0, значит, шлагбаум поднят, разрешая движение else {Serial.print("опущен." );} // Serial.println(""); // } // } // } //
Действия, выполняемые в коде Setup()
:
- Первой строкой выполняется инициализация передачи данных в монитор последовательного порта
Serial.begin()
на скорости9600
бит/сек. - Далее выполняется инициализация работы с модулем ИК-приёмник/передатчик
begin()
. - Последняя строка указывает ИК-протокол приёма/передачи данных
setProtocol()
. Протоколы светофора и приёмника должны совпадать. В скетче используется протоколIR_IARDUINO
.
Действия, выполняемые в коде loop()
:
- В первой строке выполняется проверка наличия принятых по ИК-каналу данных. Для проверки наличия данных, полученных от модулей трассы, обращение к функции
check()
должно выполняться с параметромtrue
(в этом случае функция реагирует на пакеты повторов). - Второй строкой кода выполняется проверка принятых данных на принадлежность к модулям светофоров. Если ИК-данные приняты от модулей светофоров, то переменная
device
содержит константуMODUL_TLIGHT
. - Если обе проверки успешно пройдены, то информацию о состоянии светофора можно получить из переменных:
- bool
track_F
— флаг, указывающий о наличии дороги прямо (0 — нет, 1 — есть); - bool
track_R
— флаг, указывающий о наличии поворота направо (0 — нет, 1— есть); - bool
track_L
— флаг, указывающий о наличии поворота налево (0 — нет, 1— есть); - uint8_t
forvard
— разрешает движения прямо (0 — нельзя, 1 — можно, 2 — если нет помех); - uint8_t
right
— разрешает движения направо (0 — нельзя, 1— можно, 2 — если нет помех); - uint8_t
left
— разрешает движения налево (0 — нельзя, 1— можно, 2 — если нет помех); - uint8_t
gate
— флаг состояния шлагбаума (0 — закрыт, 1 — открыт). - Биты состояний всех цветов светофора и состояния шлагбаума можно прочитать из байта команды ИК-устройства
command
. - Если переменные
forvard
,right
илиleft
имеют значение 2 (если нет помех), значит, светофор «сломан» (постоянно мигает жёлтый) или разрешается поворот налево по основному зелёному сигналу светофора, у которого нет секции поворота налево.
- bool
- В данном скетче сначала выводятся все возможные направления движения на перекрёстке:
track_F
,track_R
,track_L
. Знание дорог перекрёстка позволяет выбрать направление движения автомобиля и включить поворотники до въезда на перекрёсток. - А затем выводятся направления, в которых светофор разрешает движение:
forvard
,right
,left
. Знание состояния светофора позволяет остановиться до появления сигнала, разрешающего движение в выбранном направлении. - В конце кода выводится состояние шлагбаума
gate
.
Обсуждение