Proje hakkında
Tüm canlılar vücut ısıları nedeniyle kızılötesi ışık yayar. PIR (Pasif Kızılötesi) sensörü bu ışığı algılar, ama sabit bir ısı kaynağına değil, görüş alanındaki değişime tepki verir. Bu yüzden odada oturan birini değil, hareket eden birini fark eder.
Sensör hareket algıladığında çıkış pinini kendiliğinden HIGH yapar; yani Arduino açısından bir butonu okumaktan farkı yoktur. Bu projede ayrıca "durum değişkeni" kullanarak Seri Port Ekranına sadece hareketin başladığı ve bittiği anı yazdırmayı öğreneceğiz.
- PIR sensörünün çalışma prensibini
- Sensör üzerindeki hassasiyet ve süre ayarlarını
- Durum değişkeniyle olayın başlangıç ve bitişini yakalamayı
- Sensör ısınma süresinin önemini
Malzeme listesi
Projeyi tamamlamak için aşağıdaki 9 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.
Arduino Uno R3 1 adet
Projenin beyni. Nano veya Mega ile de aynı kod çalışır.
Breadboard 1 adet
Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.
HC-SR501 PIR hareket sensörü 1 adet
Beyaz kubbe şeklinde Fresnel lensli, yaklaşık 7 m algılama mesafesi.
Pasif buzzer 1 adet
Siren sesi için.
5 mm kırmızı LED 1 adet
Görsel uyarı.
220 Ω direnç 1 adet
LED'i aşırı akımdan korur. Renk kodu: kırmızı-kırmızı-kahverengi.
Jumper kablo (erkek-dişi) 3 adet
PIR sensörünün pinleri için.
Jumper kablo (erkek-erkek) 4 adet
USB A-B kablosu 1 adet
Kodu yüklemek ve kartı bilgisayardan beslemek için.
Devre bağlantıları
Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.
Adım adım kurulum
Sensör ayarlarını yapın
PIR kartının arkasındaki iki turuncu potansiyometreden Sx (hassasiyet) olanı ortaya, Tx (süre) olanı saat yönünün tersine en sona getirin. Jumper'ı H (tekrar tetikleme) konumuna alın.
PIR'ı bağlayın
Erkek-dişi kablolarla VCC'yi 5V'a, OUT'u D2'ye, GND'yi GND'ye bağlayın.
LED'i bağlayın
Kırmızı LED'i 220 Ω direnç üzerinden D13'e, kısa bacağını GND'ye bağlayın.
Buzzer'ı bağlayın
+ bacağı D8'e, − bacağı GND'ye bağlayın.
Kodu yükleyin
Kodu yükleyip Seri Port Ekranını açın. Sensör kendini kalibre ederken 30 saniye boyunca hareketsiz bekleyin ve sensörün önünden çekilin.
Alarmı test edin
"Sistem hazır" mesajından sonra sensörün önünden geçin. LED yanmalı, siren çalmalı ve ekrana "Hareket algılandı" yazmalı.
Hassasiyeti ince ayarlayın
Alarm çok kolay tetikleniyorsa Sx potansiyometresini saat yönünün tersine çevirin.
Arduino kodu
Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.
Hareket algılayınca siren çalan ve olayları raporlayan alarm.
// PIR Sensörlü Hareket Alarmı
// RobotikHocasi.com
const int pirPin = 2;
const int ledPin = 13;
const int buzzerPin = 8;
int hareketDurumu = LOW; // Bir önceki durum
void setup() {
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
// PIR sensörünün ortamı tanıması için bekle
Serial.println("Sensor isiniyor, 30 saniye bekleyin...");
for (int i = 30; i > 0; i--) {
digitalWrite(ledPin, i % 2); // Beklerken LED yanıp sönsün
delay(1000);
}
digitalWrite(ledPin, LOW);
Serial.println("Sistem hazir!");
}
void loop() {
int okuma = digitalRead(pirPin);
if (okuma == HIGH) {
digitalWrite(ledPin, HIGH);
// İki tonlu siren sesi
tone(buzzerPin, 1200, 150);
delay(180);
tone(buzzerPin, 800, 150);
delay(180);
// Sadece hareketin başladığı anda mesaj yaz
if (hareketDurumu == LOW) {
Serial.println(">> Hareket algilandi!");
hareketDurumu = HIGH;
}
} else {
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
// Sadece hareketin bittiği anda mesaj yaz
if (hareketDurumu == HIGH) {
Serial.println("<< Hareket sona erdi.");
hareketDurumu = LOW;
}
}
}
Bonus: Sessiz modda gün içindeki hareket sayısını ve son hareketten bu yana geçen süreyi sayar.
// Hareket sayacı (sessiz mod)
const int pirPin = 2;
const int ledPin = 13;
int oncekiDurum = LOW;
unsigned int hareketSayisi = 0;
unsigned long sonHareket = 0;
void setup() {
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
delay(30000); // Isınma süresi
Serial.println("Sayac basladi.");
}
void loop() {
int durum = digitalRead(pirPin);
digitalWrite(ledPin, durum);
// Yükselen kenar: LOW -> HIGH geçişi yeni bir hareket demektir
if (durum == HIGH && oncekiDurum == LOW) {
hareketSayisi++;
unsigned long gecen = (millis() - sonHareket) / 1000;
sonHareket = millis();
Serial.print("Hareket #");
Serial.print(hareketSayisi);
Serial.print(" (onceki hareketten ");
Serial.print(gecen);
Serial.println(" sn sonra)");
}
oncekiDurum = durum;
}
Kod açıklaması
for (int i = 30; i > 0; i--)Sensörün ilk açılıştaki ısınma süresini sayar. i % 2 ifadesi her saniye 1 ve 0 arasında değişerek LED'i yanıp söndürür.
int hareketDurumu = LOW;Bir önceki turdaki durumu hatırlar. Mevcut okuma ile önceki durumu karşılaştırarak sadece değişim anlarında işlem yaparız.
if (hareketDurumu == LOW)Bu kontrol olmasaydı hareket sürdükçe Seri Port Ekranı aynı mesajla dolardı. Bu tekniğe kenar algılama (edge detection) denir.
durum == HIGH && oncekiDurum == LOW&& (ve) operatörü iki koşulun aynı anda doğru olmasını ister. Bu ifade yalnızca yükselen kenarda, yani hareketin ilk başladığı anda doğrudur.
Nasıl çalışır?
PIR sensörünün içinde iki yarıya bölünmüş bir piroelektrik eleman bulunur. Ortam sabitken iki yarı aynı miktarda kızılötesi ışık alır ve birbirini dengeler. Sıcak bir cisim görüş alanında hareket ettiğinde önce bir yarıya, sonra diğerine daha fazla ışık düşer. Bu dengesizlik sensörün çıkışını tetikler.
Beyaz kubbe, aslında birçok küçük mercekten oluşan bir Fresnel lensidir. Görüş alanını çok sayıda bölgeye ayırır ve kızılötesi ışığı sensöre odaklar. Böylece yaklaşık 110 derecelik bir açıda, 7 metreye kadar hareket algılanabilir.
Sorun giderme
Alarm hiçbir hareket yokken çalıyor
Alarm bir kez çalıp uzun süre susmuyor
Hiç algılama yapmıyor
Hareket bittikten sonra birkaç saniye algılamıyor
Geliştirme fikirleri
Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.
Şifreli alarm
Bir tuş takımı ekleyerek alarmı sadece doğru şifreyle kurulup susturulabilir hale getirin.
Otomatik merdiven lambası
Röle ve LDR ile sadece karanlıkta ve hareket olduğunda yanan bir lamba yapın.
Telefona bildirim
ESP8266 veya ESP32 ile hareket algılandığında telefonunuza mesaj gönderin.
Ziyaretçi sayacı
Hareket sayısını I2C LCD ekranda gösteren bir mağaza giriş sayacı tasarlayın.