Mustafa Çakır

Yazılım, teknoloji ve hayatın içinden

Herkese merhaba! ESP32 proje serimizin üçüncü adımına hoş geldiniz. Bu projemizde, önceki projelerimizden aldığımız bilgileri bir adım öteye taşıyor ve anlık tepki veren basit sistemlerden daha akıllı bir alarm yapıyoruz.

Bir PIR hareket sensörü kullanarak ortamdaki hareketi algılayacağız ve bu hareketi bir buzzer ile sesli bir uyarıya dönüştüreceğiz. Projemizin “akıllı” kısmı ise şu: Alarm, hareket algılandığı sürece çalacak ve hareket durduktan sonra belirli bir süre daha çalmaya devam edip kendi kendine susacak.

Gerekli Malzemeler

  • 1 adet ESP32 Geliştirme Kartı
  • 1 adet PIR Hareket Sensörü (HC-SR501 modeli yaygındır)
  • 1 adet Aktif Buzzer (Active Buzzer – 5V)
  • 1 adet Breadboard
  • Jumper Kablolar (Erkek-Dişi ve Erkek-Erkek)

Devre Şeması ve Bağlantılar Bu projedeki kodumuz, sensör ve buzzer için spesifik pinleri kullanıyor. Bağlantıları bu pinlere göre yapmamız gerekiyor.

PIR Sensör Pinleri:

  • VCC (Güç) -> ESP32 5V (veya VIN) pini ben VIN kullandım
  • GND (Toprak) -> ESP32 GND pini
  • OUT (Sinyal) -> ESP32 GPIO 27 pini

Buzzer Pinleri:

  • Buzzer (+) (Genellikle uzun bacaktır) -> ESP32 GPIO 26 pini
  • Buzzer (-) (Kısa bacak) -> ESP32 GND pini

Proje Kodu (Arduino IDE) Aşağıdaki kod, projemizin tüm mantığını içermektedir. Kodu doğrudan Arduino IDE’ye yapıştırıp ESP32 kartınıza yükleyebilirsiniz.

// ESP32 Proje 4: PIR Sensörlü Gecikmeli Alarm

// Pin tanımlamaları
const int buzzerPin =  26;      // Buzzer'ın bağlı olduğu pin
const int motionSensor = 27;     // PIR Sensörünün OUT pininin bağlı olduğu pin

// Zamanlama için millis() değişkenleri
unsigned long previousMillis = 0;       // Buzzer'ın son güncellendiği zamanı saklar
unsigned long currentMillis;            // Mevcut zamanı saklar
const long interval = 3000;           // Hareket durduktan sonra ne kadar bekleneceği (milisaniye)
                                      // 3000ms = 3 saniye

void setup() {
  Serial.begin(115200);           // Seri monitörü başlat
  
  // Pin modlarını ayarla
  pinMode(buzzerPin, OUTPUT);
  pinMode(motionSensor, INPUT);
  
  Serial.println("Sistem başlatıldı. Hareket bekleniyor...");
}

void loop() {
  // Sensörden gelen sinyali oku (HIGH veya LOW)
  int reading = digitalRead(motionSensor);

  // 1. Durum: Hareket Algılandı
  if (reading == HIGH)
  {
    digitalWrite(buzzerPin, HIGH); // Buzzer'ı çalıştır
    Serial.println("Hareket algılandı! Buzzer çalışıyor...");
    
    // ÖNEMLİ: Zamanlayıcıyı sıfırla
    // Hareket gördüğümüz "son an" olarak şu anı kaydet
    previousMillis = millis();
  }
  // 2. Durum: Hareket Algılanmadı
  else {
    // Mevcut zamanı al
    currentMillis = millis();
    
    // Kontrol: Hareketin durmasından bu yana 3 saniye geçti mi?
    if (currentMillis - previousMillis >= interval) 
    {
      // 3 saniye geçtiyse ve hala hareket yoksa, buzzer'ı sustur
      digitalWrite(buzzerPin, LOW);
      
      // Not: Bu satır sadece buzzer durduğunda bir kez yazdırılır.
      // Koddaki orijinal mesajı ("Motion detected!Buzzer stop alarm!")
      // "Buzzer durdu, beklemede." olarak değiştirmek daha anlaşılır olabilir.
      Serial.println("Hareket yok. Buzzer durdu.");
    }
  }
  
  // (Bu kod 'delay' kullanmadığı için ESP32 diğer işleri de yapabilir)
}

Kodun Çalışma Mantığı: millis() ile Akıllı Kontrol

Bu kodun kalbi, delay() komutunu kullanmak yerine millis() fonksiyonunu kullanmasıdır. millis(), ESP32 çalışmaya başladığı andan itibaren geçen milisaniye sayısını verir.

  1. Hareket Algılandığında (if (reading == HIGH)):
    • Buzzer hemen HIGH yapılarak çalıştırılır.
    • En önemli satır previousMillis = millis(); komutudur. Bu komut, “Hareketin en son görüldüğü zamanı şu an olarak kaydet” der.
    • Hareket devam ettiği sürece, bu blok sürekli çalışır ve previousMillis değişkeni sürekli güncellenir. Bu sayede buzzer hiç susmaz.
  2. Hareket Durduğunda (else bloğu):
    • Sensörden LOW sinyali geldiği anda kod bu bloğa girer.
    • previousMillis değişkeni artık güncellenmez. İçinde, hareketin son görüldüğü anın zaman damgası kalır.
    • Kod, if (currentMillis - previousMillis >= interval) satırıyla sürekli şunu kontrol eder:
      • (Şu Anki Zaman) – (Hareketin Son Görüldüğü Zaman) >= 3000 mi?
    • Yani, “Hareket durduktan sonra 3 saniye geçti mi?” diye sorar.
    • İlk 2.9 saniye boyunca bu koşul false olur ve buzzer çalmaya devam eder.
    • Tam 3 saniye dolduğunda koşul true olur ve digitalWrite(buzzerPin, LOW); komutuyla buzzer susturulur.

İşte bu kadar! Projemizi başarıyla tamamladık. Artık elimizde sadece hareketi algılayan bir dedektörden fazlası var; hareket durduktan sonra bile bizim belirlediğimiz süre kadar (kodumuzda 3 saniye) çalışmaya devam eden ve sonra otomatik olarak susan daha akıllı bir sistem kurduk.

Bu projenin belki de en önemli kazanımı, delay() komutuyla işlemciyi kilitlemek yerine millis() fonksiyonunun gücünü kullanmayı öğrenmek oldu. Bu yöntem sayesinde ESP32’miz alarmı kontrol ederken, aynı anda başka görevler (örneğin Wi-Fi’a bağlanmak, bir web sunucusu çalıştırmak veya başka sensörleri okumak) için de tamamen serbest kalıyor.

Eğer 3 saniyelik bekleme süresi projeniz için kısa veya uzun geliyorsa, kodun başındaki const long interval = 3000; satırındaki 3000 değerini değiştirerek bu süreyi kolayca istediğiniz gibi ayarlayabilirsiniz. (Örneğin 10 saniye için 10000 yazabilirsiniz.)

Umarım bu proje hoşunuza gitmiştir. Yaptığınız geliştirmeleri veya aklınıza takılanları yorumlarda paylaşmaktan çekinmeyin.


Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir