İçindekiler:

WebApp Kontrollü Kapı Operatörü Eklentisi (IoT): 20 Adım (Resimlerle)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT): 20 Adım (Resimlerle)

Video: WebApp Kontrollü Kapı Operatörü Eklentisi (IoT): 20 Adım (Resimlerle)

Video: WebApp Kontrollü Kapı Operatörü Eklentisi (IoT): 20 Adım (Resimlerle)
Video: PYTHON İLE WORDLİST OLUŞTURUCU KODLADIK %100 KANITLI | Kubilay CAN 2024, Kasım
Anonim
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)
WebApp Kontrollü Kapı Operatörü Eklentisi (IoT)

Birçok insanın gelip gitmesi gereken kapılı bir alana sahip bir müşterim var. Dışarıda bir tuş takımı kullanmak istemediler ve sadece sınırlı sayıda anahtarlık vericileri vardı. Ek anahtarlıklar için uygun fiyatlı bir kaynak bulmak zordu. Bu Liftmaster geçit operatörünü özel donanım, web API ve web uygulaması arayüzü ile IoT uyumlu olacak şekilde yükseltmenin harika bir fırsat olacağını düşündüm. Bu, yalnızca toplu erişim sorununu çözmekle kalmadı, aynı zamanda ek işlevsellik de açtı!

Yukarıdaki son fotoğrafta neredeyse bir yıldır kilitli poşette çalıştırdığım test ünitesi var. Yükseltme zamanının geldiğini düşündüm!

Bu, burada listelenen tüm kod, donanım bilgileri ve tasarımlarla tam olarak işleyen bir çözümdür.

Tüm proje dosyaları da GitHub'da barındırılmaktadır: github.com/ThingEngineer/IoT-Gate-Operator-Addon

CodeIgniter WebApp arabiriminin bir örneği burada barındırılmaktadır: project.ajillion.com/gate Bu örnek bir canlı kapıya bağlı değildir, ancak kapılar üzerinde çalışan tam arabirim ve koddur (eksi bazı güvenlik özellikleri).

--

Daha da fazla entegrasyon için Electric Imp için IFTTT kitaplığını kullanabilirsiniz.

Adım 1: Parçaları Toplayın

Parçaları Toplayın
Parçaları Toplayın
  • En az 4 GPIO'ya sahip bir Elektrikli IMP'ye ihtiyacınız olacak, IMP001'i bir Nisan ayı panosuyla kullanıyorum.
  • Kaynak voltajını 5V'a düşürmek için bir regülatör. DC-DC Buck Converter Step Down Modülü kullanıyorum. Amazon'dan eBoot'un MP1584EN sürümü.
  • IMP'lerin çıkışıyla çalışacak ikili (veya daha fazla) röle modülü veya benzer anahtarlama cihazı. Bunu Amazon'dan JBtek 4 Kanal DC 5V Röle Modülü kullanıyorum.
  • 4 telli vidalı terminal. Bunu Amazon'dan 5 Adet 2 Satır 12P Tel Konnektör Vidalı Terminal Bariyer Bloğu 300V 20A kullanıyorum.

2. Adım: Sarf Malzemeleri

Gereçler
Gereçler

Ayrıca şunlara da ihtiyacınız olacak:

  • Bir 3D yazıcıya veya küçük bir proje kutusuna erişim
  • Kasa kapağı için yaklaşık 4 mm x 6 mm 4 küçük vida
  • Bağlantı teli
  • Tel kesiciler
  • Tel striptizci
  • Küçük tornavidalar
  • Havya
  • Sıcak tutkal veya silikon
  • Zip bağları

3. Adım: Kasayı Boyutlandırın

Kasayı Büyüt
Kasayı Büyüt

Hangi boyutta kasaya ihtiyacınız olacağını belirlemek için parçalarınızı düzenleyin. Resimdeki gibi bir düzen ile yaklaşık 140 mm genişliğinde, 70 mm derinliğinde ve 30 mm yüksekliğinde bir kasaya ihtiyacım olacak.

Adım 4: DC-DC Dönüştürücü Kablosu

Tel DC-DC Dönüştürücü
Tel DC-DC Dönüştürücü

DC-DC dönüştürücü kartının içindeki ve dışındaki güç bağlantıları için 3 çift kırmızı ve siyah bağlantı kablosunu kesin.

  • Giriş: 100mm
  • IMP'ye çıktı: 90mm
  • Röle Modülüne Çıkış: 130mm

Bunları gösterildiği gibi panonuza lehimleyin.

Adım 5: Gücü Cihazlara Bağlayın

Cihazlara Güç Kablosu
Cihazlara Güç Kablosu
  • DC-DC dönüştürücünün girişini vidalı terminal bloğundaki iki noktaya bağlayın.
  • Kısa 5V çıkış kablolarını IMP'ye lehimleyin.
  • Daha uzun 5V çıkış kablolarını röle modülüne lehimleyin.

Adım 6: Kablo Röle Modülü Girişleri

Tel Röle Modül Girişleri
Tel Röle Modül Girişleri
  • Röle modülü giriş bağlantıları için 4 x 90 mm kablo kesin. Kodlama yaparken daha sonra kolay referans olması için 4 ayrı renk kullandım.
  • Kabloları 1-4 röle modülü girişlerine ve ardından sırasıyla ilk 4 IMP GPIO noktasına (Pin1, 2, 5 ve 7) lehimleyin.

Adım 7: IMP Güç Jumper'ı

IMP Güç Jumper'ı
IMP Güç Jumper'ı

IMP'nizi başlangıçta programlarken ve test ederken USB gücünü kullanmanız gerekebilir. Bitirdiğinizde, güç atlama kablosunu BAT tarafına getirdiğinizden emin olun.

Adım 8: Kablo Kapısı Durum Girişleri

Tel Kapı Durum Girişleri
Tel Kapı Durum Girişleri
  • Durum durumu girişleri için 2 x 80 mm kablo kesin.
  • Kabloları kalan 2 vidalı terminale bağlayın.
  • Sırasıyla IMP GPIO noktalarının (Pin8 ve 9) yanındaki lehim telleri.

9. Adım: Bir Kasayı Yazdırın veya Satın Alın

Bir Kasayı Yazdırın veya Satın Alın
Bir Kasayı Yazdırın veya Satın Alın

Bu vaka için. STL veya. F3D'mi GitHub veya Thingiverse'den indirebilirsiniz.

Bir 3D yazıcıya erişiminiz yoksa küçük bir genel proje durumu işe yarayacaktır.

Adım 10: Kasanızı Süsleyin

Kasanızı Süsleyin
Kasanızı Süsleyin

Çünkü!

Benimkinin üzerine girintili bir metin koydum ve siyah bir kalemle renklendirdim. Maceracı hissediyorsanız, daha da kaygan hale getirmek için akrilik boya, tırnak cilası veya başka bir şey kullanabilirsiniz.

Adım 11: Teller için Delik Delme

Teller için Delme Deliği
Teller için Delme Deliği

Tüm tellerin bir araya geleceği yere yakın kenarda 10-15 mm'lik küçük bir delik açın.

Plastikte temiz, pürüzsüz bir delik için Unibit kullandım.

Adım 12: Bağlantı Kablolarını Hazırlayın ve Kurun

Bağlantı Tellerini Hazırlayın ve Kurun
Bağlantı Tellerini Hazırlayın ve Kurun
Bağlantı Tellerini Hazırlayın ve Kurun
Bağlantı Tellerini Hazırlayın ve Kurun

Cihazımızı kapı operatör panosuna takmak için 9 x 5-600 mm kablo kesin.

  • 24V güç girişi için 2
  • 3 kapı durumu için (2 giriş ve ortak bir zemin)
  • 2 açık kapı sinyali için
  • 2 yakın kapı sinyali için

Bir matkap kullanarak yukarıda listelenen grupların her birini birbirine çevirin. Bu, her şeyi kolaylaştıracak ve daha iyi görünecek.

Kabloların her birini gösterildiği gibi ilgili terminallere soyun ve bağlayın.

Adım 13: Bağlantı Kablolarını Yönlendirin

Güzergah Bağlantı Telleri
Güzergah Bağlantı Telleri

Bağlantı kablolarını gösterildiği gibi delikten geçirin.

Adım 14: Bileşenleri Monte Edin

Montaj Bileşenleri
Montaj Bileşenleri

Bileşenleri küçük bir sıcak tutkal veya silikon damlası ile yerleştirin ve monte edin. Bir parçayı çıkarmanız gerekirse çok fazla kullanmayın, sabitlemek için yeterli miktarda kullanın.

