İlan

Hareketi algılayın, ardından yüksek perdeli alarm sesleri ve yanıp sönen ışıklar ile halkı davetsiz misafirlerden korkutun. Kulağa eğlenceli geliyor mu? Tabii ki öyle. Bugün yeni başlayanlar için uygun olan Arduino projesinin amacı budur. Devam ettikçe tamamen sıfırdan ve testlerden yazacağız, böylece daha önce yaptığım bir şeyi yüklemek yerine her şeyin nasıl yapıldığına dair bir fikir edinebilirsiniz.

Feragatname: Bu aslında evinizi korumaz. O belki Odanıza gizlice girerken kız kardeşinize kötü bir şok verin.

İhtiyacın olacak:

  • Bir Arduino
  • Ultrasonik “ping” sensörü kullanıyorum HC-SR04 Bir PIR daha iyi olurdu, ama bunlar pahalı. Bir ping sensörü bir kapıya gizlice yerleştirilebilir ve yine aynı temel işe yarar ve sadece 5 $
  • Piezo zili
  • Kullandığımız aynı kablolama ile LED şerit ışığı bu projeye geri dön Bir Medya Merkezi İçin Kendi Dinamik Ortam Aydınlatmanızı OluşturunPC'nizde veya medya merkezinizde çok fazla film izliyorsanız, eminim ışık ikilemiyle karşı karşıyasınız; tüm ışıkları tamamen kapatır mısın? Onları tam bir patlamada mı tutuyorsun? Veya... Daha fazla oku .
instagram viewer

Bu projeyi kablolarken, her seferinde her şeyi kaldırmayın - sadece son blokta inşa etmeye devam edin. “Alarm Sistemini Kodlama” bölümüne geldiğinizde, tüm bitleri ve parçaları birbirine bağlayarak aşağıdaki gibi bir şey görmelisiniz:

Bitmiş-kablolama

Yanıp sönen ışıklar

Bağlantı şemasını kullanın bu projeden Bir Medya Merkezi İçin Kendi Dinamik Ortam Aydınlatmanızı OluşturunPC'nizde veya medya merkezinizde çok fazla film izliyorsanız, eminim ışık ikilemiyle karşı karşıyasınız; tüm ışıkları tamamen kapatır mısın? Onları tam bir patlamada mı tutuyorsun? Veya... Daha fazla oku LED şeridinizi bağlamak için; PWM çıkışına ihtiyacımız olduğu için pinleri değiştirmeyin. kullanım bu kod kablolarınızı hızlı bir şekilde test etmek için. Her şey yolunda giderse, buna sahip olmalısınız:

led-rgb-testi

Mesafe Sensörü

SR04 modülünde 4 pin bulacaksınız. VCC ve GND sırasıyla + 5V ray ve toprağa gidin; TETİK bir sonar sinyali göndermek için kullanılan pimdir, bunu pim 6'ya koyun; EKO sinyali geri okumak için kullanılır (ve bu nedenle mesafeyi hesaplar) - bunu 7 üzerine koyun.

SR04

İşleri inanılmaz derecede basitleştirmek için, kullanabileceğimiz bir kütüphane var. NewPing. Arduino'nuzu indirin ve yerleştirin Kütüphane klasörüne gidin ve devam etmeden önce IDE'yi yeniden başlatın. Kullanarak test bu kod; seri monitörü açın ve hızın 115200 baud'a ayarlandığından emin olun. Herhangi bir şansla, bazı mesafe ölçümlerinin oldukça yüksek bir hızda size geri gönderildiğini görmelisiniz. 1 veya 2 santimetre varyans bulabilirsiniz, ancak bu iyi. Değişen değerleri gözlemlemek için elinizi sensörün önünde çalıştırmayı, yukarı ve aşağı hareket ettirmeyi deneyin.

Ping-çıktı

Kodun anlaşılması oldukça basit olmalıdır. Başlangıçta maksimum mesafe de dahil olmak üzere birkaç ilgili pim bildirimi vardır - bu, tam sensöre sahip olursunuz, ancak doğru bir şekilde 1 metreden daha az okuma yapabildiğiniz sürece, ince.

