Taula de continguts:
- Pas 1: reuniu les parts
- Pas 2: subministraments
- Pas 3: reduïu la mida de la funda
- Pas 4: convertidor de cable DC-DC
- Pas 5: alimentació de cable als dispositius
- Pas 6: entrades del mòdul de relé de cable
- Pas 7: IMP Power Jumper
- Pas 8: entrades d'estat de la porta de filferro
- Pas 9: imprimeix o compra una funda
- Pas 10: decora el teu estoig
- Pas 11: perforar el cable per als cables
- Pas 12: prepareu i instal·leu cables de connexió
- Pas 13: encaminar els cables de connexió
- Pas 14: muntar components
- Pas 15: segellar els cables de connexió
- Pas 16: tanqueu la funda
- Pas 17: instal·leu a Gate Operator
- Pas 18: definiu el mode de relé auxiliar
- Pas 19: Codi de dispositiu i agent IMP
- Pas 20: Codi PHP del servei web
Vídeo: Complement per a operador de portes controlades de WebApp (IoT): 20 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:16
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
- 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
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
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
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
- 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
- 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
É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
- 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
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
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
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ó
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ó
Encaminar els cables de connexió pel forat tal com es mostra.
Pas 14: muntar components
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ó
Segelleu els cables de connexió amb cola calenta o silicona.
Pas 16: 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
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
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 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
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:
Bricolatge - Pantalles LED RGB controlades per Arduino: 5 passos (amb imatges)
Bricolatge | Ombres LED RGB controlades per Arduino: avui us ensenyaré com podeu construir les vostres pròpies ulleres LED RGB molt fàcilment i econòmicament Aquest sempre ha estat un dels meus grans somnis i finalment es va fer realitat! Un gran crit a NextPCB per patrocinar aquest projecte. Són fabricants de PCB
Tires de llum LED amb decoloració controlades per sensor, alimentades per Arduino: 6 passos (amb imatges)
Tires de llum LED amb desconnexió controlades per sensor Arduino: recentment he actualitzat la cuina i sabia que la il·luminació “elevaria” l’aspecte dels armaris. Vaig optar per "True Handless", així que tinc un buit sota la superfície de treball, així com un kickboard, sota l'armari i a la part superior dels armaris disponibles i
Llums automàtics connectats amb control de portes i portes: 5 passos
Llums automàtics connectats amb el control de portes i portes: Sembla que és molt difícil trobar la placa de commutació a les fosques, però aquest projecte és molt útil per resoldre aquest problema. Seguiu els passos següents per conèixer la solució
Iron Man Low-Poly amb tires LED controlades per Wifi: 8 passos (amb imatges)
Home de ferro baix en polièster amb tires LED controlades per wifi: aquesta peça interactiva d’art mural és aproximadament de 39 "; alt i 24 " ample. Vaig tallar la fusta amb làser a Student Makerspace de la Universitat de Clemson, després vaig pintar tots els triangles a mà i hi vaig instal·lar els llums a la part posterior. Aquesta instrucció
Maleta per a operador de butxaca Lasercut: 3 passos (amb imatges)
Pocket Operator Lasercut Case: amb publicitat per als propers operadors Pocket PO-33 i PO-35 de Teenage Engineering, vaig decidir que era hora de compartir el meu senzill "case" que vaig fer per al meu PO-20. És realment senzill. De fet, és tan senzill que la premsa la manté al seu lloc