Başlangıçta panoları yerinde tutmak için kasayı klipsler/sekmeler ile basmak istedim ama bunu kurmam gerekiyordu ve zamanım yoktu. Kasanıza pano klipleri eklemek hoş bir dokunuş olur.

Adım 15: Bağlantı Kablolarını Kapatın

Conta Bağlantı Telleri
Conta Bağlantı Telleri

Bağlantı kablolarını sıcak tutkal veya silikonla kapatın.

Adım 16: Vakayı Kapatın

Davayı kapat
Davayı kapat

Bu 3D baskılı kasanın listesinde küçük ~ 4 mm vidalar kullandım. Kir veya nem konusunda endişeleriniz varsa, kapatmadan önce kapak ekleminin etrafına bir silikon damlası veya sıcak tutkal yerleştirin.

Adım 17: Gate Operator'a yükleyin

Kapı Operatörüne yükleyin
Kapı Operatörüne yükleyin
Kapı Operatörüne yükleyin
Kapı Operatörüne yükleyin

Ana kartta:

  • Röle çıkışı 1'e bağlı iki kabloyu Açık Kapı terminaline asın. (fotoğraflarda kırmızı/kahverengi)
  • Röle çıkışı 2'ye bağlı iki kabloyu Kapıyı Kapat terminaline bağlayın. (fotoğraflarda sarı/mavi)
  • DC-DC dönüştürücü girişine bağlı iki kabloyu 24V aksesuar güç vidalı terminallerine bağlayın (fotoğraflarda kırmızı/siyah)

Genişletme kartında

  • Küçük bir tel parçasıyla birlikte röle ortak vidalı terminallerini köprüleyin
  • Ortak topraklamayı röle ortak vidalı terminallerinden birine bağlayın (fotoğraflarda yeşil)
  • 2 kapı durum girişini (IMP Pin8 & 9) rölenin normal açık (NO) vidalı terminallerine bağlayın (fotoğraflarda gri/sarı)

Kabloları yönlendirin, düzgün görünmeleri için sıkıştırın ve kasanızı monte etmek veya yerleştirmek için bir yer bulun.

GitHub deposunda barındırılan ek, tam çözünürlüklü fotoğraflar vardır.

Adım 18: Yardımcı Röle Modunu Ayarlayın

Yardımcı Röle Modunu Ayarla
Yardımcı Röle Modunu Ayarla

Yardımcı röle anahtarlarını fotoğrafta gösterildiği gibi ayarlayın.

Bu, IMP'ye kapının kapalı mı, açılır mı, açık mı yoksa kapanıyor mu olduğunu belirlemek için ihtiyaç duyduğu sinyalleri verecektir.

Adım 19: IMP Aracısı ve Cihaz Kodu

IMP Aracısı ve Cihaz Kodu
IMP Aracısı ve Cihaz Kodu

Elektrikli İmp Ajan Kodu:

  • Electric Imp IDE'de yeni bir Model oluşturun:
  • URL'yi sunucunuzu işaret edecek şekilde değiştirin

// HTTP işleyici işlevi

function httpHandler(req, resp) { try { local d = http.jsondecode(req.body); //sunucu.log(d.c); if (d.c == "btn") { //server.log(d.val); device.send("btn", d.val); cevap.send(200, "Tamam"); } } catch(ex) { // Bir hata varsa, onu yanıt olarak geri gönderin server.log("error:" + ex); resp.send(500, "Dahili Sunucu Hatası: " + ör); } } // HTTP işleyicisini kaydedin http.onrequest(httpHandler); // GateStateChange işleyici işlevi işlev gateStateChangeHandler(data) { // Web hizmetinin URL'si yerel url = "https://projects.ajillion.com/save_gate_state"; // Content-Type başlığını json local headers olarak ayarlayın = { "Content-Type": "application/json" }; // Alınan verileri kodlayın ve yerel gövdeyi günlüğe kaydedin = http.jsonencode(data); server.log(gövde); // Verileri web hizmetinize gönderin http.post(url, headers, body).sendsync(); } // gateStateChange işleyicisini kaydedin device.on("gateStateChange", gateStateChangeHandler);

Elektrikli İmp Ajan Kodu:

  • Modelinize bir İmp cihazı atayın
  • Donanım pinlerinin bağlı olarak Aliased olduğunu doğrulayın

// Kitaplığı Debouce

#require "Button.class.nut:1.2.0" // gateOpen GPIO pini (aktif düşük) gateOpen için takma ad <- Hardware.pin2; // GateClose kontrolü için diğer ad GPIO pini (aktif düşük) gateClose <- Hardware.pin7; // 'gateOpen'ı dijital 1 (yüksek) başlangıç değerine sahip bir dijital çıkış olacak şekilde yapılandırın gateOpen.configure(DIGITAL_OUT, 1); // 'gateClose'u dijital 1 (yüksek) başlangıç değerine sahip bir dijital çıkış olacak şekilde yapılandırın gateClose.configure(DIGITAL_OUT, 1); // Geçidin hareket ettiğini gösteren GPIO pininin diğer adı (N. O.) gateMovingState <- Button(hardware.pin8, DIGITAL_IN_PULLUP); // Geçidin tamamen açık olduğunu gösteren GPIO pininin diğer adı (N. O.) gateOpenState <- Button(hardware.pin9, DIGITAL_IN_PULLUP); // Geçit durumunu tutmak için global değişken (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Kilitleme Zamanlayıcı nesnesi yerel latchTimer = null agent.on("btn", function(data) { switch (data.cmd) { case "open": gateOpen.write(0); if (latchTimer) imp.cancelwakeup(latchTimer)); latchTimer = imp.wakeup(1, releaseOpen); server.log("Aç komutu alındı"); ara durum "latch30m": gateOpen.write(0); if (latchTimer) imp.cancelwakeup(latchTimer); latchTimer = imp.wakeup(1800, releaseOpen); server.log("Latch30m komutu alındı"); ara durum "latch8h": gateOpen.write(0); if (latchTimer) imp.cancelwakeup(latchTimer); latchTimer = imp.wakeup(28800, releaseOpen); server.log("Latch8h komutu alındı"); "kapat" durumu ara: if (latchTimer) imp.cancelwakeup(latchTimer); gateOpen.write(1); gateClose.write(0); latchTimer = imp.wakeup(1, releaseClose); server.log("Şimdi kapat komutu alındı"); varsayılanı kes: server.log("Düğme komutu tanınmadı"); } }); function yayınAçık() { if (latchTimer) imp.cancelwakeup(latchTimer); gateOpen.write(1); //server.log("Zamanlayıcı serbest bırakıldı gateOpen switch kontağı"); } function releaseClose() { if (latchTimer) imp.cancelwakeup(latchTimer); gateClose.write(1); //server.log("Zamanlayıcı serbest bırakıldı geçidi Kapat anahtar kontağı"); } gateMovingState.onPress(function() { // Röle aktif, kapı hareket ediyor //server.log("Kapı açılıyor"); local data = { "gatestate": 1, "timer": Hardware.millis() }; agent.send("gateStateChange", data); }).onRelease(function() { // Röle serbest bırakıldı, kapı hareketsiz //server.log("Kapı kapalı"); local data = { "gatestate": 0, "timer": Hardware.millis() }; agent.send("gateStateChange", data); }); gateOpenState.onPress(function() { // Röle aktif, kapı tamamen açık //server.log("Kapı açık"); local data = { "gatestate": 2, "timer": Hardware.millis() }; agent.send("gateStateChange", data); }).onRelease(function() { // Röle serbest bırakıldı, kapı tam olarak açık değil //server.log("Kapı kapanıyor"); yerel veri = { "gatestate": 3, "timer": Hardware.millis() }; agent.send("gateStateChange", data); });

Adım 20: Web Hizmeti PHP Kodu

Web Servis PHP Kodu
Web Servis PHP Kodu

Bu kodu eski bir projeye eklediğim için CodeIgniter çerçevesi için yazdım. Kontrolör ve görünüm kodu, seçtiğiniz çerçeveye kolayca uyarlanabilir.

İşleri basit tutmak için JSON verilerini veri depolama için düz bir dosyaya kaydettim. Günlüğe kaydetmeye veya daha karmaşık verilerle ilgili işlevlere ihtiyacınız varsa, bir veritabanı kullanın.

Bu projede yazdığım ve kullandığım ajax kitaplığı GitHub deposundan indirilebilir: ThingEngineer/Codeigniter-jQuery-Ajax

PHP Denetleyici Kodu:

  • uygulama/kontrolörler/projeler.php
  • Veri yolunun PHP betiğiniz tarafından erişilebilir olduğundan emin olun, hem konum hem de okuma/yazma ayrıcalıkları.

load->helper(dizi('dosya', 'tarih'));

$veri = json_decode(read_file('../app/logs/gatestate.data'), DOĞRU); switch ($data['gatestate']) { case 0: $view_data['gatestate'] = 'Kapalı'; kırmak; durum 1: $view_data['gatestate'] = 'Açılıyor…'; kırmak; durum 2: $view_data['gatestate'] = 'Aç'; kırmak; durum 3: $view_data['gatestate'] = 'Kapanıyor…'; kırmak; } $last_opened = json_decode(read_file('../app/logs/projects/gateopened.data'), DOĞRU); $view_data['last_opened'] = timespan($last_opened['last_opened'], time()). ' evvel'; //Görünümü Yükle $t['data'] = $view_data; $this->load->view('gate_view', $t); } function save_gate_state() { $this->load->helper('file'); $veri = file_get_contents('php://input'); write_file('../app/logs/projects/gatestate.data', $veri); $veri = json_decode($veri, DOĞRU); if ($veri['gatestate'] == 1) { $last_opened = array('last_opened' => time()); write_file('../app/logs/projects/gateopened.data', json_encode($last_opened)); } } function get_gate_state() { $this->load->helper(array('file', 'date')); $this->load->library('ajax'); $veri = json_decode(read_file('../app/logs/projects/gatestate.data'), DOĞRU); $last_opened = json_decode(read_file('../app/logs/projects/gateopened.data'), DOĞRU); $data['last_opened'] = timespan($last_opened['last_opened'], time()). ' evvel'; $this->ajax->output_ajax($veri, 'json', YANLIŞ); // json verisi gönder, ajax isteğini zorlama } } /* Dosyanın sonu project.php */ /* Konum:./application/controllers/projects.php */

PHP Görünüm Kodu:

Ön uç için Bootstrap kullandım çünkü hızlı, kolay ve duyarlı. Buradan indirebilirsiniz: https://getbootstrap.com (jQuery dahildir)

  • app/controllers/gate_view.php
  • AJAN KODUNUZU Electric Imp temsilci kodunuzla değiştirin

IoT Gate Operatör Eklentisi IoT Gate Operatör Eklentisi

  • Ev
  • yönetici

Kapı Mandalını Aç 30 dakika Açık Mandal 8 Saat Açık Şimdi Kapat Kapı Durumu: Son açılan $(document).ready(function(){ resetStatus(); }) function sendJSON(JSONout){ var url = 'https:// agent.electricimp.com/SİZİN-AJAN-KODU'; $.post(url, JSONout); } $("#open_gate").click(function() { var JSONout = '{"c":"btn", "val":{"cmd":"open"}}'; sendJSON(JSONout); $ ("#status").text("Açılıyor…"); }); $("#latch30m_gate").click(function() { var JSONout = '{"c":"btn", "val":{"cmd":"latch30m"}}'; sendJSON(JSONout); $("#status").text("Açılıyor…"); }); $("#latch8h_gate").click(function() { var JSONout = '{"c":"btn", "val":{"cmd":"latch8h"}}'; sendJSON(JSONout); $("#status").text("Açılıyor…"); }); $("#close_gate").click(function() { var JSONout = '{"c":"btn", "val":{"cmd":"close"}}'; sendJSON(JSONout); $("#status").text("Kapanıyor…"); }); function resetStatus() { // Target url var target = 'https://projects.ajillion.com/get_gate_state'; // request var data = { aracı: 'app' }; // Ajax gönderi isteği gönder $.ajax({ url: target, dataType: 'json', type: 'POST', data: data, Success: function(data, textStatus, XMLHttpRequest) { switch(data.gatestate) { case 0: $("#status").text('Kapalı'); ara; durum 1: $("#status").text('Açılıyor…'); ara; durum 2: $("#status").text('Open'); break; durum 3: $("#status").text('Kapanıyor…'); break; varsayılan: $("#status").text('Hata'); } $ ("#last_opened").text(data.last_opened); }, hata: function(XMLHttpRequest, textStatus, errorThown) { // Hata mesajı $("#status").text('Sunucu Hatası'); } }); setTimeout(resetStatus, 3000); }

Önerilen: