INHOUDSOPGAWE:
- Stap 1: Versamel die onderdele
- Stap 2: Voorrade
- Stap 3: Maak die tas groter
- Stap 4: Draad DC-DC-omskakelaar
- Stap 5: Skakel krag na toestelle toe
- Stap 6: Invoer van draadaflosmodule
- Stap 7: IMP Power Jumper
- Stap 8: Wire Gate Status Invoer
- Stap 9: Druk of koop 'n saak
- Stap 10: Versier u kas
- Stap 11: Boorgat vir drade
- Stap 12: Berei voor en installeer aansluitingsdrade
- Stap 13: Roete -aansluitingsdrade
- Stap 14: Monteer komponente
- Stap 15: Seël aansluitingsdrade
- Stap 16: Maak die kas toe
- Stap 17: Installeer in Gate Operator
- Stap 18: Stel die Aux Relay -modus in
- Stap 19: IMP Agent en toestelkode
- Stap 20: PHP -kode vir webdiens
Video: WebApp Controlled Gate Operator-byvoeging (IoT): 20 stappe (met foto's)
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
Ek het 'n kliënt met 'n omheinde gebied waar baie mense moes kom en gaan. Hulle wou nie 'n bedieningspaneel aan die buitekant gebruik nie en het slegs 'n beperkte aantal afstandsbedieners. Dit was moeilik om 'n bekostigbare bron vir ekstra afstandsbedienings te vind. Ek het gedink dat dit 'n uitstekende geleentheid sou wees om hierdie Liftmaster -hekoperateur op te gradeer om IoT -versoenbaar te wees met persoonlike hardeware, web -API en web -app -koppelvlak. Dit het nie net die massatoegangsprobleem opgelos nie, dit het ook ekstra funksies oopgemaak!
Op die laaste foto hierbo is die toetseenheid wat ek amper 'n jaar lank in 'n rits sak gehardloop het. Ek het gedink dit is tyd vir 'n opgradering!
Dit is 'n ten volle funksionerende oplossing met al die kode, hardeware -inligting en ontwerpe wat hier gelys word.
Al die projeklêers word ook op GitHub gehuisves: github.com/ThingEngineer/IoT-Gate-Operator-Addon
'N Voorbeeld van die CodeIgniter WebApp -koppelvlak word hier aangebied: projects.ajillion.com/gate.
--
Vir nog groter integrasie kan u die IFTTT -biblioteek vir Electric Imp gebruik.
Stap 1: Versamel die onderdele
- U benodig 'n elektriese IMP met ten minste 4 GPIO's beskikbaar; ek gebruik die IMP001 met 'n uitbreekbord in April.
- 'N Reguleerder om die bronspanning tot 5V te verlaag. Ek gebruik 'n DC-DC Buck Converter Step Down-module. eBoot se MP1584EN weergawe van Amazon.
- 'N Dubbele (of meer) relaismodule of soortgelyke skakelapparaat wat met die IMP -uitset werk. Ek gebruik hierdie een JBtek 4 Channel DC 5V Relay Module van Amazon.
- 'N 4 -draads skroefaansluiting. Ek gebruik hierdie een 5 stuks 2 rye 12p draadverbinder skroefaansluitblok 300V 20A van Amazon.
Stap 2: Voorrade
U benodig ook:
- Toegang tot 'n 3D -drukker of 'n klein projekboks
- 4 klein skroewe ongeveer 4 mm x 6 mm vir die deksel van die omhulsel
- Aansluitdraad
- Draadknipper
- Draadstroppers
- Klein skroewedraaiers
- Soldeerbout
- Warm gom of silikoon
- Ritssluitings
Stap 3: Maak die tas groter
Stel u onderdele op om te bepaal watter grootte omhulsel u benodig. Met 'n uitleg soos op die foto, benodig ek 'n omhulsel van ongeveer 140 mm breed, 70 mm diep en 30 mm lank.
Stap 4: Draad DC-DC-omskakelaar
Sny 3 pare rooi en swart aansluitdraad vir kragverbindings in en uit die DC-DC-omskakelbord.
- Invoer: 100 mm
- Uitset na IMP: 90 mm
- Uitset na relaismodule: 130 mm
Soldeer dit aan u bord soos aangedui.
Stap 5: Skakel krag na toestelle toe
- Koppel die ingang van die DC-DC-omskakelaar aan twee van die punte op die skroefklemmenblok.
- Soldeer die kort 5V -uitvoerdrade aan die IMP.
- Soldeer die langer 5V -uitgangsdrade aan die aflosmodule.
Stap 6: Invoer van draadaflosmodule
- Sny 4 x 90 mm drade vir die relaismodule -invoerverbindings. Ek het 4 afsonderlike kleure gebruik om later maklik te verwys terwyl ek kodeer.
- Soldeer die drade aan die aflosmodule se insette 1-4, dan na die eerste 4 IMP GPIO-plekke (Pin1, 2, 5 en 7) onderskeidelik.
Stap 7: IMP Power Jumper
U moet moontlik USB -krag gebruik terwyl u u IMP aanvanklik programmeer en toets. As u klaar is, moet u die trui na die BAT -kant skuif.
Stap 8: Wire Gate Status Invoer
- Sny 2 x 80 mm -drade vir die status -insette.
- Verbind die drade met die oorblywende 2 skroefklemme.
- Soldeerdrade na onderskeidelik die volgende aan IMP GPIO -kolle (Pin8 en 9).
Stap 9: Druk of koop 'n saak
U kan my. STL of. F3D vir hierdie geval op GitHub of Thingiverse aflaai
As u nie toegang tot 'n 3D -drukker het nie, werk 'n klein generiese projekkas.
Stap 10: Versier u kas
Want!
Ek het 'n ingedrukte teks op myne geplaas en dit net met 'n swart skerp ingekleur. As u avontuurlustig voel, kan u akrielverf, naellak of iets anders gebruik om dit nog gladder te maak.
Stap 11: Boorgat vir drade
Boor 'n klein gaatjie van 10-15 mm aan die kant naby die middel waar al die drade bymekaar kom.
Ek het 'n Unibit gebruik vir 'n skoon, gladde gat in die plastiek.
Stap 12: Berei voor en installeer aansluitingsdrade
Sny 9 x 5-600 mm drade om ons toestel aan die hekoperatorbord te koppel.
- 2 vir die ingang van 24V
- 3 vir die hekstatus (2 insette en 'n gemeenskaplike grond)
- 2 vir die oop heksein
- 2 vir die sluitheksein
Draai elk van die bogenoemde groepe saam met 'n boor. Dit sal alles makliker maak en beter lyk.
Trek die drade af en verbind hulle met die onderskeie terminale soos aangedui.
Stap 13: Roete -aansluitingsdrade
Lei die aansluitdrade deur die gat soos getoon.
Stap 14: Monteer komponente
Plaas en monteer komponente met 'n klein kraal warm gom of silikoon. Moenie te veel gebruik as u 'n onderdeel moet verwyder nie; gebruik net genoeg om dit te beveilig.
Ek wou oorspronklik die omhulsel met clips/oortjies druk om die planke op hul plek te hou, maar ek moes dit installeer en het nie tyd nie. Dit is 'n goeie idee om bordknipsels by u tas te voeg.
Stap 15: Seël aansluitingsdrade
Maak die aansluitdrade toe met warm gom of silikoon.
Stap 16: Maak die kas toe
Ek gebruik klein skroewe van ongeveer 4 mm op die lys van hierdie 3D -gedrukte omhulsel. As u bekommerd is oor vuil of vog, plaas 'n kraal silikoon of warm gom om die dekselverbinding voordat u dit toemaak.
Stap 17: Installeer in Gate Operator
Op die hoofbord:
- Haak die twee drade wat verbind is met relaisuitgang 1 aan die Open Gate -terminale. (rooi/bruin op foto's)
- Haak die twee drade wat verbind is met relaisuitgang 2 aan die Close Gate -terminale. (geel/blou op foto's)
- Haak die twee drade wat gekoppel is aan die ingang van die DC-DC-omskakelaar aan die 24V-bykomende kragskroefaansluitings (rooi/swart op foto's)
Op die uitbreidingsbord
- Verbind die aflosskroefaansluitings saam met 'n klein stuk draad
- Koppel die gemeenskaplike grond aan een van die aflosskroefaansluitings (groen op foto's)
- Koppel die 2 hekstatus -ingange (IMP Pin8 & 9) aan die relais se normale oop (NO) skroefaansluitings (grys/geel op foto's)
Trek die drade vas, maak dit vas met 'n ritssluiting om dit netjies te lyk en vind 'n plek om dit op te sit of om jou tas te plaas.
Daar is addisionele foto's met volledige resolusie wat op die GitHub -bewaarplek aangebied word.
Stap 18: Stel die Aux Relay -modus in
Stel die hulprelaisskakelaars in soos op die foto getoon.
Dit gee die IMP die seine wat hy nodig het om te bepaal of die hek gesluit, oop, oop of toe is.
Stap 19: IMP Agent en toestelkode
Kode vir elektriese impagente:
- Skep 'n nuwe model in die Electric Imp IDE:
- Vervang die URL om na u bediener te verwys
// HTTP -hanteerderfunksie
funksie httpHandler (req, resp) {probeer {local d = http.jsondecode (req.body); // server.log(d.c); as (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); resp.stuur (200, "OK"); }} catch (ex) {// As daar 'n fout was, stuur dit terug in die response server.log ("error:" + ex); resp.send (500, "Interne bedienerfout:" + ex); }}} // Registreer HTTP -hanteerder http.onrequest (httpHandler); // GateStateChange hanteerfunksie funksie gateStateChangeHandler (data) {// URL na web diens local url = "https://projects.ajillion.com/save_gate_state"; // Stel inhoud-tipe opskrif in op json local headers = {"Content-Type": "application/json"}; // Kodeer ontvangde data en teken plaaslike liggaam aan = http.jsonencode (data); bediener.log (liggaam); // Stuur die data na u webdiens http.post (url, headers, body).sendsync (); } // Registreer gateStateChange handler device.on ("gateStateChange", gateStateChangeHandler);
Kode vir elektriese impagente:
- Ken 'n Imp -toestel aan u model toe
- Verifieer dat hardewarepennetjies gekoppel is as verbind
// Debouce -biblioteek
#vereis "Button.class.nut: 1.2.0" // Alias vir gateOpen GPIO pin (active low) gateOpen <- hardware.pin2; // Alias vir gateClose control GPIO pin (active low) gateClose <- hardware.pin7; // Stel 'gateOpen' op as 'n digitale uitset met 'n beginwaarde van digitaal 1 (hoog) gateOpen.configure (DIGITAL_OUT, 1); // Stel 'gateClose' op as 'n digitale uitset met 'n beginwaarde van digitale 1 (hoë) gateClose.configure (DIGITAL_OUT, 1); // Alias vir die GPIO-pen wat aandui dat die hek beweeg (N. O.) gateMovingState <- Knoppie (hardware.pin8, DIGITAL_IN_PULLUP); // Alias vir die GPIO-pen wat aandui dat die hek heeltemal oop is (N. O.) gateOpenState <- Knoppie (hardware.pin9, DIGITAL_IN_PULLUP); // Globale veranderlike om die poorttoestand te hou (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Latch Timer -voorwerp plaaslike latchTimer = null agent.on ("btn", funksie (data) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1, releaseOpen); server.log ("oop opdrag ontvang"); breek geval "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m opdrag ontvang"); break case "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Latch8h -opdrag ontvang"); breek geval "sluit": as (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Sluit nou opdrag ontvang"); standaard breek: server.log ("Knoppie opdrag nie herken nie");}}); funksie releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timer vrygestel gateOp skakelaar kontak "); } funksie releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timer vrygestel gateClose switch contact "); } gateMovingState.onPress (funksie () {// Die aflos is geaktiveer, hek beweeg //server.log("Gate maak oop "); plaaslike data = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (funksie () {// Die aflos word vrygestel, hek is in rus //server.log("Gate is gesluit "); plaaslike data = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);}); gateOpenState.onPress (function () {// Die aflos is geaktiveer, hek is heeltemal oop //server.log("Gate is oop "); plaaslike data = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (funksie () {// Die aflos word vrygestel, hek is nie heeltemal oop // server.log("Gate sluit "); plaaslike data = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);});
Stap 20: PHP -kode vir webdiens
Ek het hierdie kode vir die CodeIgniter -raamwerk geskryf omdat ek dit by 'n ou bestaande projek gevoeg het. Die beheerder en aansigkode kan maklik aangepas word by die raamwerk van u keuse.
Om dinge eenvoudig te hou, het ek JSON -data in 'n plat lêer gestoor om data te stoor. Gebruik 'n databasis as u aanmeld of meer komplekse dataverwante funksies benodig.
Die ajax-biblioteek wat ek in hierdie projek geskryf en gebruik het, kan afgelaai word vanaf die GitHub-bewaarplek: ThingEngineer/Codeigniter-jQuery-Ajax
PHP -beheerkode:
- app/beheerders/projects.php
- Maak seker dat die data -pad toeganklik is deur u PHP -script, beide ligging- en lees-/skryfregte.
load-> helper (array ('file', 'date'));
$ data = json_decode (read_file ('../ app/logs/gatestate.data'), WAAR); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Geslote'; breek; saak 1: $ view_data ['gatestate'] = 'Maak oop'; breek; saak 2: $ view_data ['gatestate'] = 'Maak oop'; breek; saak 3: $ view_data ['gatestate'] = 'Sluit …'; breek; } $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), WAAR); $ view_data ['last_opened'] = tydsduur ($ last_opened ['last_opened'], time ()). ' gelede'; // Laai aansig $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } funksie 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, WAAR); as ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => tyd ()); write_file ('../ app/logs/projects/gateopened.data', json_encode ($ last_opened)); }} funksie get_gate_state () {$ this-> load-> helper (array ('file', 'date')); $ this-> load-> biblioteek ('ajax'); $ data = json_decode (read_file ('../ app/logs/projects/gatestate.data'), WAAR); $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), WAAR); $ data ['last_opened'] = tydsduur ($ last_opened ['last_opened'], time ()). ' gelede'; $ this-> ajax-> output_ajax ($ data, 'json', ONWAAR); // stuur json -data, moenie ajax -versoek afdwing nie}}/ * Einde lêer projects.php *// * Location:./application/controllers/projects.php */
PHP View -kode:
Ek het Bootstrap vir die voorkant gebruik, want dit is vinnig, maklik en responsief. U kan dit hier aflaai: https://getbootstrap.com (jQuery is ingesluit)
- app/beheerders/gate_view.php
- Vervang U-AGENT-KODE met u Electric Imp agent-kode
IoT Gate Opperator Addon IoT Gate Opperator Addon
- Tuis
- admin
Open Gate -grendel Maak oop vir 30 minute Grendel 8 uur oop Nou sluit status: Laaste geopen $ (dokument).ready (function () {resetStatus ();}) funksie sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("#open_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). teks ("Maak oop …");}); $ ("#latch30m_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). teks ("Maak oop …");}); $ ("#latch8h_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). teks ("Maak oop …");}); $ ("#close_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). teks ("Sluit …");}); funksie resetStatus () {// Doel url var target = 'https://projects.ajillion.com/get_gate_state'; // Versoek var data = {agent: 'app'}; // Stuur ajax -posversoek $.ajax ({url: target, dataType: 'json', type: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("#status"). Teks ('Geslote'); onderbreking; saak 1: $ ('#status'). Teks ('Opening …'); breek; saak 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) {// Foutboodskap $ ("#status"). text ('Server Error');}}); setTimeout (resetStatus, 3000); }