Bu test uygulamasının döngüsünde, Ping () Bir sonar ping gönderme işlevi, değerin geri dönmesinin ne kadar sürdüğünü milisaniye cinsinden bir değere geri döndürür. Bunu anlamak için, sürekli olarak inşa edilen NewPing kütüphanelerini kullanıyoruz. US_ROUNDTRIP_CMtek bir santimetreye gitmek için kaç mikrosaniye gerektiğini tanımlar. Sensörün aşırı yüklenmesini önlemek için pingler arasında 50 ms gecikme de vardır.

Piezo Alarmı

Piezo kristal sensörü basit ve ucuz bir zil ve farklı tonlar yapmak için bir PWM pin 3 kullanabiliriz. Bir kabloyu pim 3'e, diğeri topraklama rayına bağlayın - hangisi önemli değil.

kullanım bu kod test etmek.

Oldukça iğrenç ve yüksek sesli alarmı öldürmenin tek yolu fişleri çekmektir. Kod açıklamak biraz karmaşıktır, ancak belirgin bir ses üretmek için sinüs dalgalarının kullanılmasını içerir. Farklı tonlarda oynamak için sayıları değiştirin.

Alarm Sisteminin Kodlanması

Şimdi bu bulmacanın tüm parçalarına sahibiz, bunları bir araya getirelim.

Devam et ve yeni bir çizim yap Alarm. Şimdiye kadar test örneklerinde bulunan tüm değişkenleri ve pin tanımlarını birleştirerek başlayın.

#Dahil etmek  // Hangi PWM özellikli pinlerin kullanılacağını seçin. #define RED_PIN 10. #define GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pimi, ultrasonik sensör üzerindeki pimi tetiklemek için bağlanmıştır. #define ECHO_PIN 7 // Ultrasonik sensördeki yankı pimine bağlı Arduino pimi. #define MAX_DISTANCE 100 // Ping atmak istediğimiz maksimum mesafe (santimetre cinsinden). #define ALARM 3 float sinVal; int toneVal; 

Temel bir yazı yazarak başlayın kurmak() fonksiyonu - şimdilik sadece ışıklarla ilgileneceğiz. Ana döngü başlatılmadan önce 5 saniyelik bir gecikme ekledim, gerekirse bize yoldan çıkmamız için biraz zaman kazandım.

void setup () {// RGB şerit pinMode için pinModes'u ayarlayın (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // ışıkları sıfırla analogBeyaz (RED_PIN, 0); analogyaz (BLUE_PIN, 0); analogyaz (RED_PIN, 0); gecikme (5000); }

Işıklara hızla tek bir RGB değeri yazmamızı sağlayan bir yardımcı işlev kullanalım.

// bir komutta renk göndermemizi sağlayan helper işlevi. geçersiz renk (işaretsiz karakter kırmızısı, işaretsiz karakter yeşili, işaretsiz karakter mavisi) // renk oluşturma işlevi. {analogWrite (RED_PIN, kırmızı); analogyaz (BLUE_PIN, mavi); analogWrite (GREEN_PIN, yeşil); }

Son olarak, şimdilik döngümüz kırmızı ve sarı arasında basit bir renk flaşından oluşacaktır (veya alarmınızın olmasını istediğiniz her şey - sadece RGB değerlerini değiştirin).

void loop () {renk (255,0,0); // kırmızı gecikme (100); renk (255.255,0); // sarı gecikme (100); }

Doğru yolda olduğunuzdan emin olmak için yükleyin ve test edin.

Şimdi, mesafe sensörünü, yalnızca 50 cm (bir kapı çerçevesinin genişliğinden daha az) içeri girdiğinde bu ışıkları tetiklemek için entegre edelim. Doğru pinleri zaten tanımladık ve kütüphaneyi içe aktardık. kurmak() fonksiyonu, somutlaştırmak için aşağıdaki satırı ekleyin:

NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing pinleri ve maksimum mesafe ayarı. 

Bunun altına, tetiklenen ya da tetiklenmeyen alarmın durumunu saklamak için bir değişken ekleyin, elbette yanlış olanı varsayılan olarak.

boole tetiklendi = yanlış; 

Şuraya bir satır ekleyin: kurmak() fonksiyonu böylece seri ve hata ayıklama çıktı izleyebilirsiniz.

Serial.begin (115200); // Ping sonuçlarını görmek için 115200 baud'da seri monitörü açın. 

Ardından, mevcut döngüyü yeniden adlandıralım Alarm () - alarm tetiklendiğinde buna denir.

void alarm () {renk (255,0,0); // kırmızı gecikme (100); renk (255.255,0); // sarı gecikme (100); }

Şimdi yeni bir tane oluşturun döngü () yeni bir ping getirdiğimiz, sonuçları okuduğumuz ve sayaç aralığında bir şey algılanırsa alarmı tetiklediğimiz işlev.

void loop () {if (triggered == true) {alarm (); } else {delay (50); // Pingler arasında 50 ms bekleyin (yaklaşık 20 ping / sn). 29ms, pingler arasındaki en kısa gecikme olmalıdır. işaretsiz int uS = sonar.ping (); // Ping gönderin, mikrosaniye (uS) cinsinden ping zamanı alın. işaretsiz int mesafesi = uS / US_ROUNDTRIP_CM; Seri.println (mesafe); eğer (mesafe <100) {tetiklendi = doğru; } } }

Kodu kısaca açıklayayım:

  • Alarmın tetiklenip tetiklenmediğini kontrol ederek başlayın ve eğer öyleyse, alarm işlevini kapatın (sadece şu anda ışıkları yanıp söner).
  • Henüz tetiklenmediyse, geçerli değeri sensörden alın.
  • Sensör <100 cm okuyorsa, bir şey huzmeyi doldurdu (açıkçası sizin için çok erken tetikleniyorsa bu değeri ayarlayın).

Can sıkıcı piezo buzzer'ı eklemeden önce şimdi bir deneme çalışması yapın.

Çalışma? Harika. Şimdi o zili tekrar ekleyelim. Ekle pinMode -e kurmak() rutin.

pinMode (ALARM, ÇIKIŞ); 

Ardından alarm () işlevine piezo sesli uyarıcı döngüsünü ekleyin:

için (int x = 0; x <180; x ++) {// dereceleri radyanlara dönüştürün, sonra sin değeri elde edin sinVal = (sin (x * (3.1412 / 180))); // sin değeri olan bir frekans üretir toneVal = 2000+ (int (sinVal * 1000)); ton (ALARM, toneVal); }

Bu noktada derlemeye çalışırsanız, bir hatayla karşılaşırsınız - bazı yaygın sorunları görebilmeniz için bunu bilerek bıraktım. Bu durumda, hem NewPing hem de standart ton kütüphanesi aynı kesintileri kullanır - temel olarak çakışırlar ve düzeltmek için yapabileceğiniz çok şey yoktur. Ah hayatım.

Endişeye gerek yok. Bu yaygın bir sorundur ve birisinin zaten bir çözümü vardır - bunu indirin ve ekleyin Newtone Arduino Kütüphaneleri klasörünüze. Programınızın başlangıcını aşağıdakileri içerecek şekilde ayarlayın:

#Dahil etmek 

Ve çizgiyi ayarlayın:

 ton (ALARM, toneVal); 

için

 NewTone (ALARM, toneVal); 

yerine.

Bu kadar. Alarmınızı bir sonraki şanssız hırsız için yatak odanızın kapısında ayarlayın.

Veya, alarmdan tamamen etkilenmemiş gibi görünen bir dopey köpeği.

Kodla ilgili sorun mu yaşıyorsunuz? Burada uygulamayı tamamla. Rastgele hatalar alıyorsanız, bunları aşağıya yapıştırmayı deneyin; yardım edip edemeyeceğimi göreceğim.

Resim kredisi: Yangın alarmı Flickr aracılığıyla

James Yapay Zeka alanında lisans derecesine sahiptir ve CompTIA A + ve Network + sertifikalıdır. MakeUseOf'un baş geliştiricisi ve boş zamanlarını VR paintball ve boardgames oynayarak geçiriyor. Çocukluğundan beri bilgisayar yapıyor.