Arduino Ders 16: Lazer ve LDR ile Alarm

Arduino Uygulaması

Lazerli Alarm Sistemi

LDR ve lazer kullanarak ışık kesildiğinde buzzer ile uyarı veren basit alarm sistemi yapacağız.

Arduino lazerli alarm sistemi

Arduino üzerinde alarm sistemi yapımını anlatacağım. Burada çok detaylı bir çalışma yapmaktan ziyade basit bir alarm sistemi yapacağız. Bunun için bir adet lazer kullandık. Lazer oyuncak olarak satılan lazerlerden. İsterseniz arduino için kullanılan lazer modülünü de kullanabilirsiniz. Seçim size kalmış.

  • Arduino Nano
  • Lazer
  • LDR
  • Direnç 330 Ohm olabilir
  • Buzzer

Lazer ışığı LDR üzerine sürekli düşecek şekilde yerleştirilir. Işık kesildiğinde LDR’den okunan değer değişir ve alarm çalışır.

LDR, Arduino’nun A0 analog girişinden okunur. Buzzer 8 numaralı dijital pine bağlanır. LDR için direnç ile gerilim bölücü bağlantısı yapılmalıdır.

Arduino lazerli alarm sistemi devre şeması

Lazer ışığı LDR üzerine düştüğünde analog değer belirli bir seviyede kalır. Lazer ışığı kesildiğinde değer değişir. Kodda bu değer eşik değer ile karşılaştırılır.

Okunan değer eşik değerin altına düşerse buzzer kısa aralıklarla çalışır. Eşik değeri ortam ışığına ve LDR bağlantısına göre değiştirilebilir.

Verdiğin kod parçası HTML içinde bozulmuştu. Aşağıdaki sürüm aynı temel mantıkla düzeltilmiş halidir.

int buzzer = 8;
int ldr = A0;
int deger = 0;

void setup() {
  pinMode(buzzer, OUTPUT);
}

void loop() {
  deger = analogRead(ldr);

  if (deger < 400) {
    digitalWrite(buzzer, HIGH);
    delay(200);
    digitalWrite(buzzer, LOW);
  } else {
    digitalWrite(buzzer, LOW);
  }
}

Bu sürümde pinler ve eşik değeri sabit olarak tanımlandı. Böylece eşik değerini değiştirmek daha kolay hale gelir.

const int buzzer = 8;
const int ldr = A0;

const int esikDeger = 400;

void setup() {
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);
}

void loop() {
  int deger = analogRead(ldr);

  if (deger < esikDeger) {
    digitalWrite(buzzer, HIGH);
    delay(200);
    digitalWrite(buzzer, LOW);
    delay(200);
  } else {
    digitalWrite(buzzer, LOW);
  }
}

Ortam ışığına göre esikDeger değiştirilebilir. Seri Port Ekranı ile analog değer okunarak en uygun eşik değeri belirlenebilir.

3 Yorumlar

  1. çok güüüzel devre yapılır

    YanıtlaSil
    Yanıtlar
    1. yok ya hatalıymış

      Sil
    2. // Ayarlar
      const int buzzerPin = 8; // Buzzer bağlı pin (D8)
      const int ldrPin = A0; // LDR bağlı analog pin
      const int ledPin = 13; // Durum LED'i (opsiyonel)

      const bool PASSIVE_BUZZER = false; // true = pasif buzzer (tone/noTone), false = aktif (digital on/off)

      const int SAMPLES = 8; // Ortalama için örnek sayısı
      const int SAMPLE_DELAY = 5; // örnekler arası ms
      int threshold = 400; // alarm eşik değeri (kalibre edin)
      const int HYSTERESIS = 30; // +/− histerezis (titreşimi azaltır)

      bool alarmOn = false;

      void setup() {
      pinMode(buzzerPin, OUTPUT);
      digitalWrite(buzzerPin, LOW);
      pinMode(ledPin, OUTPUT);
      digitalWrite(ledPin, LOW);

      Serial.begin(9600);
      delay(100);
      Serial.println("Lazer/LDR alarm - Başlıyor");
      // Hızlı ön-kalibrasyon (sadece bilgi amaçlı)
      long s = 0;
      for (int i=0;i<20;i++){ s += analogRead(ldrPin); delay(20); }
      Serial.print("Ön-kalibrasyon LDR ortalaması: ");
      Serial.println(s/20);
      Serial.println("Karanlık/aydınlık durumlarını ayrı ayrı test edip 'threshold' değerini ayarlayın.");
      }

      void loop() {
      int val = readAverage(ldrPin);
      Serial.print("LDR=");
      Serial.print(val);
      Serial.print(" Alarm=");
      Serial.println(alarmOn ? "ON" : "OFF");

      // Not: eğer sizin donanımda ışık arttıkça analog değer artıyorsa aşağıdaki mantık doğru.
      // Eğer bağlama şekliniz ters ise (< yerine >) tersine çevirin.

      if (!alarmOn && val < (threshold - HYSTERESIS/2)) {
      alarmOn = true;
      triggerAlarm();
      } else if (alarmOn && val > (threshold + HYSTERESIS/2)) {
      alarmOn = false;
      stopAlarm();
      }

      delay(150); // döngü hızı
      }

      int readAverage(int pin) {
      long sum = 0;
      for (int i=0;i<SAMPLES;i++) {
      sum += analogRead(pin);
      delay(SAMPLE_DELAY);
      }
      return (int)(sum / SAMPLES);
      }

      void triggerAlarm() {
      Serial.println("!! ALARM TETIKLENDI !!");
      digitalWrite(ledPin, HIGH);
      if (PASSIVE_BUZZER) {
      tone(buzzerPin, 1500); // 1.5 kHz sürekli ton (istediğiniz frekansı değiştirin)
      } else {
      digitalWrite(buzzerPin, HIGH); // aktif buzzer için
      }
      }

      void stopAlarm() {
      Serial.println("Alarm durdu.");
      digitalWrite(ledPin, LOW);
      if (PASSIVE_BUZZER) {
      noTone(buzzerPin);
      } else {
      digitalWrite(buzzerPin, LOW);
      }
      }

      Sil
Daha yeni Daha eski