Lazerli Alarm Sistemi
LDR ve lazer kullanarak ışık kesildiğinde buzzer ile uyarı veren basit alarm sistemi yapacağız.
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.
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.
çok güüüzel devre yapılır
YanıtlaSilyok ya hatalıymış
Sil// Ayarlar
Silconst 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);
}
}