WebApp Controlled Gate Operator-byvoeging (IoT): 20 stappe (met foto's)
WebApp Controlled Gate Operator-byvoeging (IoT): 20 stappe (met foto's)

Video: WebApp Controlled Gate Operator-byvoeging (IoT): 20 stappe (met foto's)

Video: WebApp Controlled Gate Operator-byvoeging (IoT): 20 stappe (met foto's)
Video: Thomas Campbell: Ego, Paranormal Psi, My Big TOE 2025, Januarie
Anonim
WebApp-beheerde hekoperateur-byvoeging (IoT)
WebApp-beheerde hekoperateur-byvoeging (IoT)
WebApp-beheerde hekoperateur-byvoeging (IoT)
WebApp-beheerde hekoperateur-byvoeging (IoT)
WebApp-beheerde hekoperateur-byvoeging (IoT)
WebApp-beheerde hekoperateur-byvoeging (IoT)

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

Versamel die onderdele
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

Voorrade
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

Maak die tas groter
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

Draad DC-DC omskakelaar
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

Dra krag na toestelle
Dra krag na toestelle
  • 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

Invoer van draadaflosmodule
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

IMP Power Jumper
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

Wire Gate Status insette
Wire Gate Status insette
  • 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

Druk of koop 'n saak
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

Versier jou kas
Versier jou 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

Boorgat vir drade
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

Berei voor en installeer aansluitingsdrade
Berei voor en installeer aansluitingsdrade
Berei voor en installeer aansluitingsdrade
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

Roete -aansluitingsdrade
Roete -aansluitingsdrade

Lei die aansluitdrade deur die gat soos getoon.

Stap 14: Monteer komponente

Monteer komponente
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

Sluit aansluitingsdrade
Sluit aansluitingsdrade

Maak die aansluitdrade toe met warm gom of silikoon.

Stap 16: Maak die kas toe

Maak die saak toe
Maak die saak 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

Installeer in Gate Operator
Installeer in Gate Operator
Installeer in Gate Operator
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 Aux Relay -modus in
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

IMP -agent en toestelkode
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

Webdiens PHP -kode
Webdiens PHP -kode

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); }