Sadržaj:

Dodatak za upravljača kapijama WebApp (IoT): 20 koraka (sa slikama)
Dodatak za upravljača kapijama WebApp (IoT): 20 koraka (sa slikama)

Video: Dodatak za upravljača kapijama WebApp (IoT): 20 koraka (sa slikama)

Video: Dodatak za upravljača kapijama WebApp (IoT): 20 koraka (sa slikama)
Video: «Интернет вещей», Джеймс Уиттакер из Microsoft 2024, Juli
Anonim
Dodatak za WebApp upravljane kapije (IoT)
Dodatak za WebApp upravljane kapije (IoT)
Dodatak za WebApp upravljane kapije (IoT)
Dodatak za WebApp upravljane kapije (IoT)
Dodatak za WebApp upravljane kapije (IoT)
Dodatak za WebApp upravljane kapije (IoT)

Imam klijenta koji je imao zatvoreno područje gdje je mnogo ljudi moralo doći i otići. Nisu htjeli koristiti vanjsku tastaturu i imali su samo ograničen broj odašiljača. Bilo je teško pronaći pristupačan izvor dodatnih privjesaka za ključeve. Mislio sam da bi to bila izvrsna prilika za nadogradnju ovog operatera kapije Liftmaster kako bi bio IoT kompatibilan s prilagođenim hardverom, web API -jem i sučeljem web aplikacije. Ovo nije samo riješilo problem masovnog pristupa, već je otvorilo i dodatne funkcionalnosti!

Na zadnjoj fotografiji gore je testna jedinica koju sam trčao skoro godinu dana u torbi sa zatvaračem. Mislio sam da je vrijeme za nadogradnju!

Ovo je potpuno funkcionalno rješenje sa svim ovdje navedenim kodom, hardverskim podacima i dizajnom.

Sve datoteke projekata također su hostirane na GitHub-u: github.com/ThingEngineer/IoT-Gate-Operator-Addon

Primjer sučelja CodeIgniter WebApp smješten je ovdje: projects.ajillion.com/gate Ova instanca nije povezana s aktivnim vratima, već je točno sučelje i kod koji se izvode na vratima (minus neke sigurnosne značajke).

--

Za još veću integraciju možete koristiti IFTTT biblioteku za Electric Imp.

Korak 1: Prikupite dijelove

Prikupite dijelove
Prikupite dijelove
  • Trebat će vam električni IMP sa najmanje 4 dostupna GPIO -a, ja koristim IMP001 sa aprilskom pločom za razbijanje.
  • Regulator za smanjenje napona izvora na 5V. Koristim DC-DC Buck Converter Modul za stepenice prema dolje. eBoot -ova MP1584EN verzija sa Amazona.
  • Dvostruki (ili više) relejni modul ili sličan sklopni uređaj koji će raditi s izlazom IMP -a. Koristim ovaj JBtek 4 -kanalni DC 5V relejni modul iz Amazona.
  • 4 -žični vijčani terminal. Koristim ovaj jedan 5 -komadni 2 -redni 12P -ožičeni konektor s vijčanim priključnim ogradnim blokom 300V 20A iz Amazona.

Korak 2: Potrošni materijal

Supplies
Supplies

Takođe će vam trebati:

  • Pristup 3D štampaču ili maloj projektnoj kutiji
  • 4 mala vijka oko 4 mm x 6 mm za poklopac kućišta
  • Spojna žica
  • Rezači žice
  • Strojevi za skidanje žice
  • Mali odvijači
  • Lemilica
  • Vruće ljepilo ili silikon
  • Zip kravate

Korak 3: Povećajte veličinu kućišta

Povećajte veličinu kućišta
Povećajte veličinu kućišta

Rasporedite svoje dijelove kako biste odredili koja vam veličina kućišta treba. Sa rasporedom na slici trebaće mi kućište koje je široko oko 140 mm, duboko 70 mm i visoko 30 mm.

Korak 4: Žičani DC-DC pretvarač

Žični DC-DC pretvarač
Žični DC-DC pretvarač

Izrežite 3 para crvene i crne priključne žice za priključivanje napajanja na i iz DC-DC pretvaračke ploče.

  • Ulaz: 100 mm
  • Izlaz na IMP: 90 mm
  • Izlaz na relejni modul: 130 mm

Lemite ih na ploču kao što je prikazano.

Korak 5: Priključite napajanje na uređaje

