Turinys:

„WebApp“valdomų vartų operatoriaus priedas (IoT): 20 žingsnių (su paveikslėliais)
„WebApp“valdomų vartų operatoriaus priedas (IoT): 20 žingsnių (su paveikslėliais)

Video: „WebApp“valdomų vartų operatoriaus priedas (IoT): 20 žingsnių (su paveikslėliais)

Video: „WebApp“valdomų vartų operatoriaus priedas (IoT): 20 žingsnių (su paveikslėliais)
Video: Трактористы (комедия, реж. Иван Пырьев, 1939 г.) 2024, Liepa
Anonim
„WebApp“valdomų vartų operatoriaus priedas (IoT)
„WebApp“valdomų vartų operatoriaus priedas (IoT)
„WebApp“valdomų vartų operatoriaus priedas (IoT)
„WebApp“valdomų vartų operatoriaus priedas (IoT)
„WebApp“valdomų vartų operatoriaus priedas (IoT)
„WebApp“valdomų vartų operatoriaus priedas (IoT)

Turiu klientą, kuris turėjo uždarą zoną, kur daug žmonių turėjo ateiti ir išeiti. Jie nenorėjo naudoti klaviatūros išorėje ir turėjo tik ribotą skaičių pultelių siųstuvų. Buvo sunku rasti prieinamą šaltinį papildomiems raktams. Maniau, kad tai būtų puiki proga atnaujinti šį „Liftmaster“vartų operatorių, kad jis būtų suderinamas su daiktų internetu su pasirinkta aparatine įranga, žiniatinklio API ir žiniatinklio programų sąsaja. Tai ne tik išsprendė masinės prieigos problemą, bet ir atvėrė papildomų funkcijų!

Paskutinėje aukščiau esančioje nuotraukoje yra bandymo blokas, kurį beveik metus veikiau su užtrauktuku. Maniau, kad laikas atnaujinti!

Tai visiškai veikiantis sprendimas, turintis visą čia išvardytą kodą, aparatinės įrangos informaciją ir dizainą.

Visi projektų failai taip pat talpinami „GitHub“: github.com/ThingEngineer/IoT-Gate-Operator-Addon

„CodeIgniter WebApp“sąsajos pavyzdys priglobtas čia: project.ajillion.com/gate Šis egzempliorius nėra prijungtas prie tiesioginių vartų, bet yra tiksli sąsaja ir kodas, veikiantis prie vartų (atėmus kai kurias saugumo funkcijas).

--

Jei norite dar didesnės integracijos, galite naudoti IFTTT biblioteką „Electric Imp“.

1 žingsnis: Surinkite dalis

Surinkite dalis
Surinkite dalis
  • Jums reikės „Electric IMP“su bent 4 GPIO, aš naudoju IMP001 su balandžio mėnesio pertraukimo lenta.
  • Reguliatorius, kuris sumažina šaltinio įtampą iki 5 V. Aš naudoju DC-DC Buck Converter Step Down modulį. „eBoot“MP1584EN versija iš „Amazon“.
  • Dvigubas (ar daugiau) relinis modulis arba panašus perjungimo įrenginys, kuris veiks su IMP išvestimi. Aš naudoju šį „JBtek 4 Channel DC 5V Relay Module“iš „Amazon“.
  • 4 laidų varžtas. Aš naudoju šį „Amazon“5 vnt. 2 eilučių 12P vielos jungties varžto gnybtų barjerinį bloką 300V 20A.

2 žingsnis: reikmenys

Prekės
Prekės

Jums taip pat reikės:

  • Prieiga prie 3D spausdintuvo arba mažos projekto dėžutės
  • 4 maži varžtai apie 4 mm x 6 mm korpuso dangteliui
  • Prijungimo viela
  • Vielos pjaustytuvai
  • Vielos nuėmikliai
  • Maži atsuktuvai
  • Lituoklis
  • Karštas klijai arba silikonas
  • Užsegami užtrauktukais

3 žingsnis: padidinkite dėklo dydį

Padidinkite dėklo dydį
Padidinkite dėklo dydį

Išdėstykite dalis, kad nustatytumėte, kokio dydžio dėklo jums reikės. Su išdėstymu, kaip parodyta paveikslėlyje, man reikės maždaug 140 mm pločio, 70 mm gylio ir 30 mm aukščio dėklo.

4 žingsnis: vielos DC-DC keitiklis

Vielos DC-DC keitiklis
Vielos DC-DC keitiklis

Iškirpkite 3 poras raudonos ir juodos prijungimo laido, kad galėtumėte prijungti ir išjungti DC-DC keitiklio plokštę.

  • Įėjimas: 100 mm
  • Išėjimas į IMP: 90 mm
  • Išėjimas į relės modulį: 130 mm

Lituokite juos prie savo lentos, kaip parodyta.

5 veiksmas: prijunkite maitinimą prie įrenginių

Prijunkite maitinimą prie įrenginių
Prijunkite maitinimą prie įrenginių
  • Prijunkite DC-DC keitiklio įvestį prie dviejų varžto gnybtų bloko taškų.
  • Lituokite trumpus 5 V išėjimo laidus prie IMP.
  • Lituokite ilgesnius 5 V išėjimo laidus prie relės modulio.

6 žingsnis: vielos relės modulio įėjimai

Vielos relės modulio įėjimai
Vielos relės modulio įėjimai
  • Iškirpkite 4 x 90 mm laidus relės modulio įvesties jungtims. Koduodamas naudoju 4 atskiras spalvas, kad vėliau būtų lengviau rasti.
  • Lituokite laidus prie relės modulio įėjimų 1-4, tada į pirmąsias 4 IMP GPIO vietas (atitinkamai 1, 2, 5 ir 7).

7 žingsnis: „IMP Power Jumper“

IMP maitinimo megztinis
IMP maitinimo megztinis

Kai iš pradžių programuojate ir bandote savo IMP, gali tekti naudoti USB maitinimą. Baigę būtinai perkelkite maitinimo jungiklį į GPGB pusę.

8 veiksmas: vielos vartų būsenos įvestys

Vielos vartų būsenos įvestys
Vielos vartų būsenos įvestys
  • Nukirpkite 2 x 80 mm laidus, kad galėtumėte įvesti būsenos būseną.
  • Prijunkite laidus prie likusių 2 varžtų gnybtų.
  • Lituokite laidus prie IMP GPIO taškų (8 ir 9 kaiščiai).

9 veiksmas: atspausdinkite arba nusipirkite dėklą

Spausdinkite arba nusipirkite dėklą
Spausdinkite arba nusipirkite dėklą

Šiuo atveju galite atsisiųsti mano. STL arba. F3D iš „GitHub“arba „Thingiverse“

Jei neturite prieigos prie 3D spausdintuvo, veiks nedidelis bendras projekto dėklas.

10 žingsnis: papuoškite savo dėklą

Papuoškite savo dėklą
Papuoškite savo dėklą

Nes!

Aš įdėjau šiek tiek įdubusio teksto ir tiesiog nuspalvinau jį juodu aštriu. Jei jaučiatės nuotaikingai, galite naudoti akrilinius dažus, nagų laką ar ką nors kitą, kad jie net blizgėtų.

11 veiksmas: gręžkite skylę laidams

Gręžimo skylė laidams
Gręžimo skylė laidams

Išgręžkite nedidelę skylę 10-15 mm toje pusėje, kurioje yra visi laidai, viduryje.

Aš naudoju „Unibit“, kad plastikas būtų švarus ir lygus.

12 žingsnis: Paruoškite ir įdiekite prijungimo laidus

Paruoškite ir įdiekite prijungimo laidus
Paruoškite ir įdiekite prijungimo laidus
Paruoškite ir įdiekite prijungimo laidus
Paruoškite ir įdiekite prijungimo laidus

Iškirpkite 9 x 5-600 mm laidus, kad prijungtumėte mūsų prietaisą prie vartų valdymo plokštės.

  • 2 24V maitinimo šaltiniui
  • 3 vartų būsenai (2 įėjimai ir bendras pagrindas)
  • 2 - atvirų vartų signalas
  • 2 uždarymo vartų signalui

Naudodami grąžtą susukite kiekvieną iš aukščiau išvardytų grupių. Taip viskas bus lengviau ir atrodys geriau.

Išimkite ir prijunkite kiekvieną laidą prie atitinkamų gnybtų, kaip parodyta.

13 žingsnis: Maršruto prijungimo laidai

Maršruto prijungimo laidai
Maršruto prijungimo laidai

Prijunkite laidus per skylę, kaip parodyta.

14 žingsnis: Sumontuokite komponentus

Montavimo komponentai
Montavimo komponentai

Įdėkite ir pritvirtinkite komponentus nedideliu karšto klijų arba silikono karoliuku. Nenaudokite per daug, jei jums reikia pašalinti dalį, naudokite tik tiek, kad jas pritvirtintumėte.

Iš pradžių norėjau atspausdinti dėklą su spaustukais/skirtukais, kad plokštės laikytųsi vietoje, bet man reikėjo tai įdiegti ir neturėjau laiko. Pridėti lentos spaustukus prie savo dėklo būtų malonu.

15 žingsnis: užsandarinkite sujungimo laidus

Sandarinkite sujungimo laidus
Sandarinkite sujungimo laidus

Prijunkite laidus karštu klijais arba silikonu.

16 veiksmas: uždarykite dėklą

Uždaryti bylą
Uždaryti bylą

Šios 3D spausdintos dėžutės sąraše naudojau mažus ~ 4 mm varžtus. Jei nerimaujate dėl nešvarumų ar drėgmės, prieš uždarydami uždėkite silikono ar karštų klijų granulę aplink dangčio jungtį.

17 veiksmas: įdiekite vartų operatoriuje

Įdiekite „Gate Operator“
Įdiekite „Gate Operator“
Įdiekite „Gate Operator“
Įdiekite „Gate Operator“

Pagrindinėje plokštėje:

  • Prijunkite du laidus, prijungtus prie 1 relės išvesties, prie „Open Gate“gnybto. (raudona/ruda nuotraukose)
  • Prijunkite du laidus, prijungtus prie 2 relės išvesties, prie „Close Gate“gnybto. (nuotraukose geltona/mėlyna)
  • Prijunkite du laidus, prijungtus prie nuolatinės srovės keitiklio įvesties, prie 24 V priedų maitinimo varžtų gnybtų (raudona/juoda nuotraukose)

Išplėtimo plokštėje

  • Sujunkite relės bendrus varžtus su mažu vielos gabalu
  • Prijunkite bendrą žemę prie vieno iš relės bendrų varžtų gnybtų (žalia nuotraukose)
  • Prijunkite 2 vartų būsenos įvestis (IMP Pin8 ir 9) prie įprastai atidarytų (NO) relės varžtų gnybtų (pilka/geltona nuotraukose)

Išveskite laidus, užtraukite juos užtrauktuku, kad jie atrodytų tvarkingai, ir raskite vietą, kur pritvirtinti ar uždėti dėklą.

„GitHub“saugykloje yra papildomų visos raiškos nuotraukų.

18 veiksmas: nustatykite papildomo relės režimą

Nustatykite papildomo relės režimą
Nustatykite papildomo relės režimą

Nustatykite pagalbinius relės jungiklius, kaip parodyta nuotraukoje.

Tai suteiks IMP signalus, kurių reikia norint nustatyti, ar vartai uždaryti, atsidaryti, atidaryti ar uždaryti.

19 veiksmas: IMP agentas ir įrenginio kodas

IMP agentas ir įrenginio kodas
IMP agentas ir įrenginio kodas

„Electric Imp Agent“kodas:

  • Sukurkite naują modelį „Electric Imp IDE“:
  • Pakeiskite URL, kad nukreiptumėte į savo serverį

// HTTP tvarkyklės funkcija

funkcija httpHandler (req, resp) {try {local d = http.jsondecode (req.body); // serveris.log (d.c); if (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); arba atsiųsti (200, „Gerai“); }} catch (ex) {// Jei įvyko klaida, atsiųskite ją atgal į atsakymų serverį.log ("error:" + ex); resp.send (500, "Vidinė serverio klaida:" + ex); }} // Registruoti HTTP tvarkyklę http.onrequest (httpHandler); // GateStateChange tvarkyklės funkcijos funkcija gateStateChangeHandler (duomenys) {// URL į žiniatinklio paslaugą vietinis url = "https://projects.ajillion.com/save_gate_state"; // Nustatykite turinio tipo antraštę į json local headers = {"Content-Type": "application/json"}; // koduoti gautus duomenis ir registruoti vietinį kūną = http.jsonencode (duomenys); server.log (body); // Siųsti duomenis į savo žiniatinklio paslaugą http.post (url, headers, body).sendsync (); } // Registruoti gateStateChange tvarkyklę device.on ("gateStateChange", gateStateChangeHandler);

„Electric Imp Agent“kodas:

  • Priskirkite „Imp“įrenginį savo modeliui
  • Patikrinkite, ar aparatinės įrangos kaiščiai yra slapyvardžiai, kaip prijungti

// Debouce biblioteka

#require "Button.class.nut: 1.2.0" // „gateOpen“slapyvardis (aktyvus žemas) gateOpen <- hardware.pin2; // Vartų slapyvardisClose control GPIO pin (active low) gateClose <- hardware.pin7; // Konfigūruoti „gateOpen“kaip skaitmeninę išvestį, kurios pradinė vertė yra skaitmeninė 1 (aukšta) gateOpen.configure (DIGITAL_OUT, 1); // Konfigūruoti „gateClose“kaip skaitmeninę išvestį, kurios pradinė vertė yra skaitmeninė 1 (aukšta) gateClose.configure (DIGITAL_OUT, 1); // GPIO kaiščio slapyvardis, rodantis, kad vartai juda (N. O.) gateMovingState <- Button (hardware.pin8, DIGITAL_IN_PULLUP); // GPIO kaiščio slapyvardis, rodantis, kad vartai yra visiškai atidaryti (N. O.) gateOpenState <- Button (hardware.pin9, DIGITAL_IN_PULLUP); // Visuotinis kintamasis vartų būsenai palaikyti (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Užrakto laikmačio objektas vietinis latchTimer = null agent.on ("btn", funkcija (duomenys) {jungiklis (duomenys.cmd) {atvejis "atviras": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Atidaryta komanda gauta"); pertrauka "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m komanda gavo"); pertrauka "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("gauta komanda" Latch8h ""); pertrauka "uždaryti": if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log („Gauta komanda uždaryti dabar“); break default: server.log („Mygtuko komanda neatpažinta“);}}); funkcija releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log(" Laikmatis išleido vartusAtidaryti jungiklio kontaktą "); } funkcija releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log(" Laikmatis išleido vartusUždaryti jungiklio kontaktą "); } gateMovingState.onPress (function () {// Relė suaktyvinta, vartai juda //server.log(" Vartai atsidaro "); vietiniai duomenys = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", duomenys);}). onRelease (function () {// Relė atleista, vartai ramybėje // serveris.log ("Vartai uždaryti"); vietiniai duomenys = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", duomenys);}); gateOpenState.onPress (function () {// Relė suaktyvinta, vartai visiškai atidaryti //server.log(" Vartai atidaryti "); vietiniai duomenys = {" gatestate ": 2," laikmatis ": hardware.millis ()); agent.send ("gateStateChange", duomenys);}). onRelease (function () {// Relė atleista, vartai nėra visiškai atidaryti // serveris.log ("Vartai uždaromi"); vietiniai duomenys = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", duomenys);});

20 veiksmas: žiniatinklio tarnybos PHP kodas

Žiniatinklio paslaugos PHP kodas
Žiniatinklio paslaugos PHP kodas

Aš parašiau šį kodą „CodeIgniter“sistemai, nes pridėjau jį prie seno esamo projekto. Valdiklį ir rodinio kodą galima lengvai pritaikyti pagal jūsų pasirinktą sistemą.

Kad viskas būtų paprasta, išsaugojau JSON duomenis į plokščią failą duomenims saugoti. Jei jums reikia registravimo ar sudėtingesnių duomenų funkcijų, naudokite duomenų bazę.

„Ajax“biblioteką, kurią parašiau ir naudojau šiame projekte, galima atsisiųsti iš „GitHub“saugyklos: „ThingEngineer“/„Codeigniter-jQuery-Ajax“

PHP valdiklio kodas:

  • programa/valdikliai/projektai.php
  • Įsitikinkite, kad duomenų kelias pasiekiamas naudojant jūsų PHP scenarijų, tiek buvimo vietą, tiek skaitymo/rašymo teises.

load-> helper (masyvas ('failas', 'data'));

$ data = json_decode (skaitymo_failas ('../ app/logs/gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Uždarytas'; pertrauka; 1 atvejis: $ view_data ['gatestate'] = 'Atidaromas …'; pertrauka; 2 atvejis: $ view_data ['gatestate'] = 'Atviras'; pertrauka; 3 atvejis: $ view_data ['gatestate'] = 'Uždaromas …'; pertrauka; } $ last_opened = json_decode (skaitymo_failas ('../ app/logs/project/gateopened.data'), TRUE); $ view_data ['last_opened'] = laiko tarpas ($ last_opened ['last_opened'], laikas ()). ' prieš'; // Įkelti rodinį $ t ['data'] = $ view_data; $ this-> apkrova-> rodinys ('gate_view', $ t); } function save_gate_state () {$ this-> load-> helper ('failas'); $ data = file_get_contents ('php: // įvestis'); write_file ('../ app/logs/project/gatestate.data', $ duomenys); $ data = json_decode ($ data, TRUE); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app/logs/project/gateopened.data', json_encode ($ last_opened)); }} function get_gate_state () {$ this-> load-> helper (masyvas ('failas', 'data')); $ this-> apkrova-> biblioteka ('ajax'); $ data = json_decode (skaitymo_failas ('../ app/logs/project/gatestate.data'), TRUE); $ last_opened = json_decode (skaitymo_failas ('../ app/logs/project/gateopened.data'), TRUE); $ data ['last_opened'] = laiko tarpas ($ last_opened ['last_opened'], laikas ()). ' prieš'; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // siųskite „json“duomenis, nevykdykite „ajax“užklausos}}/ * Failo projektų pabaiga.php *// * Vieta:./application/controllers/projects.php */

PHP peržiūros kodas:

Priekinėje pusėje naudojau „Bootstrap“, nes tai greita, paprasta ir reaguoja. Ją galite atsisiųsti čia: https://getbootstrap.com (įtraukta „jQuery“)

  • programa/valdikliai/gate_view.php
  • Pakeiskite savo agento kodą savo „Electric Imp“agento kodu

„IoT Gate Opperator Addon“„IoT Gate Opperator Addon“

  • Namai
  • Administratorius

Atidaryti vartų skląstį Atidaryti 30 min. agent.electricimp.com/YOUR-AGENT-CODE “; $.post (url, JSONout); } $ ("#open_gate"). spustelėkite (funkcija () {var JSONout = '{"c": "btn", "val": {"cmd": "atidaryti"}}'; sendJSON (JSONout); $ ("#būsena"). text ("Atidaroma …");}); $ ("#latch30m_gate"). spustelėkite (funkcija () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#būsena"). text ("Atidaroma …");}); $ ("#latch8h_gate"). spustelėkite (funkcija () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#būsena"). text ("Atidaroma …");}); $ ("#close_gate"). spustelėkite (funkcija () {var JSONout = '{"c": "btn", "val": {"cmd": "uždaryti"}}'; sendJSON (JSONout); $ ("#būsena"). text ("Closing…");}); function resetStatus () {// Tikslinis url var target = 'https://projects.ajillion.com/get_gate_state'; // Užklausa var data = {agent: 'app'}; // Siųsti ajax įrašo užklausą $.ajax ({url: target, dataType: 'json', type: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("#status"). Text ('Closed'); break; case 1: $ ("#status"). Text ('Open …'); break; case 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) {// Klaidos pranešimas $ ("#status"). text ('Serverio klaida';}}); setTimeout (resetStatus, 3000); }

Rekomenduojamas: