Моделируем двухрежимный светофор

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

Попробуем смоделировать двухрежимный светофор: изначально он будет работать как обычный (красный/желтый/зеленый), а по нажатию кнопки – переходить в режим мигающего желтого и обратно.

{Врезка|Содержание=Принципиальная схема нашего светофора.|Ширина=300px}}

Соберите схему, как показано на рисунке (резисторы нужны для устранения дребезга контактов и ограничения тока на светодиодах). После этого создайте нижеследующий программный код, взяв за основу предыдущий проект. Помните, что персонаж Catenary жизненно необходим, и удалять его нельзя.

Разберем алгоритм, который мы применили при создании модели. После инициализации задаются режимы (^pinMode) контактов: мы будем использовать цифровые контакты 10, 11 и 12 для управления светодиодами (зеленым, желтым и красным, соответственно) и цифровой контакт под номером 2 как вход кнопки.

Считывание данных с кнопки происходит через сенсор Pin2. Если его нет в выпадающем списке сенсоров (синяя вкладка Сенсоры), запустите только что набранный код. Как только сенсор фиксирует нажатие, мы изменяем состояние state на противоположное.

После старта мы входим в бесконечный цикл, в котором, в зависимости от значения переменной state, реализуем или дневной режим светофора (state = 0) или ночной («мигалка» – state = 1).

Три переменных (green, red и yellow) определяют, включен ли светодиод соответствующего цвета. Три блока, в зависимости от значения переменных, передают на плату соответствующие уровни для цифровых контактов (high и low).

Вы можете красиво оформить данную модель, сделав реальный светофор, а также доработать программу, обеспечив правильное переключение света – то есть добавив возможность одновременного включения красного и желтого перед зеленым и наоборот. Также можно поэкспериментировать и с задержками сигналов светофора.

Материал взят из раздела "Школа Linux Format" №132