Cuprins:

Supliment Web Operator Gate Controlled Gate (IoT): 20 de pași (cu imagini)
Supliment Web Operator Gate Controlled Gate (IoT): 20 de pași (cu imagini)

Video: Supliment Web Operator Gate Controlled Gate (IoT): 20 de pași (cu imagini)

Video: Supliment Web Operator Gate Controlled Gate (IoT): 20 de pași (cu imagini)
Video: Аризона, Юта и Невада - Невероятно красивые места Америки. Автопутешествие по США 2024, Iulie
Anonim
Supliment Web Operator Gate Controlled Gate (IoT)
Supliment Web Operator Gate Controlled Gate (IoT)
Supliment Web Operator Gate Controlled Gate (IoT)
Supliment Web Operator Gate Controlled Gate (IoT)
Supliment Web Operator Gate Controlled Gate (IoT)
Supliment Web Operator Gate Controlled Gate (IoT)

Am un client care avea o zonă închisă unde mulți oameni aveau nevoie să vină și să plece. Nu au vrut să utilizeze o tastatură la exterior și au avut doar un număr limitat de emițătoare keyfob. Găsirea unei surse accesibile pentru keybob-uri suplimentare a fost dificilă. M-am gândit că ar fi o mare oportunitate de a actualiza acest operator de poartă Liftmaster pentru a fi compatibil IoT cu hardware personalizat, API web și interfața aplicației web. Acest lucru nu numai că a rezolvat problema accesului în masă, ci a deschis și funcționalități suplimentare!

În ultima fotografie de mai sus este unitatea de testare pe care am rulat-o aproape un an într-o geantă cu ziplock. Am crezut că este timpul pentru un upgrade!

Aceasta este o soluție pe deplin funcțională, cu toate codurile, informațiile hardware și proiectele enumerate aici.

Toate fișierele proiectelor sunt găzduite și pe GitHub: github.com/ThingEngineer/IoT-Gate-Operator-Addon

Un exemplu de interfață CodeIgniter WebApp este găzduit aici: projects.ajillion.com/gate Această instanță nu este conectată la o poartă live, ci este interfața exactă și codul care rulează pe porți (minus unele caracteristici de securitate).

--

Pentru o integrare și mai mare, puteți utiliza biblioteca IFTTT pentru Electric Imp.

Pasul 1: Adunați piesele

Adunați piesele
Adunați piesele
  • Veți avea nevoie de un IMP electric cu cel puțin 4 GPIO-uri disponibile, eu folosesc IMP001 cu o placă de aprilie.
  • Un regulator pentru a scădea tensiunea sursei până la 5V. Folosesc un modul DC-DC Buck Converter Step Down. Versiunea MP1584EN eBoot de la Amazon.
  • Un modul de releu dual (sau mai multe) sau un dispozitiv de comutare similar care va funcționa cu ieșirea IMP-uri. Folosesc acest modul de releu JBtek 4 canale DC 5V de la Amazon.
  • Un terminal cu șurub cu 4 fire. O folosesc pe aceasta 5Pcs 2 Rânduri 12P Sârmă Conector Șurub Terminal Bară Bloc 300V 20A de la Amazon.

Pasul 2: consumabile

Provizii
Provizii

De asemenea, veți avea nevoie de:

  • Acces la o imprimantă 3D sau la o cutie mică de proiect
  • 4 șuruburi mici de aproximativ 4mm x 6mm pentru capacul carcasei
  • Sârmă de conectare
  • Freze de sârmă
  • Decapanti de sârmă
  • Șurubelnițe mici
  • Ciocan de lipit
  • Lipici fierbinte sau silicon
  • Cravate cu fermoar

Pasul 3: Măriți carcasa

Măriți carcasa
Măriți carcasa

Așezați-vă piesele pentru a determina ce dimensiune aveți nevoie. Cu un aspect așa cum este ilustrat, voi avea nevoie de o carcasă care are aproximativ 140 mm lățime, 70 mm adâncime și 30 mm înălțime.

Pasul 4: Convertor cablu DC-DC

Convertor cablu DC-DC
Convertor cablu DC-DC

Tăiați 3 perechi de sârmă de conectare roșie și neagră pentru conexiunile de alimentare în și din placa convertorului DC-DC.

  • Intrare: 100mm
  • Iesire la IMP: 90mm
  • Ieșire la modulul de releu: 130 mm

Lipiți-le pe tablă, așa cum se arată.

Pasul 5: Alimentarea prin cablu a dispozitivelor

Alimentarea prin cablu a dispozitivelor
Alimentarea prin cablu a dispozitivelor
  • Conectați intrarea convertorului DC-DC la două dintre punctele de pe blocul de borne cu șurub.
  • Lipiți cablurile scurte de ieșire de 5V către IMP.
  • Lipiți cele mai lungi fire de ieșire de 5V către modulul de releu.

Pasul 6: Intrări modul modul releu fir

Intrări modul modul releu fir
Intrări modul modul releu fir
  • Tăiați fire de 4 x 90 mm pentru conexiunile de intrare ale modulului releu. Am folosit 4 culori separate pentru o referință ușoară mai târziu în timp ce codificați.
  • Lipiți firele la intrările modulului releu 1-4, apoi la primele 4 spoturi IMP GPIO (Pin1, 2, 5 și respectiv 7).

Pasul 7: IMP Power Jumper

IMP Power Jumper
IMP Power Jumper

Este posibil să fie necesar să utilizați alimentarea USB în timp ce programați și testați IMP-ul inițial. Când terminați, asigurați-vă că mutați jumperul de putere în partea BAT.

Pasul 8: Intrări de stare Wire Gate

Intrări de stare Wire Gate
Intrări de stare Wire Gate
  • Tăiați 2 fire de 80 mm pentru intrările de stare a stării.
  • Conectați firele la restul de 2 borne cu șurub.
  • Sârmă de lipit la următorul spot IMP GPIO (Pin8 și respectiv 9).

Pasul 9: tipăriți sau cumpărați o carcasă

Tipăriți sau cumpărați o carcasă
Tipăriți sau cumpărați o carcasă

Puteți descărca fișierele. STL sau. F3D pentru acest caz pe GitHub sau Thingiverse

Dacă nu aveți acces la o imprimantă 3D, va funcționa un mic caz de proiectare generic.

Pasul 10: Decorează-ți carcasa

Decorează-ți cazul
Decorează-ți cazul

Pentru că!

Am pus niște text indentat pe al meu și tocmai l-am colorat cu un sharpie negru. Dacă vă simțiți aventuros, ați putea folosi vopsea acrilică, ojă de unghii sau altceva pentru a o face și mai strălucitoare.

Pasul 11: Găuri pentru fire

Gaura de găurit pentru fire
Gaura de găurit pentru fire

Găuriți o gaură mică de 10-15 mm pe partea din apropierea mijlocului de unde toate firele se vor uni.

Am folosit un Unibit pentru o gaură curată și netedă din plastic.

Pasul 12: Pregătiți și instalați fire de conectare

Pregătiți și instalați fire de conectare
Pregătiți și instalați fire de conectare
Pregătiți și instalați fire de conectare
Pregătiți și instalați fire de conectare

Tăiați sârme de 9 x 5-600 mm pentru conectarea dispozitivului nostru la placa operatorului de poartă.

  • 2 pentru intrarea de alimentare de 24V
  • 3 pentru starea porții (2 intrări și un teren comun)
  • 2 pentru semnalul porții deschise
  • 2 pentru semnalul de poartă de închidere

Răsuciți împreună fiecare dintre grupurile enumerate mai sus folosind un burghiu. Acest lucru va face totul mai ușor și va arăta mai bine.

Îndepărtați și conectați fiecare dintre fire la bornele respective așa cum se arată.

Pasul 13: Trageți firele de conectare

Trageți cablurile de conectare
Trageți cablurile de conectare

Treceți firele de conectare prin gaură așa cum se arată.

Pasul 14: Montați componentele

Componente de montare
Componente de montare

Așezați și montați componentele cu o mică margele de adeziv fierbinte sau silicon. Nu utilizați prea mult în cazul în care trebuie să eliminați o piesă, utilizați doar suficient pentru a le asigura.

Inițial am vrut să imprim carcasa cu cleme / file pentru a menține plăcile în loc, dar trebuia să instalez acest lucru și nu aveam timp. Adăugarea de cleme de bord la carcasa dvs. ar fi o atingere plăcută.

Pasul 15: Etanșați firele de conectare

Etanșați firele de conectare
Etanșați firele de conectare

Sigilați firele de conectare cu adeziv fierbinte sau silicon.

Pasul 16: Închideți carcasa

Închideți carcasa
Închideți carcasa

Am folosit șuruburi mici de ~ 4mm pe lista acestei huse imprimate 3D. Dacă sunteți îngrijorat de murdărie sau umezeală, puneți o margele de silicon sau lipici fierbinte în jurul articulației capacului înainte de a o închide.

Pasul 17: Instalați în Gate Operator

Instalați în Gate Operator
Instalați în Gate Operator
Instalați în Gate Operator
Instalați în Gate Operator

Pe tabloul principal:

  • Cârligați cele două fire conectate la ieșirea 1 a releului la terminalul Open Gate. (roșu / maro în fotografii)
  • Cârligați cele două fire conectate la ieșirea 2 a releului la terminalul Close Gate. (galben / albastru în fotografii)
  • Cârligați cele două fire conectate la intrarea convertorului DC-DC la bornele cu șurub de alimentare accesoriu de 24V (roșu / negru în fotografii)

Pe placa de expansiune

  • Sariți bornele comune cu șurub ale releului împreună cu o bucată mică de sârmă
  • Conectați pământul comun la unul dintre bornele cu șurub comune ale releului (verde în fotografii)
  • Conectați cele 2 intrări de stare a porții (IMP Pin8 & 9) la bornele cu șurub cu releu normal deschis (NU) (gri / galben în fotografii)

Direcționați firele, legați-le cu fermoar pentru a arăta îngrijite și găsiți un loc unde să vă montați sau să vă setați carcasa.

Există fotografii suplimentare, cu rezoluție completă, găzduite în depozitul GitHub.

Pasul 18: Setați modul releu auxiliar

Setați modul releu auxiliar
Setați modul releu auxiliar

Setați comutatoarele releului auxiliar așa cum se arată în fotografie.

Acest lucru va oferi IMP semnalele de care are nevoie pentru a determina dacă poarta este închisă, deschizându-se, deschisă sau închisă.

Pasul 19: Codul IMP Agent și dispozitiv

Codul IMP Agent și dispozitiv
Codul IMP Agent și dispozitiv

Cod agent agent electric imp:

  • Creați un model nou în ID-ul Electric Imp:
  • Înlocuiți adresa URL pentru a indica serverul

// Funcția de gestionare

funcția httpHandler (req, resp) {try {local d = http.jsondecode (req.body); //server.log(d.c); if (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); trimitere resp. (200, „OK”); }} catch (ex) {// Dacă a apărut o eroare, trimiteți-o înapoi în server.log de răspuns ("error:" + ex); resp.send (500, "Eroare internă a serverului:" + ex); }} // Înregistrați gestionarul HTTP http.onrequest (httpHandler); // GateStateChange handler function function function gateStateChangeHandler (data) {// URL to web service local url = "https://projects.ajillion.com/save_gate_state"; // Setați Content-Type header la json local headers = {"Content-Type": "application / json"}; // Codificați datele primite și jurnalizați corpul local = http.jsonencode (date); server.log (corp); // Trimiteți datele către serviciul dvs. web http.post (url, anteturi, corp).sendsync (); } // Înregistrează dispozitivul de gestionare gateStateChange ("gateStateChange", gateStateChangeHandler);

Cod agent electric imp:

  • Atribuiți un dispozitiv Imp modelului dvs.
  • Verificați pinii hardware sunt Aliased ca conectați

// Biblioteca Debouce

#require "Button.class.nut: 1.2.0" // Alias pentru gateOpen GPIO pin (activ low) gateOpen <- hardware.pin2; // Alias pentru gateClose control GPIO pin (activ scăzut) gateClose <- hardware.pin7; // Configurați „gateOpen” pentru a fi o ieșire digitală cu o valoare de pornire digitală 1 (mare) gateOpen.configure (DIGITAL_OUT, 1); // Configurați „gateClose” pentru a fi o ieșire digitală cu o valoare inițială de 1 digitală (mare) gateClose.configure (DIGITAL_OUT, 1); // Alias pentru pinul GPIO care indică poarta în mișcare (N. O.) gateMovingState <- Buton (hardware.pin8, DIGITAL_IN_PULLUP); // Alias pentru pinul GPIO care indică faptul că poarta este complet deschisă (N. O.) gateOpenState <- Buton (hardware.pin9, DIGITAL_IN_PULLUP); // Variabilă globală pentru a menține starea porții (Deschis = 1 / Închis = 0) local lastGateOpenState = 0; // Latch Timer obiect local latchTimer = agent nul.on ("btn", funcție (date) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Deschidere comandă primită"); break case "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m comandă recepționată"); break case "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Comanda Latch8h primită"); break case "close": if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1);.wakeup (1, releaseClose); server.log („Închideți acum comanda primită”); break implicit: server.log („Comanda buton nu este recunoscută”);}}); funcție releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timer a lansat contactul gateOpen switch "); } funcție releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timer a lansat gateClose contact contact "); } gateMovingState.onPress (function () {// Releul este activat, poarta se mută //server.log("Gate is opening "); local data = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", date);}). onRelease (funcția () {// Releul este eliberat, poarta este în repaus //server.log("Gate is closed "); local data = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", date);}); gateOpenState.onPress (function () {// Releul este activat, poarta este complet deschisă //server.log("Gate is open "); local data = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", date);}). onRelease (funcție () {// Releul este eliberat, poarta nu este complet deschisă //server.log("Gate se închide "); date locale = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);});

Pasul 20: Cod PHP pentru servicii web

Serviciu Web Cod PHP
Serviciu Web Cod PHP

Am scris acest cod pentru cadrul CodeIgniter deoarece l-am adăugat la un proiect vechi existent. Controlerul și codul de vizualizare pot fi ușor adaptate la cadrul ales de dvs.

Pentru a simplifica lucrurile, am salvat datele JSON într-un fișier plat pentru stocarea datelor. Dacă aveți nevoie de înregistrare sau funcții legate de date mai complexe, utilizați o bază de date.

Biblioteca ajax pe care am scris-o și am folosit-o în acest proiect se poate descărca din depozitul GitHub: ThingEngineer / Codeigniter-jQuery-Ajax

Cod controler PHP:

  • app / controllers / projects.php
  • Asigurați-vă că calea de date este accesibilă de scriptul dvs. PHP, atât de privilegii de locație, cât și de citire / scriere.

load-> helper (matrice („fișier”, „dată”));

$ data = json_decode (read_file ('../ app / logs / gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Închis'; pauză; caz 1: $ view_data ['gatestate'] = 'Deschidere …'; pauză; caz 2: $ view_data ['gatestate'] = 'Deschis'; pauză; caz 3: $ view_data ['gatestate'] = 'Închidere …'; pauză; } $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data'), TRUE); $ view_data ['last_opened'] = interval de timp ($ last_opened ['last_opened'], time ()). ' în urmă'; // Încărcați vizualizarea $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } funcție save_gate_state () {$ this-> load-> helper ('fișier'); $ data = file_get_contents ('php: // input'); write_file ('../ app / logs / projects / gatestate.data', $ data); $ data = json_decode ($ data, TRUE); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app / logs / projects / gateopened.data', json_encode ($ last_opened)); }} funcție get_gate_state () {$ this-> load-> helper (matrice ('fișier', 'dată')); $ this-> load-> library ('ajax'); $ data = json_decode (read_file ('../ app / logs / projects / gatestate.data'), TRUE); $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data'), TRUE); $ data ['last_opened'] = interval de timp ($ last_opened ['last_opened'], time ()). ' în urmă'; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // trimiteți date json, nu aplicați cererea ajax}} / * Sfârșitul proiectului fișier.php * / / * Locație:./application/controllers/projects.php * /

Cod vizualizare PHP:

Am folosit Bootstrap pentru front-end pentru că este rapid, ușor și receptiv. Puteți să-l descărcați aici: https://getbootstrap.com (jQuery este inclus)

  • app / controllers / gate_view.php
  • Înlocuiți CODUL-AGENTUL DVS. cu codul agentului Electric Imp

IoT Gate Opperator Addon IoT Gate Opperator Addon

  • Acasă
  • Administrator

Deschideți poarta Deschideți timp de 30 de minute Deschideți timp de 8 ore Închideți acum Stare poartă: Ultima deschidere $ (document). Ready (funcție () {resetStatus ();}) funcție 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 ("Deschiderea …");}); $ ("# latch30m_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). text ("Deschiderea …");}); $ ("# latch8h_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). text ("Deschiderea …");}); $ ("# close_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). text ("Închidere …");}); funcție resetStatus () {// URL țintă var target = 'https://projects.ajillion.com/get_gate_state'; // Solicitare var date = {agent: 'app'}; // Trimiteți o cerere de postare ajax $.ajax ({url: target, dataType: 'json', tip: 'POST', date: date, succes: funcție (date, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("# status"). Text ('Închis'); break; caz 1: $ ("# status"). Text ('Opening …'); break; case 2: $ ("# status").text („Deschis”); pauză; caz 3: $ („# stare”). text („Închidere …”); pauză; implicit: $ („# stare”). text („Eroare”);} $ ("#last_opened"). text (data.last_opened);}, eroare: funcție (XMLHttpRequest, textStatus, errorThrown) {// Mesaj de eroare $ ("# status"). text ('Server Error');}}); setTimeout (resetStatus, 3000); }

Recomandat: