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üç) -> ESP325V(veyaVIN) pini ben VIN kullandımGND(Toprak) -> ESP32GNDpiniOUT(Sinyal) -> ESP32GPIO 27pini
Buzzer Pinleri:
- Buzzer (+) (Genellikle uzun bacaktır) -> ESP32
GPIO 26pini - Buzzer (-) (Kısa bacak) -> ESP32
GNDpini
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.
- Hareket Algılandığında (
if (reading == HIGH)):- Buzzer hemen
HIGHyapı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
previousMillisdeğişkeni sürekli güncellenir. Bu sayede buzzer hiç susmaz.
- Buzzer hemen
- Hareket Durduğunda (
elsebloğu):- Sensörden
LOWsinyali geldiği anda kod bu bloğa girer. previousMillisdeğ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
falseolur ve buzzer çalmaya devam eder. - Tam 3 saniye dolduğunda koşul
trueolur vedigitalWrite(buzzerPin, LOW);komutuyla buzzer susturulur.
- Sensörden
İş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