Spojite napajanje na uređaje
Spojite napajanje na uređaje
  • Spojite ulaz DC-DC pretvarača na dvije točke na vijčanoj stezaljci.
  • Lemite kratke izlazne žice od 5 V na IMP.
  • Lemite duže 5V izlazne žice na relejni modul.

Korak 6: Ulazi modula žičanog releja

Ulazi žičanih relejnih modula
Ulazi žičanih relejnih modula
  • Izrežite žice 4 x 90 mm za ulazne priključke relejnog modula. Koristio sam 4 odvojene boje za lakše snalaženje kasnije tokom kodiranja.
  • Lemite žice na ulaze 1-4 relejnog modula, zatim na prve 4 IMP GPIO tačke (Pin1, 2, 5 i 7).

Korak 7: IMP prekidač za napajanje

IMP prekidač za napajanje
IMP prekidač za napajanje

Možda ćete morati koristiti USB napajanje dok u početku programirate i testirate svoj IMP. Kad završite, pomaknite kratkospojnik za napajanje na stranu BAT.

Korak 8: Ulazi statusa žičane kapije

Ulazi statusa žičane kapije
Ulazi statusa žičane kapije
  • Izrežite 2 x 80 mm žice za ulaze statusa sate.
  • Spojite žice na preostala 2 vijčana terminala.
  • Lemiti žice do IMP GPIO tačaka (Pin8 i 9).

Korak 9: Odštampajte ili kupite futrolu

Odštampajte ili kupite futrolu
Odštampajte ili kupite futrolu

Za ovaj slučaj možete preuzeti moj. STL ili. F3D na GitHub ili Thingiverse

Ako nemate pristup 3D štampaču, radit će mali generički projekt.

Korak 10: Ukrasite kućište

Ukrasite svoju futrolu
Ukrasite svoju futrolu

Jer!

Stavila sam neki uvučeni tekst na svoj i obojila ga crnom oštricom. Ako se osjećate avanturistički, možete upotrijebiti akrilnu boju, lak za nokte ili nešto drugo kako biste ga učinili još glatkijim.

Korak 11: Izbušite rupu za žice

Bušilica za žice
Bušilica za žice

Izbušite malu rupu 10-15 mm sa strane blizu sredine mjesta gdje će se sve žice spojiti.

Koristio sam Unibit za čistu, glatku rupu u plastici.

Korak 12: Pripremite i instalirajte spojne žice

Pripremite i instalirajte spojne žice
Pripremite i instalirajte spojne žice
Pripremite i instalirajte spojne žice
Pripremite i instalirajte spojne žice

Izrežite žice dimenzija 9 x 5-600 mm za pričvršćivanje našeg uređaja na upravljačku ploču kapije.

  • 2 za ulaz 24V napajanja
  • 3 za status kapije (2 ulaza i zajedničko uzemljenje)
  • 2 za signal otvorene kapije
  • 2 za signal zatvaranja kapije

Uvrnite zajedno svaku od gore navedenih grupa bušilicom. Tako će sve biti lakše i izgledati bolje.

Skinite i spojite svaku žicu na odgovarajuće priključke kao što je prikazano.

Korak 13: Usmjerite spojne žice

Usmjerite spojne žice
Usmjerite spojne žice

Provucite spojne žice kroz rupu kao što je prikazano.

Korak 14: Montirajte komponente

Komponente montiranja
Komponente montiranja

Postavite i montirajte komponente malim zrnom vrućeg ljepila ili silikona. Nemojte koristiti previše u slučaju da trebate ukloniti dio, upotrijebite samo toliko da ih učvrstite.

Prvobitno sam htio odštampati kućište sa isječcima/jezičcima da drže ploče na mjestu, ali morao sam ovo instalirati i nisam imao vremena. Dodavanje isječaka na ploču vašem kućištu bio bi lijep dodir.

Korak 15: Zabrtvite spojne žice

Zapečatite spojne žice
Zapečatite spojne žice

Spojite žice za spajanje vrućim ljepilom ili silikonom.

Korak 16: Zatvorite kućište

Zatvorite kućište
Zatvorite kućište

Koristio sam male vijke ~ 4 mm na popisu ovog 3D štampanog kućišta. Ako ste zabrinuti zbog prljavštine ili vlage, stavite zrnce silikona ili vruće ljepilo oko zgloba poklopca prije zatvaranja.

Korak 17: Instalirajte u Gate Operator

Instalirajte u Gate Operator
Instalirajte u Gate Operator
Instalirajte u Gate Operator
Instalirajte u Gate Operator

Na glavnoj ploči:

  • Priključite dvije žice spojene na relejni izlaz 1 na stezaljku Open Gate. (crveno/smeđe na fotografijama)
  • Priključite dvije žice spojene na relejni izlaz 2 na terminal Close Gate. (žuto/plavo na fotografijama)
  • Priključite dvije žice spojene na ulaz DC-DC pretvarača na priključke za vijke za napajanje dodatne opreme od 24 V (crveno/crno na fotografijama)

Na ploči za proširenje

  • Spojite zajedničke vijčane stezaljke releja zajedno s malim komadom žice
  • Spojite zajedničko uzemljenje na jedan od zajedničkih vijčanih terminala releja (na fotografijama zeleno)
  • Spojite dva ulaza statusa vrata (IMP Pin8 i 9) na normalne otvorene kontakte releja (NO) (na fotografijama sivo/žuto)

Provucite žice, zavežite ih patentnim zatvaračem kako biste izgledali uredno i pronašli mjesto za montiranje ili postavljanje kućišta.

Postoje dodatne fotografije pune rezolucije koje se nalaze na GitHub spremištu.

Korak 18: Postavite Aux Relay način rada

Postavite Aux Relay način rada
Postavite Aux Relay način rada

Postavite prekidače pomoćnog releja kao što je prikazano na fotografiji.

Ovo će IMP -u dati signale potrebne za utvrđivanje da li su vrata zatvorena, otvorena, otvorena ili zatvorena.

Korak 19: IMP agent i kod uređaja

IMP agent i kod uređaja
IMP agent i kod uređaja

Šifra agenta Electric Imp Agent:

  • Kreirajte novi model u IDE -u Electric Imp:
  • Zamijenite URL da pokazuje na vaš poslužitelj

// HTTP funkcija rukovatelja

funkcija httpHandler (req, resp) {probajte {lokalni d = http.jsondecode (req.body); //server.log(d.c); if (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); Resp.send (200, "OK"); }} catch (ex) {// Ako je došlo do greške, pošaljite je nazad u odgovor server.log ("error:" + ex); resp.send (500, "Interna greška servera:" + ex); }} // Registrirajte HTTP rukovatelj http.onrequest (httpHandler); // GateStateChange funkcija funkcije rukovaoca gateStateChangeHandler (podaci) {// URL do lokalnog url web servisa = "https://projects.ajillion.com/save_gate_state"; // Postavite zaglavlje Content-Type na json lokalna zaglavlja = {"Content-Type": "application/json"}; // Kodiranje primljenih podataka i evidentiranje lokalnog tijela = http.jsonencode (podaci); server.log (body); // Slanje podataka na vašu web uslugu http.post (url, zaglavlja, tijelo).sendsync (); } // Registrirajte gateStateChange rukovatelj device.on ("gateStateChange", gateStateChangeHandler);

Šifra agenta Electric Imp Agent:

  • Dodijelite Imp uređaju svom modelu
  • Provjerite jesu li priključci hardvera pod pseudonimom povezani

// Debouce biblioteka

#require "Button.class.nut: 1.2.0" // Pseudonim za gateOpen GPIO pin (aktivno nisko) gateOpen <- hardware.pin2; // Pseudonim za gateClose kontrolu GPIO pin (aktivno nisko) gateClose <- hardware.pin7; // Konfiguriraj 'gateOpen' kao digitalni izlaz sa početnom vrijednošću digitalnog 1 (visoka) gateOpen.configure (DIGITAL_OUT, 1); // Konfiguriraj 'gateClose' kao digitalni izlaz sa početnom vrijednošću digitalnog 1 (visoka) gateClose.configure (DIGITAL_OUT, 1); // Pseudonim za GPIO pin koji označava da se vrata kreću (N. O.) gateMovingState <- Button (hardware.pin8, DIGITAL_IN_PULLUP); // Pseudonim za GPIO pin koji označava da su vrata potpuno otvorena (N. O.) gateOpenState <- Button (hardware.pin9, DIGITAL_IN_PULLUP); // Globalna varijabla za držanje vrata (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Latch Timer objekt lokalni latchTimer = null agent.on ("btn", funkcija (podaci) {switch (data.cmd) {slučaj "otvoren": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Otvorena komanda primljena"); prelomno polje "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Primljena naredba Latch30m"); velika slova "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Primljena naredba Latch8h"); prijelomna situacija "close": if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Zatvori komandu primljenu"); prekinite default: server.log ("Naredba dugmeta nije prepoznata");}}); funkcija releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timer otpustio gateOpen kontakt prekidača "); } funkcija releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timer otpustio gateClose switch contact "); } gateMovingState.onPress (function () {// Relej je aktiviran, vrata se kreću //server.log("Vrata se otvaraju "); lokalni podaci = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (function () {// Relej je oslobođen, vrata su u mirovanju //server.log("Gate je zatvorena "); lokalni podaci = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", podaci);}); gateOpenState.onPress (function () {// Relej je aktiviran, vrata su potpuno otvorena //server.log("Vrata su otvorena "); lokalni podaci = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (function () {// Relej je oslobođen, vrata nisu potpuno otvorena //server.log("Gate se zatvara "); lokalni podaci = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", podaci);});

Korak 20: PHP kôd web usluge

PHP kod web usluge
PHP kod web usluge

Ovaj kod sam napisao za CodeIgniter framework jer sam ga dodao u stari postojeći projekat. Kod kontrolera i prikaza se lako mogu prilagoditi okviru po vašem izboru.

Da pojednostavimo stvari, spremio sam JSON podatke u ravnu datoteku za pohranu podataka. Ako trebate evidentiranje ili složenije funkcije vezane za podatke, koristite bazu podataka.

Ajax biblioteku koju sam napisao i koristio u ovom projektu može se preuzeti sa spremišta GitHub: ThingEngineer/Codeigniter-jQuery-Ajax

Kod kontrolera PHP:

  • app/controllers/projects.php
  • Uverite se da je putanja podataka dostupna vašoj PHP skripti, i privilegije lokacije i čitanja/pisanja.

load-> helper (niz ('datoteka', 'datum'));

$ data = json_decode (read_file ('../ app/logs/gatestate.data'), TRUE); switch ($ data ['gatestate']) {slučaj 0: $ view_data ['gatestate'] = 'Zatvoreno'; break; slučaj 1: $ view_data ['gatestate'] = 'Otvaranje …'; break; slučaj 2: $ view_data ['gatestate'] = 'Otvori'; break; slučaj 3: $ view_data ['gatestate'] = 'Zatvaranje …'; break; } $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ view_data ['last_opened'] = vremenski raspon ($ last_opened ['last_opened'], time ()). ' prije'; // Učitaj prikaz $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } funkcija save_gate_state () {$ this-> load-> helper ('file'); $ data = file_get_contents ('php: // input'); write_file ('../ app/logs/projects/gatestate.data', $ data); $ data = json_decode ($ podaci, TRUE); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app/logs/projects/gateopened.data', json_encode ($ last_opened)); }} funkcija get_gate_state () {$ this-> load-> helper (niz ('datoteka', 'datum')); $ 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'] = vremenski raspon ($ last_opened ['last_opened'], time ()). ' prije'; $ this-> ajax-> output_ajax ($ podaci, 'json', FALSE); // šaljite json podatke, ne primjenjujte ajax zahtjev}}/ * Kraj datoteke projects.php *// * Lokacija:./application/controllers/projects.php */

PHP kod za pregled:

Koristio sam Bootstrap za prednji dio jer je brz, jednostavan i odzivan. Možete ga preuzeti ovdje: https://getbootstrap.com (jQuery je uključen)

  • app/controllers/gate_view.php
  • Zamijenite VAŠ AGENCIJSKI KOD sa svojim kodom agenta Electric Imp

Dodatak IoT Gate Opperator Dodatak IoT Gate Opperator Dodatak

  • Dom
  • Admin

Otvorena vrata Zatvarač otvorena 30 minuta Zatvarač otvorena 8 sati Zatvorite sada Status kapije: Zadnja otvorena $ (document).ready (function () {resetStatus ();}) funkcija sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("#open_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). text ("Otvaranje …");}); $ ("#latch30m_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). text ("Otvaranje …");}); $ ("#latch8h_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). text ("Otvaranje …");}); $ ("#close_gate"). click (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). text ("Zatvaranje …");}); function resetStatus () {// Ciljni url var target = 'https://projects.ajillion.com/get_gate_state'; // Zahtjev var data = {agent: 'app'}; // Pošaljite ajax post zahtjev $.ajax ({url: target, dataType: 'json', tip: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("#status"). Text ('Closed'); break; case 1: $ ("#status"). Text ('Opening…'); 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) {// Poruka o grešci $ ("#status"). text ('Greška servera');}}); setTimeout (resetStatus, 3000); }

Preporučuje se: