Я понял, что написал руководства, описывающие, как использовать светофоры Лаборатории низкого напряжения с Raspberry Pi для Python (читать статью о Python), Java (читать статью о Java), C (читать статью на C) , Swift (прочитать статью Swift), Bash scripting (прочитать статью Bash) и Go (прочитать статью Go), Nore RED (прочитать статью Node RED), Arduino (прочитать статью Arduino), но никогда для Node.js. Node.js - отличная среда для написания современного JavaScript на Pi и имеет огромную экосистему готовых пакетов от npm, которые помогают выполнять задачи, не изобретая заново колеса. Давайте посмотрим, как мы можем использовать его для управления светодиодами светофора…

Чтобы сделать это отдельное руководство, будет повторно использоваться контент из предыдущих статей здесь.

Список покупок

Чтобы попробовать это, вам понадобится следующее (ссылки здесь в основном ведут на Adafruit, клиенты из Великобритании могут захотеть рассмотреть Pimoroni в качестве альтернативы для Великобритании, у Amazon есть большая часть, если не все, этого тоже):

  • Raspberry Pi (здесь я буду использовать Pi 3 Model B, но подойдет любая модель с контактами GPIO - если вы хотите использовать Pi Zero, вам нужно припаять к нему несколько разъемов). Я предполагаю, что у вас есть Pi 2 или 3 с 40 контактами.
  • Блок питания для вашего Pi
  • Какой-то футляр, вероятно, будет хорошей идеей для защиты Pi (но вам нужно оставить крышку закрытой, чтобы открыть контакты GPIO для подключения ваших источников света)
  • Micro SD card для установки вашей операционной системы (или получить карту с предустановленной ОС). Если вы хотите установить операционную систему самостоятельно, вам понадобится компьютер Mac, ПК или Linux с устройством чтения SD-карт.
  • Набор светофоров от Low Voltage Labs (две упаковки по хорошей цене)
  • Любая USB-клавиатура для ввода на Pi
  • Любой дисплей HDMI для отображения вывода с Pi

Крепление светофоров

Светофоры Low Voltage Labs подключаются к Pi с помощью четырех контактов. Один из них должен быть заземлен, а три других являются фактическими контактами GPIO, используемыми для управления каждым из отдельных светодиодов.

Перед включением Pi подключите светофор так, чтобы контакты подключились к контактам GPIO, выделенным красным:

Когда вы закончите, он будет выглядеть примерно так ... (простой способ убедиться, что у вас все правильно, это найти индикаторы в левом ряду контактов, когда вы смотрите на Pi с портами USB внизу, затем отсчитайте 8 булавок и прикрепите туда фары).

Пока не включайте Pi, сначала вам нужно подготовить для него образ операционной системы ...

Настройка операционной системы

Установите ОС Raspbian Stretch Lite, которую можно скачать с официального сайта Raspberry Pi. Вы также можете найти там отличное руководство по установке, если вам понадобится помощь. Я обнаружил, что бесплатный инструмент Etcher от Resin.io полезен при переносе образа операционной системы на карту micro SD.

После установки операционной системы убедитесь, что вы можете войти в систему и настроили рабочее проводное или Wi-Fi подключение к Интернету.

Теперь вы можете начинать включать и выключать свет!

Установка Node.js

Lite Raspbian не имеет предварительно установленного Node.js, так как это минимальный дистрибутив. Давайте добавим последнюю версию Node.js из NodeSource:

$ curl -sL https://deb.nodesource.com/setup_10.x|sudo -E bash -

Это добавит репозиторий Node.js 10.x и обновит список пакетов. После завершения мы можем установить Node.js (который также включает диспетчер пакетов npm):

$ sudo apt-get install -y nodejs

Теперь у нас должны быть обновленные Node.js и npm (номера версий могут отличаться):

$ node --version
v10.6.0
$ npm --version
6.1.0

Установка зависимостей

Нам также понадобится git, который не устанавливается вместе с Raspbian Lite, но его просто добавить:

$ sudo apt-get install git
$ git --version
git version 2.11.0

Программирование светофора

Для начала возьмите мой пример кода с GitHub, установите зависимости модуля и запустите его:

$ git clone https://github.com/simonprickett/nodepitrafficlights.git
$ cd nodepitrafficlights
$ npm install
$ npm start

Если индикаторы подключены к правильным контактам GPIO, они должны начать мигать в соответствии с шаблоном светофора Великобритании (красный, красный + желтый, зеленый, желтый, красный). Если вы ничего не видите, убедитесь, что фонари подключены к нужным контактам.

Для выхода нажмите Ctrl + C. При этом все индикаторы погаснут, и программа выйдет.

Как это работает

Вот краткое описание полного исходного кода, в котором используются async и await, чтобы помочь устранить традиционную пирамиду обратного вызова ...

Первое, что нужно сделать, это require модуль включения-выключения, который обрабатывает взаимодействие с контактами GPIO Pi. Строки 3–5 устанавливают объекты для каждого из трех источников света, сообщая onoff, какой контакт использовать и что они должны использоваться в качестве выходов.

Чтобы заставить Node.js ждать в течение настраиваемого времени перед изменением состояния строк, мы определяем функцию sleep в строке 7, которая принимает желаемое время сна в миллисекундах в качестве своего параметра. Эта функция возвращает обещание, которое выполняется после истечения соответствующего периода ожидания.

Строки 13–37 определяют async функцию, которая повторяется бесконечно и использует функцию writeSync модуля onoff для включения (1) или выключения (0) каждого светофора в соответствии с желаемым этапом последовательности светофора. На каждом этапе вызывается функция sleep, чтобы поддерживать свет в их текущем состоянии в течение определенного периода времени (например, 2000 миллисекунд = 2 секунды). sleep возвращает обещание, поэтому мы await его разрешение.

Строки 39–43 определяют функцию удобства, которая выключит все огни.

Строки 45–49 регистрируют функцию-обработчик для перехвата сигнала SIGINT ... этот сигнал отправляется программе всякий раз, когда пользователю надоедает наблюдать за светом, и он нажимает Ctrl + C. Функция обработчика выключает все индикаторы и полностью закрывает Node.js.

Наконец, строка 51 гарантирует, что мы всегда начинаем в правильном состоянии, выключая все источники света, а затем вызывая runLights, который будет работать в непрерывном цикле, пока пользователь не нажмет Ctrl + C, вызывая обработчик SIGINT.

Использование async, await и обещаний, а также синхронных функций, предоставляемых модулем onoff, значительно упрощает чтение кода, чем могло бы быть, и позволяет избежать глубоко вложенных обратных вызовов.

Исходный код этого проекта находится в свободном доступе на GitHub. Я хотел бы услышать, что вы делаете с Raspberry Pi, Node.js или их комбинацией. Я постараюсь написать больше, если позволит время.

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик