// IR sensör pinini, LED pinini ve buzzer pinini tanımla
const int sensorPin = 2;
const int ledPin = 13; // Örnek olarak Arduino UNO'da dahili bir LED var, onu kullanıyoruz
const int buzzerPin = 8; // Buzzerin bağlı olduğu pin
volatile bool sensorState = LOW; // Sensör durumu
volatile unsigned long previousMillis = 0; // Önceki kesme anını saklar
const long ledDuration = 3000; // LED'in ve buzzerin yandığı süre (milisaniye cinsinden)
const long debounceDuration = 200; // Debounce süresi (milisaniye cinsinden)
volatile bool debounceActive = false; // Debounce işlemi aktif mi?
void setup() {
// Seri portu başlat
Serial.begin(9600);
// Sensör pinini giriş olarak, LED pinini çıkış olarak ayarla
pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT); // Buzzer pinini çıkış olarak ayarla
attachInterrupt(digitalPinToInterrupt(sensorPin), detect, CHANGE); // Kesme fonksiyonunu bağla
}
void loop() {
unsigned long currentMillis = millis();
// Sensör durumuna göre LED'i ve buzzer'i kontrol et
if (sensorState == HIGH) {
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH); // Buzzer'i aç
if (currentMillis - previousMillis >= ledDuration) {
sensorState = LOW;
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW); // Buzzer'i kapat
}
}
// Debounce işlemi kontrolü
if (debounceActive) {
if (currentMillis - previousMillis > debounceDuration) {
debounceActive = false; // Debounce süresi sona erdi, tekrar kesmeyi aktif et
attachInterrupt(digitalPinToInterrupt(sensorPin), detect, CHANGE);
}
}
}
void detect() {
if (!debounceActive) { // Eğer debounce işlemi aktif değilse kesmeyi işle
// Kesme tetiklendiğinde, sensör durumunu güncelle ve zaman damgası al
sensorState = HIGH;
previousMillis = millis();
debounceActive = true; // Debounce işlemini aktif et
detachInterrupt(digitalPinToInterrupt(sensorPin)); // Kesme işlemini devre dışı bırak
}
}