Taula de continguts:

Complement per a operador de portes controlades de WebApp (IoT): 20 passos (amb imatges)
Complement per a operador de portes controlades de WebApp (IoT): 20 passos (amb imatges)

Vídeo: Complement per a operador de portes controlades de WebApp (IoT): 20 passos (amb imatges)

Vídeo: Complement per a operador de portes controlades de WebApp (IoT): 20 passos (amb imatges)
Vídeo: Аномально вкусно‼️ ЧЕХОСЛОВАЦКИЙ СУП ИЗ ФАРША. Жена Липована в шоке. 2024, De novembre
Anonim
Complement de l'operador de portes controlades de WebApp (IoT)
Complement de l'operador de portes controlades de WebApp (IoT)
Complement per a operador de portes controlades de WebApp (IoT)
Complement per a operador de portes controlades de WebApp (IoT)
Complement per a operador de portes controlades de WebApp (IoT)
Complement per a operador de portes controlades de WebApp (IoT)

Tinc un client que tenia una zona tancada on molta gent necessitava anar i venir. No volien fer servir un teclat a l'exterior i només tenien un nombre limitat de transmissors de teclat. Va ser difícil trobar una font assequible per a claus addicionals. Vaig pensar que seria una gran oportunitat per actualitzar aquest operador de portes Liftmaster perquè sigui compatible amb IoT amb maquinari personalitzat, API web i interfície d'aplicacions web. Això no només va solucionar el problema d'accés massiu, sinó que també va obrir una funcionalitat addicional.

A la darrera foto de dalt hi ha la unitat de prova que feia gairebé un any que tenia en una bossa amb cremallera. Vaig pensar que era hora de fer una actualització.

Aquesta és una solució que funciona completament amb tot el codi, informació de maquinari i dissenys que s’enumeren aquí.

Tots els fitxers de projectes també s’allotgen a GitHub: github.com/ThingEngineer/IoT-Gate-Operator-Addon

Aquí es troba un exemple de la interfície CodeIgniter WebApp: projects.ajillion.com/gate Aquesta instància no està connectada a una porta en viu, sinó que és la interfície i el codi exactes que s’executen a les portes (menys algunes funcions de seguretat).

--

Per a una integració encara més gran, podeu utilitzar la biblioteca IFTTT per Electric Imp.

Pas 1: reuniu les parts

Reuneix les parts
Reuneix les parts
  • Necessitareu un IMP elèctric amb almenys 4 GPIO disponibles, estic fent servir l’IMP001 amb un tauler d’abril.
  • Un regulador per baixar la tensió de la font fins a 5V. Estic fent servir un mòdul de baixada del convertidor Buck DC-DC. Versió MP1584EN d'eBoot d'Amazon.
  • Un mòdul de relé dual (o més) o un dispositiu de commutació similar que funcionarà amb la sortida IMP. Estic fent servir aquest mòdul de relé DC 5V JBtek de 4 canals d’Amazon.
  • Un terminal de cargol de 4 fils. Estic fent servir aquest bloc de barreres de cargol de terminal de cargol de 5 files, 2 files, 12 fil, 12V, d’Amazon.

Pas 2: subministraments

Subministraments
Subministraments

També necessitareu:

  • Accés a una impressora 3D o a una petita caixa de projectes
  • 4 cargols petits d'uns 4 mm x 6 mm per a la tapa de la caixa
  • Cable de connexió
  • Talladors de filferro
  • Decapants de filferro
  • Tornavisos petits
  • Soldador
  • Cola calenta o silicona
  • Corbates amb cremallera

Pas 3: reduïu la mida de la funda

Mida la caixa
Mida la caixa

Dissenyeu les peces per determinar quina mida necessitareu. Amb un disseny com es mostra a la fotografia, necessitaré un estoig d’uns 140 mm d’amplada, 70 mm de profunditat i 30 mm d’alçada.

Pas 4: convertidor de cable DC-DC

Convertidor de filferro CC-CC
Convertidor de filferro CC-CC

Retalleu 3 parells de cables de connexió vermells i negres per a les connexions d’alimentació dins i fora de la placa convertidor de CC-CC.

  • Entrada: 100 mm
  • Sortida a IMP: 90 mm
  • Mòdul de sortida al relé: 130 mm

Soldeu-los al tauler tal com es mostra.

Pas 5: alimentació de cable als dispositius

Alimentació per cable a dispositius
Alimentació per cable a dispositius
  • Connecteu l'entrada del convertidor CC-CC a dos dels punts del bloc de borns de cargol.
  • Soldeu els cables curts de sortida de 5V a l’IMP.
  • Soldeu els cables de sortida més llargs de 5V al mòdul de relé.

Pas 6: entrades del mòdul de relé de cable

Entrades del mòdul de relé de cable
Entrades del mòdul de relé de cable
  • Tallar cables de 4 x 90 mm per a les connexions d'entrada del mòdul de relé. Vaig utilitzar 4 colors separats per facilitar la consulta més endavant mentre codificava.
  • Soldeu els cables a les entrades del mòdul de relé 1-4 i després als primers 4 punts GPIO IMP (Pin1, 2, 5 i 7) respectivament.

Pas 7: IMP Power Jumper

IMP Power Jumper
IMP Power Jumper

És possible que hàgiu d’utilitzar l’alimentació USB mentre inicialment programeu i proveu la vostra IMP. Quan hàgiu acabat, assegureu-vos de moure el pont d'alimentació cap al costat BAT.

Pas 8: entrades d'estat de la porta de filferro

Entrades d'estat de la porta de filferro
Entrades d'estat de la porta de filferro
  • Tallar cables de 2 x 80 mm per a les entrades de l'estat de sac.
  • Connecteu els cables als 2 terminals de cargol restants.
  • Soldeu els cables als llocs IMP GPIO (Pin8 i 9) respectivament.

Pas 9: imprimeix o compra una funda

Imprimiu o compreu una funda
Imprimiu o compreu una funda

Podeu descarregar el meu fitxer. STL o. F3D per a aquest cas a GitHub o Thingiverse

Si no teniu accés a una impressora 3D, funcionarà una petita caixa genèrica de projecte.

Pas 10: decora el teu estoig

Decora el teu estoig
Decora el teu estoig

Perquè!

Vaig posar un text amb sagnat al meu i el vaig acolorir amb un punxegut negre. Si us sentiu aventurer, podeu utilitzar pintura acrílica, esmalt d’ungles o alguna cosa més per fer-la encara més llisa.

Pas 11: perforar el cable per als cables

Forat per a cables
Forat per a cables

Practicar un petit forat de 10-15 mm al costat prop del centre d’on s’uniran tots els cables.

He utilitzat un Unibit per a un forat net i llis del plàstic.

Pas 12: prepareu i instal·leu cables de connexió

Prepareu i instal·leu cables de connexió
Prepareu i instal·leu cables de connexió
Prepareu i instal·leu cables de connexió
Prepareu i instal·leu cables de connexió

Tallar cables de 9 x 5-600 mm per enganxar el nostre dispositiu a la placa de l’operador de la porta.

  • 2 per a l’entrada d’alimentació de 24 V.
  • 3 per a l'estat de la porta (2 entrades i una base comuna)
  • 2 per al senyal de porta oberta
  • 2 per al senyal de la porta de tancament

Gireu junts cadascun dels grups enumerats anteriorment mitjançant un trepant. Això farà que tot sigui més fàcil i es vegi millor.

Retireu i connecteu cadascun dels cables als terminals respectius tal com es mostra.

Pas 13: encaminar els cables de connexió

Rutes de connexió de cables
Rutes de connexió de cables

Encaminar els cables de connexió pel forat tal com es mostra.

Pas 14: muntar components

Components de muntatge
Components de muntatge

Col·loqueu i munteu els components amb una petita perla de cola calenta o silicona. No utilitzeu massa en cas que necessiteu eliminar una peça, utilitzeu-ne prou per assegurar-les.

Originalment volia imprimir la caixa amb clips / pestanyes per mantenir les taules al seu lloc, però necessitava instal·lar-la i no tenia temps. Afegir clips de tauler al vostre cas seria un bon toc.

Pas 15: segellar els cables de connexió

Segellar els cables de connexió
Segellar els cables de connexió

Segelleu els cables de connexió amb cola calenta o silicona.

Pas 16: tanqueu la funda

Tanqueu la funda
Tanqueu la funda

He utilitzat cargols petits de ~ 4 mm a la llista d’aquest estoig imprès en 3D. Si us preocupa la brutícia o la humitat, col·loqueu un cordó de silicona o cola calenta al voltant de la junta de la tapa abans de tancar-la.

Pas 17: instal·leu a Gate Operator

Instal·lació a Gate Operator
Instal·lació a Gate Operator
Instal·leu a Gate Operator
Instal·leu a Gate Operator

Al tauler principal:

  • Enganxeu els dos cables connectats a la sortida 1 del relé al terminal Open Gate. (vermell / marró a les fotos)
  • Enganxeu els dos cables connectats a la sortida de relé 2 al terminal Close Gate. (groc / blau a les fotos)
  • Enganxeu els dos cables connectats a l’entrada del convertidor CC-CC als terminals de cargol accessoris de 24 V (vermell / negre a les fotos)

Al tauler d’expansió

  • Saltar els terminals de cargol comuns del relé juntament amb un petit tros de filferro
  • Connecteu la terra comuna a un dels terminals de cargol comuns del relé (verd a les fotos)
  • Connecteu les 2 entrades d'estat de la porta (pin IMP8 i 9) als terminals de cargol oberts normals (NO) del relé (gris / groc a les fotos)

Encaminar els cables, lligar-los amb cremallera perquè quedin ordenats i trobar un lloc per muntar o ajustar la funda.

Hi ha fotos addicionals de resolució completa allotjades al dipòsit de GitHub.

Pas 18: definiu el mode de relé auxiliar

Estableix el mode de relé auxiliar
Estableix el mode de relé auxiliar

Configureu els commutadors de relés auxiliars tal com es mostra a la foto.

Això donarà a l’IMP els senyals que necessita per determinar si la porta està tancada, oberta, oberta o tancada.

Pas 19: Codi de dispositiu i agent IMP

Codi d’agent i dispositiu IMP
Codi d’agent i dispositiu IMP

Codi de l'agent Imp Imp.:

  • Creeu un model nou a Electric Imp IDE:
  • Substitueix l'URL per apuntar al servidor

// Funció de controlador

funció 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); envia resp. (200, "D'acord"); }} catch (ex) {// Si hi ha hagut un error, envieu-lo de nou al servidor de resposta.log ("error:" + ex); enviament (500, "Error intern del servidor:" + ex); }} // Registra el gestor HTTP http.onrequest (httpHandler); // funció de controlador GateStateChange funció gateStateChangeHandler (dades) {// URL al servei web url local = "https://projects.ajillion.com/save_gate_state"; // Estableix Content-Type header a json local headers = {"Content-Type": "application / json"}; // Codifica les dades rebudes i registra el cos local = http.jsonencode (dades); server.log (cos); // Envieu les dades al vostre servei web http.post (URL, capçaleres, cos).sendsync (); } // Registra el controlador gateStateChange device.on ("gateStateChange", gateStateChangeHandler);

Codi de l'agent Imp Electric:

  • Assigneu un dispositiu Imp al vostre model
  • Verifiqueu que els pins de maquinari estiguin aliats com a connectats

// Biblioteca Debouce

#require "Button.class.nut: 1.2.0" // Àlies de gateOpen pin GPIO (baix actiu) gateOpen <- hardware.pin2; // Àlies per al control de GateClose Pin GPIO (baix actiu) gateClose <- hardware.pin7; // Configureu 'gateOpen' perquè sigui una sortida digital amb un valor inicial de digital 1 (alt) gateOpen.configure (DIGITAL_OUT, 1); // Configureu 'gateClose' perquè sigui una sortida digital amb un valor inicial de digital 1 (alt) gateClose.configure (DIGITAL_OUT, 1); // Àlies del pin GPIO que indica que la porta es mou (N. O.) gateMovingState <- Botó (hardware.pin8, DIGITAL_IN_PULLUP); // Àlies del pin GPIO que indica que la porta està completament oberta (N. O.) gateOpenState <- Botó (hardware.pin9, DIGITAL_IN_PULLUP); // Variable global per mantenir l'estat de la porta (obert = 1 / tancat = 0) local lastGateOpenState = 0; // Latch Timer objecte local latchTimer = agent nul.on ("btn", funció (dades) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer)); latchTimer = imp.wakeup (1, releaseOpen); server.log ("S'ha rebut l'ordre obert"); cas "break 30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("S'ha rebut l'ordre Latch30m"); cas "break" latch8h ": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("S'ha rebut l'ordre Latch8h"); trencar "tancar": si (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Comanda tancada ara rebuda"); break default: server.log ("No es reconeix l'ordre del botó");}}); funció releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timer allibera el contacte del commutador gateOpen "); } funció releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timer ha llançat el contacte de tancament de tancament del commutador "); } gateMovingState.onPress (function () {// El relé està activat, la porta es mou //server.log("Gate is opening "); local data = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", dades);}). onRelease (function () {// El relé s'allibera, la porta està en repòs //server.log("Gate is closed "); local data = {"gatestate": 0, "temporitzador": hardware.millis ()}; agent.send ("gateStateChange", dades);}); gateOpenState.onPress (function () {// El relé està activat, la porta està totalment oberta //server.log("Gate is open "); local data = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", dades);}). onRelease (function () {// El relé s'allibera, la porta no està completament oberta //server.log("Gate is closing "); data local = {"gatestate": 3, "temporitzador": hardware.millis ()}; agent.send ("gateStateChange", data);});

Pas 20: Codi PHP del servei web

Codi PHP del servei web
Codi PHP del servei web

Vaig escriure aquest codi per al marc CodeIgniter perquè el vaig afegir a un projecte antic anterior. El controlador i el codi de visualització es poden adaptar fàcilment al marc que vulgueu.

Per simplificar les coses, he desat les dades JSON en un fitxer pla per emmagatzemar-les. Si necessiteu un registre o funcions relacionades amb dades més complexes, utilitzeu una base de dades.

La biblioteca ajax que he escrit i utilitzat en aquest projecte es pot descarregar des del dipòsit de GitHub: ThingEngineer / Codeigniter-jQuery-Ajax

Codi del controlador PHP:

  • app / controllers / projects.php
  • Assegureu-vos que el vostre script PHP tingui accés al camí de dades, tant els privilegis de localització com de lectura / escriptura.

load-> helper (matriu ('fitxer', 'data'));

$ data = json_decode (read_file ('../ app / logs / gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Tancat'; trencar; cas 1: $ view_data ['gatestate'] = 'S'està obrint …'; trencar; cas 2: $ view_data ['gatestate'] = 'Obert'; trencar; cas 3: $ view_data ['gatestate'] = 'Tancant …'; trencar; } $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data'), TRUE); $ view_data ['last_opened'] = interval de temps ($ last_opened ['last_opened'], time ()). 'fa'; // Carrega la vista $ t ['data'] = $ vista_dades; $ this-> load-> view ('gate_view', $ t); } funció save_gate_state () {$ this-> load-> helper ('file'); $ 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)); }} funció get_gate_state () {$ this-> load-> helper (array ('fitxer', 'data')); $ 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 temps ($ last_opened ['last_opened'], time ()). 'fa'; $ this-> ajax-> output_ajax ($ data, 'json', FALS); // envieu dades json, no apliqueu la sol·licitud ajax}} / * Fi del fitxer projects.php * / / * Ubicació:./application/controllers/projects.php * /

Codi de visualització PHP:

He utilitzat Bootstrap per a la interfície perquè és ràpid, fàcil i sensible. Podeu descarregar-lo aquí: https://getbootstrap.com (jQuery està inclòs)

  • app / controllers / gate_view.php
  • Substituïu EL CODI DEL VOSTRE AGENT pel vostre codi d’agent Electric Imp

IoT Gate Opperator Addon IoT Gate Opperator Addon

  • Inici
  • Administrador

Open Gate Latch Obert durant 30 min Latch Obert durant 8 hores Tanca ara Estat de la porta: última obertura $ (document). Ready (function () {resetStatus ();}) function sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("# open_gate"). feu clic a (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). text ("Obrint …");}); $ ("# latch30m_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). text ("Obrint …");}); $ ("# latch8h_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). text ("Obrint …");}); $ ("# close_gate"). feu clic a (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). text ("Tancament …");}); function resetStatus () {// URL de destinació var target = 'https://projects.ajillion.com/get_gate_state'; // Sol·licitud de dades var = {agent: 'app'}; // Envia una sol·licitud de publicació ajax $.ajax ({url: target, dataType: 'json', tipus: 'POST', data: data, èxit: funció (dades, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("# status"). Text ('Tancat'); break; cas 1: $ ("# status"). Text ('Opening …'); break; case 2: $ ("# status").text ('Obert'); interrupció; cas 3: $ ("estat # #"). text ('Tancament …'); interrupció; predeterminat: $ ("estat # #"). text ('Error');} $ ("#last_opened"). text (data.last_opened);}, error: funció (XMLHttpRequest, textStatus, errorThrown) {// Missatge d'error $ ("# status"). text ('Error del servidor');}}); setTimeout (resetStatus, 3000); }

Recomanat: