Node.js + RPi + IKEA = Трофейное освещение

  1. сборочный
  2. Управление Node.js контактами RPi GPIO
  3. Взаимодействие вне браузера
  4. Вопрос

Сочетая мою любовь к освещению и мебели IKEA с необходимостью найти новый способ возиться с Raspberry Pi, мы создали встроенный светильник с дистанционным управлением.

Что я использовал:

  • EXPEDIT стеллаж
  • DIODER Светодиодные полосы (4 шт)
  • Fixa , 114-элементный кабель управления
  • Raspberry Pi Серия Б
  • PowerTail Switch II , оптоизолированное реле 120 В, принимающее от 3 В до 12 В для простого управляющего входа для активации переключателя.
  • У меня также есть макет, перемычки и набор для затяжки / кабеля GPIO, который поставляется с Adafruit. Raspberry Pi Starter Pack , но не нужны, если у вас есть другой способ подключения выводов GPIO к внешнему компоненту.

сборочный

сборочный

ИКЕА, как всегда, предоставила восхитительный инструкции для ЭКСПЕДИТА. А если серьезно, этот стеллаж на самом деле очень прост в сборке IKEA и выглядит великолепно; Я очень рекомендую это. После сборки я начал с установки по одной полоске DIODER на каждую из четырех полок в верхнем ряду:

После сборки я начал с установки по одной полоске DIODER на каждую из четырех полок в верхнем ряду:

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

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

Все это закончилось путаницей лишнего кабеля, который я просто сложил в пучок и прикрепил к задней панели устройства.

Все это закончилось путаницей лишнего кабеля, который я просто сложил в пучок и прикрепил к задней панели устройства

Затем я подключил это к PowerSwitch и RPi, чтобы начать развлекаться с Node.

Затем я подключил это к PowerSwitch и RPi, чтобы начать развлекаться с Node

Управление Node.js контактами RPi GPIO

Управлять хвостом PowerSwitch действительно легко. Все, что ему нужно, это напряжение 3-12 В постоянного тока, приложенное к терминалу управления:

Мы можем сделать это с GPIO Raspberry Pi, подключив вывод GPIO к +, а затем подключив - к выводу заземления. Управлять этим в Python действительно легко:

#! / usr / bin / env python импортирует RPi.GPIO как io io. setmode (io. BCM) power_pin = 18 io. настройка (power_pin, IO. OUT) IO. вывод (power_pin, True)

Но мой опыт в Node.js и я хотел забавный способ сделать его управляемым через браузер или другой URL-вызов. Короче я хотел:

  • / - Очень простой статический сайт с кнопками включения и выключения ссылки. Мы будем использовать экспресс разместить эти активы.
  • / on - включить свет (вывод GPIO «включен»)
  • / off - выключить свет (вывод GPIO «выкл»)

Полный контроль над RPi GPIO с использованием Node.js в настоящее время немного отсутствует. Существует два основных модуля npm, но ни один из них не поддерживается активно, и оба, кажется, находятся на пути к замене. К счастью, наши потребности довольно просты. я использовал пи-GPIO потому что в то время я не мог получить GPIO работать (хотя он был обновлен с тех пор, как я в последний раз смотрел).

Помните, что контакты GPIO могут быть адресованы как напечатанные на плате, так и в реальном порядке. Библиотека pi-gpio использует физическую распиновку, а не напечатанные числа.

Библиотека pi-gpio использует физическую распиновку, а не напечатанные числа

Изображение из Hobby Electronics иллюстрирует напечатанные числа GPIO по сравнению с физической распиновкой для Raspberry Pi B.

Мы загружаем две необходимые библиотеки и также отмечаем штырь как 16 (который обозначен на плате как GPIO 23) .

var gpio = require ('pi-gpio'); var pin = 16; var express = require ('express'); var app = express ();

Простая функция - открыть вывод для записи, написать x (логическое значение для включения или выключения вывода) и закрыть вывод для вывода через полсекунды.

var lightSwitch = function (x) {gpio. open (pin, «output», function (err) {gpio. write (pin, x, function () {setTimeout (function () {gpio. close (pin)}, 500);});}); }

Теперь наша утилита URLs / вкл / выкл

приложение get ('/ on', function (req, res) {lightSwitch (1); var body = 'Lights On'; res. setHeader ('Content-Type', 'text / plain'); res. setHeader ('Content) -Длина ', длина тела); Res конец (тело);}); приложение get ('/ off', function (req, res) {lightSwitch (0); var body = 'Lights Off'; res. setHeader ('Content-Type', 'text / plain'); res. setHeader ('Content) -Длина ', длина тела); Res конец (тело);});

Наконец, мы настроили сервер Express для прослушивания HTTP-запросов на 8080 и для любого пути, который еще не был объявлен, обслуживаем ресурсы из каталога / public проекта, который содержит стандартный index.html и разные CSS и JS активы.

приложение слушать (8080); приложение use (express. static (__dirname + '/ public')); приставка . log («Прослушивание через порт 8080»);

log («Прослушивание через порт 8080»);

Взаимодействие вне браузера

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

В будущем я также хотел бы настроить аналогичные действия на моем компьютере (либо с помощью панели задач / значка док-станции, либо с помощью автоматических действий), чтобы включить свет при запуске компьютера. Кроме того, у меня есть второй хвост PowerSwitch, так что было бы тривиально добавить второй «контур» в мою систему. Думаю, мне придется пойти и купить больше светильников!

Вопрос

Мне бы хотелось найти лучший способ взаимодействия с выводами GPIO, особенно если я когда-нибудь сделаю что-нибудь более сложное. Существуют ли более зрелые библиотеки GPIO для Node.js? Присоединяйтесь в комментариях.

Js?