Оглавление:

Надстройка оператора шлюза, управляемая веб-приложением (IoT): 20 шагов (с изображениями)
Надстройка оператора шлюза, управляемая веб-приложением (IoT): 20 шагов (с изображениями)

Видео: Надстройка оператора шлюза, управляемая веб-приложением (IoT): 20 шагов (с изображениями)

Видео: Надстройка оператора шлюза, управляемая веб-приложением (IoT): 20 шагов (с изображениями)
Видео: Зачем нужен GSM-шлюз? 2024, Ноябрь
Anonim
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)
Надстройка оператора шлюза, контролируемого веб-приложением (IoT)

У меня есть клиент, у которого была закрытая территория, куда нужно было приходить и уходить многим людям. Они не хотели использовать клавиатуру снаружи и имели лишь ограниченное количество брелоков-передатчиков. Было сложно найти доступный источник дополнительных брелоков. Я подумал, что это отличная возможность обновить этот оператор ворот Liftmaster, чтобы он был совместим с IoT с настраиваемым оборудованием, веб-API и интерфейсом веб-приложений. Это не только решило проблему массового доступа, но и открыло дополнительные функции!

На последней фотографии выше показан тестовый образец, который я использовал в течение почти года в сумке с застежкой-молнией. Я подумал, что пришло время для апгрейда!

Это полностью функциональное решение со всем кодом, информацией об оборудовании и дизайном, перечисленными здесь.

Все файлы проектов также размещены на GitHub: github.com/ThingEngineer/IoT-Gate-Operator-Addon.

Пример интерфейса CodeIgniter WebApp размещен здесь: projects.ajillion.com/gate Этот экземпляр не подключен к активным воротам, но является точным интерфейсом и кодом, который выполняется на воротах (без некоторых функций безопасности).

--

Для еще большей интеграции вы можете использовать библиотеку IFTTT для Electric Imp.

Шаг 1: Соберите детали

Соберите детали
Соберите детали
  • Вам понадобится Electric IMP с как минимум 4 доступными GPIO, я использую IMP001 с апрельской коммутационной платой.
  • Стабилизатор для снижения напряжения источника до 5 В. Я использую понижающий модуль понижающего преобразователя постоянного тока. Версия eBoot MP1584EN от Amazon.
  • Сдвоенный (или более) релейный модуль или подобное переключающее устройство, которое будет работать с выходом IMP. Я использую этот 4-канальный релейный модуль постоянного тока 5 В постоянного тока JBtek от Amazon.
  • 4-х проводный винтовой зажим. Я использую этот барьерный блок с винтовыми клеммами 5Pcs 2 Rows 12P 300V 20A от Amazon.

Шаг 2: расходные материалы

Запасы
Запасы

Вам также понадобятся:

  • Доступ к 3D-принтеру или небольшой коробке для проекта
  • 4 маленьких винта размером 4 мм x 6 мм для крышки корпуса
  • Монтажный провод
  • Кусачки
  • Инструмент для зачистки проводов
  • Маленькие отвертки
  • Паяльник
  • Горячий клей или силикон
  • Застежки-молнии

Шаг 3: увеличьте размер корпуса

Увеличьте размер корпуса
Увеличьте размер корпуса

Разложите детали, чтобы определить, какой размер вам понадобится. С макетом, показанным на картинке, мне понадобится корпус шириной около 140 мм, глубиной 70 мм и высотой 30 мм.

Шаг 4. Проводной преобразователь постоянного тока в постоянный

Проводной преобразователь постоянного тока в постоянный
Проводной преобразователь постоянного тока в постоянный

Отрежьте 3 пары красных и черных соединительных проводов для подключения питания к плате преобразователя постоянного тока и от нее.

  • Вход: 100 мм
  • Выход на IMP: 90 мм
  • Выход на релейный модуль: 130 мм

Припаяйте их к плате, как показано.

Шаг 5: Подключите питание к устройствам

Проводка питания к устройствам
Проводка питания к устройствам
  • Подключите вход DC-DC преобразователя к двум точкам на клеммной колодке с винтовыми зажимами.
  • Припаяйте короткие выходные провода 5V к IMP.
  • Припаяйте более длинные выходные провода 5 В к модулю реле.

Шаг 6: Подключите входы модуля реле

Входы модуля проводных реле
Входы модуля проводных реле
  • Отрежьте 4 провода x 90 мм для входных соединений релейного модуля. Я использовал 4 отдельных цвета для удобства использования позже при кодировании.
  • Припаяйте провода ко входам 1–4 модуля реле, а затем к первым 4 точкам IMP GPIO (контакты 1, 2, 5 и 7) соответственно.

Шаг 7: перемычка питания IMP

Перемычка питания IMP
Перемычка питания IMP

Вам может потребоваться питание от USB при первоначальном программировании и тестировании IMP. Когда закончите, не забудьте переместить перемычку питания в сторону BAT.

Шаг 8: Входы состояния проводного затвора

Входы состояния проводного затвора
Входы состояния проводного затвора
  • Отрежьте 2 провода по 80 мм для входов состояния.
  • Подключите провода к оставшимся 2 винтовым клеммам.
  • Припаяйте провода к следующим контактам IMP GPIO (контакты 8 и 9) соответственно.

Шаг 9. Распечатайте или купите футляр

Распечатайте или купите футляр
Распечатайте или купите футляр

Вы можете скачать мой. STL или. F3D для этого случая на GitHub или Thingiverse.

Если у вас нет доступа к 3D-принтеру, подойдет небольшой общий проект.

Шаг 10: украсьте свой футляр

Украсьте свой чехол
Украсьте свой чехол

Потому что!

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

Шаг 11: просверлите отверстие для проводов

Просверлить отверстие для проводов
Просверлить отверстие для проводов

Просверлите небольшое отверстие 10-15 мм сбоку ближе к середине, где будут собираться все провода.

Я использовал Unibit для получения чистого и гладкого отверстия в пластике.

Шаг 12: Подготовка и установка монтажных проводов

Подготовка и установка монтажных проводов
Подготовка и установка монтажных проводов
Подготовка и установка монтажных проводов
Подготовка и установка монтажных проводов

Отрежьте провода 9 x 5-600 мм для подключения нашего устройства к плате привода ворот.

  • 2 для входа питания 24 В
  • 3 для состояния ворот (2 входа и общая земля)
  • 2 для сигнала открытого затвора
  • 2 для сигнала закрытия ворот

Скрутите вместе каждую из перечисленных выше групп, используя дрель. Это упростит все и будет выглядеть лучше.

Зачистите и подключите каждый из проводов к соответствующим клеммам, как показано.

Шаг 13: проложите монтажные провода

Провода для подключения
Провода для подключения

Пропустите соединительные провода через отверстие, как показано.

Шаг 14: Установите компоненты

Компоненты крепления
Компоненты крепления

Установите и закрепите компоненты с помощью небольшой полоски горячего клея или силикона. Не используйте слишком много, если вам нужно удалить деталь, используйте ровно столько, чтобы закрепить их.

Изначально я хотел напечатать корпус с зажимами / выступами, чтобы удерживать платы на месте, но мне нужно было установить это, и у меня не было времени. Было бы неплохо добавить зажимы для платы к вашему футляру.

Шаг 15: заделайте монтажные провода

Соединительные провода для уплотнения
Соединительные провода для уплотнения

Заклейте соединительные провода горячим клеем или силиконом.

Шаг 16: закройте корпус

Закройте дело
Закройте дело

Я использовал маленькие винты ~ 4 мм из списка этого корпуса, напечатанного на 3D-принтере. Если вас беспокоит грязь или влага, нанесите полоску силикона или горячего клея вокруг стыка крышки, прежде чем закрывать ее.

Шаг 17: Установите в Gate Operator

Установить в Gate Operator
Установить в Gate Operator
Установить в Gate Operator
Установить в Gate Operator

На основной плате:

  • Подсоедините два провода, подключенные к релейному выходу 1, к клемме Open Gate. (красный / коричневый на фото)
  • Подсоедините два провода, подключенные к релейному выходу 2, к клемме Close Gate. (желтый / синий на фото)
  • Подсоедините два провода, подключенные ко входу преобразователя DC-DC, к винтовым клеммам питания 24 В (красный / черный на фотографиях).

На плате расширения

  • Соедините общие винтовые клеммы реле с помощью небольшого куска провода.
  • Подключите массу к одной из общих винтовых клемм реле (на фотографиях зеленый).
  • Подключите 2 входа состояния ворот (IMP Pin8 и 9) к нормально разомкнутым (NO) винтовым клеммам реле (серый / желтый на фотографиях)

Проложите провода, завяжите их молнией, чтобы они выглядели аккуратно, и найдите место для крепления или установки вашего футляра.

В репозитории GitHub размещены дополнительные фотографии в полном разрешении.

Шаг 18: Установите режим дополнительного реле

Установить режим дополнительного реле
Установить режим дополнительного реле

Установите переключатели вспомогательного реле, как показано на фото.

Это даст IMP сигналы, необходимые для определения того, закрываются ли ворота, открываются, открываются или закрываются.

Шаг 19: Агент IMP и код устройства

Агент IMP и код устройства
Агент IMP и код устройства

Код агента электрического удара:

  • Создайте новую модель в IDE Electric Imp:
  • Замените URL, чтобы он указывал на ваш сервер

// Функция обработчика

функция httpHandler (req, resp) {попробуйте {local d = http.jsondecode (req.body); //server.log(d.c); if (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); соответственно send (200, "ОК"); }} catch (ex) {// Если произошла ошибка, отправить ее обратно в ответ server.log ("error:" + ex); resp.send (500, «Внутренняя ошибка сервера:» + ex); }} // Регистрируем обработчик HTTP http.onrequest (httpHandler); // Функция обработчика GateStateChange function gateStateChangeHandler (data) {// URL-адрес веб-службы local url = "https://projects.ajillion.com/save_gate_state"; // Установите для заголовка Content-Type значение json local headers = {"Content-Type": "application / json"}; // Кодировать полученные данные и записывать в журнал local body = http.jsonencode (data); server.log (тело); // Отправляем данные в ваш веб-сервис http.post (url, headers, body).sendsync (); } // Регистрируем обработчик gateStateChange device.on ("gateStateChange", gateStateChangeHandler);

Код агента электрического удара:

  • Назначьте устройство Imp вашей модели
  • Убедитесь, что аппаратные контакты имеют псевдонимы, как подключенные

// Библиотека Debouce

#require "Button.class.nut: 1.2.0" // Псевдоним для вывода gateOpen GPIO (активный низкий уровень) gateOpen <- hardware.pin2; // Псевдоним для управления gateClose выводом GPIO (активный низкий уровень) gateClose <- hardware.pin7; // Настройте 'gateOpen' как цифровой выход с начальным значением цифрового 1 (высокий) gateOpen.configure (DIGITAL_OUT, 1); // Настройте 'gateClose' как цифровой выход с начальным значением цифрового 1 (высокий) gateClose.configure (DIGITAL_OUT, 1); // Псевдоним для вывода GPIO, который указывает, что ворота движутся (N. O.) gateMovingState <- Button (hardware.pin8, DIGITAL_IN_PULLUP); // Псевдоним для вывода GPIO, который указывает, что ворота полностью открыты (N. O.) gateOpenState <- Button (hardware.pin9, DIGITAL_IN_PULLUP); // Глобальная переменная для хранения состояния ворот (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Локальный объект таймера защелки latchTimer = null agent.on ("btn", function (data) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer)); latchTimer = imp.wakeup (1, releaseOpen); server.log («Команда открытия получена»); прервать регистр «latch30m»: gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log («Получена команда Latch30m»); прервать регистр «latch8h»: gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log («Получена команда Latch8h»); прервать регистр «закрыть»: if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Команда закрытия получена"); break default: server.log ("Команда кнопки не распознана");}}); функция releaseOpen () {если (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Таймер освобожден от контакта переключателя gateOpen"); } функция releaseClose () {если (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Таймер освобожден от контакта выключателяЗакрыть контакт"); } gateMovingState.onPress (function () {// Реле активировано, ворота движутся //server.log("Ворота открываются"); local data = {"gatestate": 1, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (function () {// Реле разблокировано, шлюз находится в состоянии покоя //server.log("Gate is closed "); local data = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);}); gateOpenState.onPress (function () {// Реле активировано, ворота полностью открыты //server.log("Gate is open "); local data = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (function () {// Реле разблокировано, шлюз не полностью открыт //server.log("Gate закрывается "); локальные данные = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);});

Шаг 20: PHP-код веб-службы

PHP-код веб-службы
PHP-код веб-службы

Я написал этот код для фреймворка CodeIgniter, потому что добавил его в старый существующий проект. Код контроллера и представления можно легко адаптировать к выбранной вами структуре.

Для простоты я сохранил данные JSON в плоский файл для хранения данных. Если вам нужно ведение журнала или более сложные функции, связанные с данными, используйте базу данных.

Библиотеку ajax, которую я написал и использовал в этом проекте, можно загрузить из репозитория GitHub: ThingEngineer / Codeigniter-jQuery-Ajax

Код контроллера PHP:

  • приложение / контроллеры / проекты.php
  • Убедитесь, что путь к данным доступен для вашего PHP-скрипта, как с правами доступа, так и с правами чтения / записи.

load-> helper (array ('файл', 'дата'));

$ data = json_decode (read_file ('../ app / logs / gatestate.data'), ИСТИНА); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Закрыто'; перерыв; случай 1: $ view_data ['gatestate'] = 'Открытие…'; перерыв; случай 2: $ view_data ['gatestate'] = 'Открыть'; перерыв; case 3: $ view_data ['gatestate'] = 'Закрытие…'; перерыв; } $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data'), ИСТИНА); $ view_data ['last_opened'] = временной интервал ($ last_opened ['last_opened'], time ()). ' назад'; // Загрузить представление $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } function save_gate_state () {$ this-> load-> helper ('файл'); $ data = file_get_contents ('php: // input'); write_file ('../ приложение / журналы / проекты / gatestate.data', $ data); $ data = json_decode ($ data, ИСТИНА); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ приложение / журналы / проекты / gateopened.data', json_encode ($ last_opened)); }} function get_gate_state () {$ this-> load-> helper (array ('файл', 'дата')); $ this-> load-> библиотека ('ajax'); $ data = json_decode (read_file ('../ app / logs / projects / gatestate.data'), ИСТИНА); $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data'), ИСТИНА); $ data ['last_opened'] = временной интервал ($ last_opened ['last_opened'], time ()). ' назад'; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // отправка данных json, без принудительного выполнения запроса ajax}} / * Конец файла projects.php * / / * Расположение:./application/controllers/projects.php * /

Код просмотра PHP:

Я использовал Bootstrap для интерфейса, потому что он быстрый, простой и отзывчивый. Вы можете скачать его здесь: https://getbootstrap.com (jQuery включен)

  • приложение / контроллеры / gate_view.php
  • Замените YOUR-AGENT-CODE своим кодом агента Electric Imp.

Надстройка оператора IoT Gate Надстройка оператора IoT Gate

  • Дом
  • Админ

Открытые ворота Защелки Открыты на 30 минут Защелки Открыты на 8 часов Закрыть Сейчас Статус ворот: Последний открытый $ (document).ready (function () {resetStatus ();}) function sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (URL, JSONout); } $ ("# open_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). text ("Открытие…");}); $ ("# latch30m_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). text ("Открытие…");}); $ ("# latch8h_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). text ("Открытие…");}); $ ("# close_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). text ("Закрытие…");}); function resetStatus () {// Целевой URL var target = 'https://projects.ajillion.com/get_gate_state'; // Запрос var data = {agent: 'app'}; // Отправляем почтовый запрос ajax $.ajax ({url: target, dataType: 'json', type: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("# status"). Text ('Closed'); break; case 1: $ ("# status"). Text ('Open…'); break; case 2: $ ("# status").text ('Open'); break; case 3: $ ("# status"). text ('Closing…'); break; default: $ ("# status"). text ('Error');} $ ("#last_opened"). text (data.last_opened);}, error: function (XMLHttpRequest, textStatus, errorThrown) {// Сообщение об ошибке $ ("# status"). text ('Ошибка сервера');}}); setTimeout (resetStatus, 3000); }

Рекомендуемые: