Оглавление:
- Шаг 1: Соберите детали
- Шаг 2: расходные материалы
- Шаг 3: увеличьте размер корпуса
- Шаг 4.Проводной преобразователь постоянного тока в постоянный
- Шаг 5: Подключите питание к устройствам
- Шаг 6: Подключите входы модуля реле
- Шаг 7: перемычка питания IMP
- Шаг 8: Входы состояния проводного затвора
- Шаг 9. Распечатайте или купите футляр
- Шаг 10: украсьте свой футляр
- Шаг 11: просверлите отверстие для проводов
- Шаг 12: Подготовка и установка монтажных проводов
- Шаг 13: проложите монтажные провода
- Шаг 14: Установите компоненты
- Шаг 15: заделайте монтажные провода
- Шаг 16: закройте корпус
- Шаг 17: Установите в Gate Operator
- Шаг 18: Установите режим дополнительного реле
- Шаг 19: Агент IMP и код устройства
- Шаг 20: PHP-код веб-службы
Видео: Надстройка оператора шлюза, управляемая веб-приложением (IoT): 20 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
У меня есть клиент, у которого была закрытая территория, куда нужно было приходить и уходить многим людям. Они не хотели использовать клавиатуру снаружи и имели лишь ограниченное количество брелоков-передатчиков. Было сложно найти доступный источник дополнительных брелоков. Я подумал, что это отличная возможность обновить этот оператор ворот 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
Вам может потребоваться питание от 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
На основной плате:
- Подсоедините два провода, подключенные к релейному выходу 1, к клемме Open Gate. (красный / коричневый на фото)
- Подсоедините два провода, подключенные к релейному выходу 2, к клемме Close Gate. (желтый / синий на фото)
- Подсоедините два провода, подключенные ко входу преобразователя DC-DC, к винтовым клеммам питания 24 В (красный / черный на фотографиях).
На плате расширения
- Соедините общие винтовые клеммы реле с помощью небольшого куска провода.
- Подключите массу к одной из общих винтовых клемм реле (на фотографиях зеленый).
- Подключите 2 входа состояния ворот (IMP Pin8 и 9) к нормально разомкнутым (NO) винтовым клеммам реле (серый / желтый на фотографиях)
Проложите провода, завяжите их молнией, чтобы они выглядели аккуратно, и найдите место для крепления или установки вашего футляра.
В репозитории GitHub размещены дополнительные фотографии в полном разрешении.
Шаг 18: Установите режим дополнительного реле
Установите переключатели вспомогательного реле, как показано на фото.
Это даст IMP сигналы, необходимые для определения того, закрываются ли ворота, открываются, открываются или закрываются.
Шаг 19: Агент 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-код веб-службы
Я написал этот код для фреймворка 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); }
Рекомендуемые:
Рождественская елка, управляемая веб-сайтом (любой может ее контролировать): 19 шагов (с изображениями)
Рождественская елка, управляемая веб-сайтом (любой может ее контролировать): вы хотите знать, как выглядит рождественская елка, управляемая веб-сайтом? Вот видео, демонстрирующее мой проект моей рождественской елки. Прямая трансляция уже закончилась, но я снял видео, запечатлевшее, что происходит: В этом году, в середине декабря
ESP 8266 Nodemcu Ws 2812 Светодиодная лампа MOOD на основе неопикселей, управляемая локальным веб-сервером: 6 шагов
ESP 8266 Nodemcu Ws 2812 Светодиодная лампа MOOD на основе неопикселей, управляемая локальным веб-сервером: ESP 8266 Nodemcu Ws 2812 Светодиодная лампа MOOD на основе неопикселей, управляемая с помощью веб-сервера
Светодиодная лента, управляемая веб-сайтом / Wi-Fi, с Raspberry Pi: 9 шагов (с изображениями)
Светодиодная лента с веб-сайтом / Wi-Fi и Raspberry Pi: Предыстория: Я подросток, последние несколько лет занимаюсь проектированием и программированием небольших проектов в области электроники, а также участвую в соревнованиях по робототехнике. Недавно я работал над обновлением настроек своего стола и решил, что хорошее добавление
Модуль шлюза Bluetooth для двусторонней радиосвязи: 3 шага (с изображениями)
Модуль шлюза Bluetooth для двусторонней радиосвязи: Адаптер шлюза Bluetooth для двусторонней радиосвязи Это может быть реализовано с помощью Bluetooth-гарнитуры с приличным микрофоном и радио, поддерживающего Bluetooth. Есть более новые радиоприемники
Карманный чехол для оператора Lasercut: 3 шага (с изображениями)
Карманный чемоданчик для лазерной резки. С шумихой вокруг предстоящих новых карманных операторов PO-33 и PO-35 от Teenage Engineering я решил, что пришло время поделиться своим простым "чемоданом". что я сделал для своего ПО-20. Это действительно просто. Настолько просто, что удерживается прессой