Mundarija:

WebApp boshqariladigan eshiklar operatori qo'shilishi (IoT): 20 qadam (rasmlar bilan)
WebApp boshqariladigan eshiklar operatori qo'shilishi (IoT): 20 qadam (rasmlar bilan)

Video: WebApp boshqariladigan eshiklar operatori qo'shilishi (IoT): 20 qadam (rasmlar bilan)

Video: WebApp boshqariladigan eshiklar operatori qo'shilishi (IoT): 20 qadam (rasmlar bilan)
Video: What is a Server? Servers vs Desktops Explained 2024, Iyul
Anonim
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)
WebApp boshqariladigan eshiklar operatori qo'shimchasi (IoT)

Mening mijozim bor, uning darvozasi bor edi, u erga ko'p odamlar kelishi va ketishi kerak edi. Ular tashqi tomondan klaviatura ishlatishni xohlamadilar va faqat cheklangan kalitli kalit uzatgichlarga ega edilar. Qo'shimcha keyfoblar uchun arzon manbani topish qiyin edi. Men bu Liftmaster darvoza operatorini IoT -ni maxsus apparat, veb -API va veb -ilovalar interfeysi bilan moslashtirish uchun yangilash uchun ajoyib imkoniyat bo'ladi deb o'yladim. Bu nafaqat ommaviy kirish muammosini hal qildi, balki qo'shimcha funktsiyalarni ham ochdi!

Yuqoridagi oxirgi rasmda men deyarli bir yil davomida qulflangan sumkada yugurgan test birligi. Men yangilanish vaqti keldi deb o'yladim!

Bu erda keltirilgan barcha kodlar, apparat ma'lumotlari va dizaynlari bilan to'liq ishlaydigan echim.

Loyihalarning barcha fayllari GitHub-da joylashgan: github.com/ThingEngineer/IoT-Gate-Operator-Addon

CodeIgniter WebApp interfeysi misoli bu erda joylashtirilgan: projects.ajillion.com/gate Bu misol jonli eshikka ulanmagan, lekin eshiklarda ishlaydigan aniq interfeys va kod (ba'zi xavfsizlik xususiyatlarini hisobga olmaganda).

--

Kattaroq integratsiya uchun IFTTT kutubxonasidan Electric Imp uchun foydalanishingiz mumkin.

1 -qadam: qismlarni yig'ing

Qismlarni yig'ing
Qismlarni yig'ing
  • Sizga kamida 4 ta GPIO -ga ega bo'lgan elektr IMP kerak bo'ladi, men IMP001 -ni aprel oyidagi taxtali ishlataman.
  • Manba kuchlanishini 5 V ga tushirish uchun regulyator. Men DC-DC Buck Converter Step Down Modulidan foydalanmoqdaman. Amazondan eBoot MP1584EN versiyasi.
  • IMP chiqishi bilan ishlaydigan ikkita (yoki undan ko'p) o'rni moduli yoki shunga o'xshash kommutatsiya moslamasi. Men Amazon -dan JBtek 4 kanalli DC 5V o'rni modulidan foydalanayapman.
  • 4 simli vintli terminal. Men Amazondan 5Pcs 2 qatorli 12P simli ulagichli vintli terminalli to'siqni 300V 20A blokidan foydalanayapman.

2 -qadam: materiallar

Ta'minotlar
Ta'minotlar

Sizga ham kerak bo'ladi:

  • 3D printer yoki kichik loyiha qutisiga kirish
  • Koson qopqog'i uchun taxminan 4 mm x 6 mm bo'lgan 4 ta kichik vint
  • Ulanish simlari
  • Tel kesgichlar
  • Tel -chiziqlar
  • Kichik tornavidalar
  • Lehimlash temir
  • Issiq elim yoki silikon
  • Fermuar bog'lamlari

3 -qadam: Kosonni kattalashtiring

Kosonni kattalashtiring
Kosonni kattalashtiring

Qaysi o'lchamdagi sumka kerakligini aniqlang. Rasmda ko'rsatilganidek, menga kengligi 140 mm, chuqurligi 70 mm va balandligi 30 mm bo'lgan quti kerak bo'ladi.

4-qadam: simli DC-DC konverteri

DC-DC simli konvertor
DC-DC simli konvertor

DC-DC konvertor platasiga va tashqarisiga ulanish uchun 3 juft qizil va qora ulash simini kesib oling.

  • Kirish: 100 mm
  • IMPga chiqish: 90 mm
  • O'rnimizni moduliga chiqish: 130 mm

Ko'rsatilganidek, ularni taxtaga lehimlang.

5 -qadam: Quvvatni qurilmalarga ulash

Quvvatni qurilmalarga ulash
Quvvatni qurilmalarga ulash
  • DC-DC konvertorining kirishini vintli terminal blokidagi ikkita nuqtaga ulang.
  • Qisqa 5V chiqish simlarini IMP ga lehimlang.
  • Uzunroq 5V chiqish simlarini o'rni moduliga lehimlang.

6 -qadam: simli o'rni modulining kirishlari

Simli o'rni modulining kirishlari
Simli o'rni modulining kirishlari
  • O'rnimizni modulining kirish ulanishlari uchun 4 x 90 mm simlarni kesib oling. Keyinchalik kodlashda osonroq ma'lumot olish uchun 4 ta alohida rang ishlatilgan.
  • Simlarni o'rni moduliga 1-4, so'ngra IMP GPIO-ning birinchi 4 nuqtasiga (Pin1, 2, 5 va 7) lehimlang.

7 -qadam: IMP Power Jumper

IMP Power Jumper
IMP Power Jumper

IMP -ni dasturlash va sinash paytida USB quvvatidan foydalanish kerak bo'lishi mumkin. Ishni tugatgandan so'ng, quvvat o'tish moslamasini BAT tomoniga o'tkazganingizga ishonch hosil qiling.

8 -qadam: Simli eshiklar holatiga kirishlar

Wire Gate holatiga kirishlar
Wire Gate holatiga kirishlar
  • Quvvat holatini kiritish uchun 2 x 80 mm simlarni kesib oling.
  • Qolgan 2 vintli terminalga simlarni ulang.
  • Lehim simlari navbati bilan IMP GPIO nuqtalari (Pin8 va 9) yoniga.

9 -qadam: Kosonni chop eting yoki sotib oling

Kosonni chop eting yoki sotib oling
Kosonni chop eting yoki sotib oling

GitHub yoki Thingiverse -da bu holat uchun mening. STL yoki. F3D -ni yuklab olishingiz mumkin

Agar sizda 3D printerga kirish imkoni bo'lmasa, kichik umumiy loyiha ishi ishlaydi.

10 -qadam: sumkangizni bezang

Kassangizni bezang
Kassangizni bezang

Chunki!

Men o'zim yozgan matnni qo'ydim va uni qora sharf bilan bo'yadim. Agar siz o'zingizni sarguzashtli his qilsangiz, uni silliq qilish uchun akril bo'yoq, tirnoq yoki boshqa narsalardan foydalanishingiz mumkin.

11 -qadam: simlar uchun teshik

Simlar uchun burg'ulash teshigi
Simlar uchun burg'ulash teshigi

Yon tomoni 10-15 mm bo'lgan teshikni burang, uning o'rtasi yaqinida, barcha simlar birlashadi.

Men Unibit -dan plastmassadagi toza, silliq teshik uchun foydalanardim.

12 -qadam: ulash simlarini tayyorlash va o'rnatish

O'rnatish simlarini tayyorlash va o'rnatish
O'rnatish simlarini tayyorlash va o'rnatish
O'rnatish simlarini tayyorlash va o'rnatish
O'rnatish simlarini tayyorlash va o'rnatish

Qurilmamizni eshik boshqaruv paneliga ulash uchun 9 x 5-600 mm simlarni kesib oling.

  • 24V kuchlanishli kirish uchun 2
  • Darvoza holati uchun 3 (2 kirish va umumiy nuqta)
  • 2 ochiq eshik signali uchun
  • Yopiq eshik signallari uchun 2

Matkap yordamida yuqorida sanab o'tilgan har bir guruhni bir -biriga bog'lab qo'ying. Bu hamma narsani osonlashtiradi va yaxshi ko'rinishga ega bo'ladi.

Har bir simni echib oling va ko'rsatilganidek, tegishli terminallarga ulang.

13 -qadam: O'rnatish simlarini yo'naltiring

Marshrutni ulash simlari
Marshrutni ulash simlari

Ko'rsatilganidek, ulanish simlarini teshikdan o'tkazing.

14 -qadam: Komponentlarni o'rnatish

O'rnatish komponentlari
O'rnatish komponentlari

Issiq yopishtiruvchi yoki silikonli kichik boncuk bilan komponentlarni joylashtiring va o'rnating. Agar biror qismni olib tashlash kerak bo'lsa, ko'p ishlatmang, ularni mahkamlash uchun yetarli darajada foydalaning.

Dastlab men taxtalarni joyida ushlab turish uchun sumkani kliplar/yorliqlar bilan chop qilmoqchi edim, lekin uni o'rnatishim kerak edi va vaqtim yo'q edi. Sizning ishingizga taxtali kliplarni qo'shish juda yoqimli bo'lardi.

15 -qadam: O'rnatish simlarini muhrlang

O'rnatish simlarini yopish
O'rnatish simlarini yopish

Ulanish simlarini issiq elim yoki silikon bilan mahkamlang.

16 -qadam: Kosonni yoping

Kosonni yoping
Kosonni yoping

Men 3D bosilgan quti ro'yxatida kichik ~ 4 mm vintlarni ishlatardim. Agar siz axloqsizlik yoki namlikdan xavotirda bo'lsangiz, uni yopishdan oldin uning atrofiga silikon yoki issiq elim taqing.

17 -qadam: Gate operatoriga o'rnating

Gate operatoriga o'rnating
Gate operatoriga o'rnating
Gate operatoriga o'rnating
Gate operatoriga o'rnating

Asosiy taxtada:

  • Ochilish darvozasi terminaliga 1 -o'rni chiqishiga ulangan ikkita simni ulang. (rasmlarda qizil/jigarrang)
  • 2 -o'rni chiqishiga ulangan ikkita simni Gate Close terminaliga ulang. (rasmlarda sariq/ko'k)
  • DC-DC konvertorining kirishiga ulangan ikkita simni 24V kuchlanishli vintli terminallarga ulang (rasmlarda qizil/qora)

Kengaytirish taxtasida

  • O'rnimizni umumiy vintli terminallarini simning kichik bo'lagi bilan birlashtiring
  • Umumiy erni o'rni vintli terminallaridan biriga ulang (rasmlarda yashil)
  • 2 ta eshik holatidagi kirishni (IMP Pin8 va 9) o'rni oddiy ochiq (NO) vintli terminallariga ulang (rasmlarda kulrang/sariq)

Simlarni yo'naltiring, ularni zip bilan bog'lang, shunda ular chiroyli ko'rinishga ega bo'ladi va sumkangizni o'rnatish yoki o'rnatish uchun joy topadi.

GitHub omborida joylashtirilgan qo'shimcha aniqlikdagi fotosuratlar mavjud.

18 -qadam: Aux Relay rejimini o'rnating

Aux Relay rejimini o'rnating
Aux Relay rejimini o'rnating

Yordamchi o'rni kalitlarini rasmda ko'rsatilgandek o'rnating.

Bu IMPga eshikning yopilganligini, ochilishini, ochilishini yoki yopilishini aniqlashi kerak bo'lgan signallarni beradi.

19 -qadam: IMP agenti va qurilma kodi

IMP agenti va qurilma kodi
IMP agenti va qurilma kodi

Elektr imp agenti kodi:

  • Electric Imp IDE -da yangi model yarating:
  • Serverni ko'rsatish uchun URL manzilini o'zgartiring

// HTTP ishlov berish funktsiyasi

httpHandler (req, resp) funktsiyasi {harakat qilib ko'ring {mahalliy d = http.jsondecode (req.body); //server.log(d.c); agar (dc == "btn") {//server.log(d.val); device.send ("btn", d.val); resp.send (200, "OK"); }} catch (ex) {// Agar xato bo'lsa, uni server.log javobiga yuboring ("xato:" + ex); resp.send (500, "Ichki server xatosi:" + ex); }} // HTTP ishlovchilarini ro'yxatdan o'tkazish http.onrequest (httpHandler); // GateStateChange ishlovchi funktsiyasining vazifasi gateStateChangeHandler (ma'lumotlar) {// veb -xizmatiga URL mahalliy url = "https://projects.ajillion.com/save_gate_state"; // Content-Type sarlavhasini json local headers = {"Content-Type": "application/json"} ga o'rnating; // Qabul qilingan ma'lumotlarni kodlang va mahalliy tanani kiriting = http.jsonencode (ma'lumotlar); server.log (tanasi); // Ma'lumotlarni http.post (url, header, body).sendsync () veb -xizmatiga yuboring; } // gateStateChange ishlov beruvchisi device.on -da ro'yxatdan o'ting ("gateStateChange", gateStateChangeHandler);

Elektr imp agenti kodi:

  • Modelingizga Imp qurilmasini tayinlang
  • Uskuna pinlari ulanganligi uchun taxallusli ekanligini tekshiring

// Debouce kutubxonasi

#require "Button.class.nut: 1.2.0" // gateOpen GPIO pin (faol past) gateOpen <- apparat.pin2; // Gap uchun taxallusClose control GPIO pin (faol past) gateClose <- hardware.pin7; // "gateOpen" ni boshlang'ich qiymati raqamli 1 (yuqori) gateOpen.configure (DIGITAL_OUT, 1) raqamli chiqish qilib sozlang; // "gateClose" ni raqamli 1 (yuqori) gateClose.configure (DIGITAL_OUT, 1) boshlang'ich qiymati bo'lgan raqamli chiqish sifatida sozlang; // GPIO pinining taxallusi, u eshik harakatlanayotganini ko'rsatadi (N. O.) gateMovingState <- Button (apparat.pin8, DIGITAL_IN_PULLUP); // GPIO pinining taxallusi eshik to'liq ochilganligini bildiradi (N. O.) gateOpenState <- Button (apparat.pin9, DIGITAL_IN_PULLUP); // Gap holatini ushlab turish uchun global o'zgaruvchi (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Latch Timer ob'ekti mahalliy); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Ochiq buyruq qabul qilindi"); "latch30m" buzish holati: gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m buyrug'i qabul qilindi"); buzilish holati "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Latch8h buyrug'i qabul qilindi"); "yop" tugmachasi: agar (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Hozir yopish" buyrug'i qabul qilingan); standartni uzish: server.log ("Tugma buyrug'i tan olinmagan");}}); funksiya releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timeer gateOpen switch kontaktini bo'shatdi "); } funksiya releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Taymer gateClose switch kontaktini qo'ydi "); } gateMovingState.onPress (function () {// Röle faollashtirilgan, eshik harakatlanmoqda //server.log("Gate ochilmoqda "); mahalliy ma'lumotlar = {" gatestate ": 1," taymer ": hardware.millis ()}; agent.send ("gateStateChange", ma'lumotlar);}). onRelease (function () {// Röle bo'shatildi, eshik tinch holatda //server.log("Gate yopildi "); mahalliy ma'lumotlar = {"gatestate": 0, "taymer": apparat.millis ()}; agent.send ("gateStateChange", ma'lumotlar);}); gateOpenState.onPress (function () {// o'rni faollashtirilgan, eshik to'liq ochiq //server.log("Gate ochiq "); mahalliy ma'lumotlar = {" gatestate ": 2," taymer ": hardware.millis ()}; agent.send ("gateStateChange", ma'lumotlar);}). onRelease (function () {// Röle qo'yildi, eshik to'liq ochilmagan //server.log("Gate yopilmoqda "); mahalliy ma'lumotlar = {"gatestate": 3, "taymer": apparat.millis ()}; agent.send ("gateStateChange", ma'lumotlar);});

20 -qadam: PHP veb -xizmati

PHP veb -xizmati
PHP veb -xizmati

Men bu kodni CodeIgniter ramkasi uchun yozdim, chunki uni eski mavjud loyihaga qo'shdim. Nazoratchi va ko'rish kodi siz tanlagan doiraga osongina moslashtirilishi mumkin.

Oddiy bo'lish uchun men JSON ma'lumotlarini ma'lumotlarni saqlash uchun tekis faylga saqladim. Agar sizga jurnalni yozish yoki ma'lumotlar bilan bog'liq murakkabroq funktsiyalar kerak bo'lsa, ma'lumotlar bazasidan foydalaning.

Men yozgan va bu loyihada ishlatgan ajax kutubxonasini GitHub omboridan yuklab olish mumkin: ThingEngineer/Codeigniter-jQuery-Ajax

PHP boshqaruvchi kodi:

  • ilova/tekshirgichlar/project.php
  • Ma'lumotlar yo'lini PHP skriptingiz, ham joylashuvi, ham o'qish/yozish imtiyozlari bilan olishiga ishonch hosil qiling.

load-> yordamchi (qator ('fayl', 'sana'));

$ data = json_decode (read_file ('../ app/logs/gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Yopiq'; tanaffus; 1 -holat: $ view_data ['gatestate'] = 'Ochilmoqda…'; tanaffus; 2 -holat: $ view_data ['gatestate'] = 'Ochiq'; tanaffus; 3 -holat: $ view_data ['gatestate'] = 'Yopilmoqda…'; tanaffus; } $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ view_data ['last_opened'] = vaqt oralig'i ($ last_opened ['last_opened'], time ()). "oldin"; // Ko'rinishni yuklash $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } function save_gate_state () {$ this-> load-> helper ('file'); $ data = file_get_contents ('php: // input'); write_file ('../ app/logs/projects/gatestate.data', $ data); $ data = json_decode ($ ma'lumotlar, TRUE); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app/logs/projects/gateopened.data', json_encode ($ last_opened)); }} funktsiyasi get_gate_state () {$ this-> load-> yordamchi (qator ('fayl', 'sana')); $ this-> yuk-> kutubxona ('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'] = vaqt oralig'i ($ last_opened ['last_opened'], time ()). "oldin"; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // json ma'lumotlarini yuboring, ajax so'rovini bajarmang}}/ * Fayl loyihalarining oxiri.php *// * Manzil:./application/controllers/projects.php */

PHP ko'rish kodi:

Men Bootstrap-ni old tomondan ishlatardim, chunki u tez, oson va sezgir. Siz uni bu yerdan yuklab olishingiz mumkin: https://getbootstrap.com (jQuery kiritilgan)

  • ilova/tekshirgichlar/gate_view.php
  • YOUR-AGENT-KODingizni Electric Imp agent kodingiz bilan almashtiring

IoT Gate Opperator Addon IoT Gate Opperator Addon

  • Uy
  • Admin

Darvoza qulfini ochish 30 minutga ochiladi. 8 soatga ochiladi. Endi yopiladi Darvoza holati: Oxirgi marta ochilgan $ (hujjat).ready (function () {resetStatus ();}) funktsiyasi sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("#open_gate"). bosing (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). matn ("Ochilish…");}); $ ("#latch30m_gate"). bosing (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}}; sendJSON (JSONout); $ ("#status"). matn ("Ochilish…");}); $ ("#latch8h_gate"). bosing (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). matn ("Ochilish…");}); $ ("#close_gate"). bosing (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). matn ("Yopilmoqda…");}); function resetStatus () {// Target url var target = 'https://projects.ajillion.com/get_gate_state'; // Var data = {agent: 'app'} so'rovi; // Ajax post so'rovini yuborish $.ajax ({url: target, dataType: 'json', type: 'POST', ma'lumotlar: ma'lumotlar, muvaffaqiyat: funksiya (ma'lumotlar, textStatus, XMLHttpRequest) {switch (data.gatestate) {hol 0: $ ("#status"). Matn ("Yopiq"); tanaffus; 1 -holat: $ ("#holat"). Matn ('Ochilish…'); tanaffus; 2 -holat: $ ("#holat").text ('Ochiq'); tanaffus; 3 -holat: $ ("#holat"). matn ('Yopilmoqda…'); tanaffus; standart: $ ("#holat"). matn ('Xato');} $ ("#last_opened"). matn (data.last_opened);}, xato: funksiya (XMLHttpRequest, textStatus, errorThrown) {// Xato xabari $ ("#holat"). matn ('Server xatosi');}}); setTimeout (resetStatus, 3000); }

Tavsiya: