Parçalar · 14 dk okuma

Lazer Modülü Arduino: KY-008 ile Lazerli Alarm ve Geçiş Sayacı

KY-008 lazer modülü Arduino bağlantısı, 5 mW 650 nm göz güvenliği, LDR ile lazer bariyeri, eşik kalibrasyonu, aynalı ışın, yarış zamanlayıcı ve ESP32 bildirimi.

Lazer modülü, Arduino ile kullanılan en dikkat çekici parçalardan biridir: kırmızı, ince ve metrelerce dağılmadan ilerleyen bir ışın üretir. Hobi kitlerinde bulunan KY-008 lazer modülü, 650 nm dalga boyunda ve yaklaşık 5 mW gücünde bir lazer diyodu küçük bir kartta toplar; Arduino'nun tek bir dijital pinine bağlanır ve digitalWrite() ile açılıp kapanır. Tek başına bir işaretleyiciden ibarettir, ama karşısına bir ışık sensörü koyduğunda filmlerdeki gibi bir lazerli alarm, kapıdan geçenleri sayan bir sayaç ya da milisaniye hassasiyetinde süre tutan bir yarış zamanlayıcı olur.

Bu yazıda KY-008'in teknik değerlerini, 5 mW'lık bir lazerin gözün için ne kadar tehlikeli olduğunu ve hangi kurallara uyman gerektiğini, modülü Arduino Uno, ESP32 ve Raspberry Pi Pico'ya doğru bağlamayı öğreneceksin. Ardından LDR ile bir lazer bariyeri kuracak, eşiği elle denemek yerine Arduino'ya otomatik ölçtürecek, aynalarla tek lazerden çoklu ışın elde edecek, geçişleri sayıp hız ölçecek ve ESP32 ile ışın kesildiğinde telefonuna bildirim göndereceksin.

KY-008 lazer modülü (650 nm, 5 mW)
KY-008 lazer modülü: pirinç gövdeli 6 mm lazer kafası, arkasındaki küçük kartta akım sınırlama direnci ve üç pin (S, orta pin ve −).

KY-008 lazer modülü nedir, nasıl çalışır?

Modülün kalbi, pirinç bir tüpün içine yerleştirilmiş küçük bir lazer diyottur. Sıradan bir LED'in aksine lazer diyot, akım belirli bir eşiği geçtiğinde ışığı tek bir dalga boyunda ve düzenli (koherent) olarak üretir; tüpün ucundaki küçük mercek bu ışığı neredeyse paralel bir ışına çevirir. Bu yüzden LED'in ışığı birkaç santimetrede dağılırken lazer noktası birkaç metre sonra bile birkaç milimetre büyüklüğünde kalır. 650 nm, gözün rahatça gördüğü koyu kırmızıya karşılık gelir. Lazer kafasının arkasındaki küçük karttaki direnç, diyottan geçen akımı sınırlar. Lazer diyotlar aşırı akıma LED'lerden çok daha duyarlıdır; bu direnci atlayıp diyodu doğrudan beslemek onu saniyeler içinde bozabilir.

ÖzellikDeğer
ModelKY-008 (bazı satıcılarda HW-493)
Dalga boyu650 nm (görünür kırmızı)
Çıkış gücüYaklaşık 5 mW
Lazer sınıfı3R (IEC 60825-1), ABD'de IIIa
Çalışma gerilimi5 V (3,3 V'ta daha sönük yanar)
Akım40 mA'in altında; karttan karta değişir
Lazer kafası6 mm çaplı pirinç tüp
PinlerS (sinyal), orta pin (çoğu kartta +5V ya da boş), − (GND)
Çalışma sıcaklığı−10 ile 40 °C arası

Göz güvenliği: 5 mW lazer ne kadar tehlikeli?

Lazerin tehlikesi toplam gücünden değil, bu gücün çok küçük bir noktada toplanmasından gelir. Gözün merceği paralel bir ışını retinada mikron boyutunda bir noktaya odaklar; bu yüzden ekranda zararsız görünen 5 mW, retinada güneşe doğrudan bakmaktan bile yoğun bir noktaya dönüşebilir. Lazerler bu riske göre sınıflara ayrılır. 1 mW'ın altındaki Sınıf 2 lazerlerde gözün refleks olarak kırpılması (yaklaşık 0,25 saniye) genellikle koruma sağlar. KY-008'in girdiği Sınıf 3R ise bu sınırın beş katına kadar çıkar: kısa ve kazara bir bakışta risk düşüktür, ama ışına doğrudan ya da bir ayna üzerinden bakmak göze zarar verebilir.

SınıfGörünür ışıkta güçRisk
1Çok düşük ya da ışın cihazın içinde kapalıNormal kullanımda güvenli
21 mW'a kadarGöz kırpma refleksi korur; bilerek bakılmamalı
3R1–5 mW (KY-008)Doğrudan bakış göze zarar verebilir
3B5–500 mWDoğrudan ve aynadan yansıyan ışın tehlikeli
4500 mW üzeriGöz, cilt ve yangın tehlikesi
  • Işına asla bakma: Lazerin çıktığı ucu gözüne yaklaştırma, modülü çalışırken elinde gezdirme.
  • Işını göz hizasının altında tut: Alarm ve sayaç ışınlarını yerden 20–50 cm yükseğe kur. Bu yükseklik emekleyen bir bebeğin, küçük bir çocuğun ya da bir kedinin, köpeğin göz hizasına denk gelir; evde onlar varken lazeri açık bırakma.
  • Yansımalara dikkat et: Aynalar, cam, saat kadranları ve parlak metaller ışını beklenmedik yönlere gönderir. Işının yolunu baştan sona kontrol et ve sonunu mat, koyu bir yüzeyle bitir.
  • Çocuklar yalnız kullanmasın: Lazer bir oyuncak değildir; okul ve bilim fuarı projelerinde bir yetişkinin gözetiminde çalış.
  • Etikete körü körüne güvenme: Ucuz modüllerde gerçek güç etiketten farklı olabilir; her modüle en az Sınıf 3R gibi davran.
  • Hizalamayı kâğıtla yap: Işının önüne beyaz bir kâğıt tut ve noktayı kâğıt üzerinde izle; ışının nereye gittiğini görmek için asla ışının içine bakma.
Lazeri insanlara, hayvanlara, araç sürücülerine ya da uçaklara doğrultmak hem göz hasarına hem de ciddi kazalara yol açabilir ve birçok ülkede suçtur. KY-008 ile yaptığın her projede ışını sabit, göz hizasının altında ve kontrolün altında tut.

KY-008 bağlantısı: Arduino Uno, ESP32 ve Raspberry Pi Pico

KY-008'in üç pini vardır: S sinyal pinidir ve HIGH olduğunda lazer yanar, − GND'dir, işaretsiz orta pin ise çoğu kartta +5V'a gider ya da boştur. Lazer, S ile − arasına bağlıdır; yani S pinine bağladığın Arduino pini lazerin akımını doğrudan sağlar. Arduino Uno'da kısa denemeler için bu sorun değildir, ama modülün akımı karttan karta değişir ve 40 mA'e yaklaşabilir. Bu, ATmega328P'nin pin başına mutlak sınırıdır; önerilen değer 20 mA'dir. Lazeri saatlerce açık tutacaksan, birden fazla lazer kullanacaksan ya da ESP32 veya Pico ile çalışıyorsan lazeri 5V'tan besle ve bir NPN transistörle (BC547, S8050 ya da 2N2222) anahtarla. Transistörün bacak dizilimine transistör rehberinden bakabilirsin.

BağlantıArduino UnoESP32Raspberry Pi Pico
KY-008 SD75V (VIN)VBUS (pin 40)
KY-008 orta pinBoş (lazer yanmazsa 5V)5V (VIN)VBUS (pin 40)
KY-008 −GNDNPN kollektörüNPN kollektörü
NPN emiteri–GNDGND (pin 38)
NPN beyzi (1 kΩ ile)–GPIO 26GP15 (pin 20)
LDR 1. bacak5V3V33V3(OUT) (pin 36)
LDR 2. bacak + direncin üst ucuA0GPIO 34GP26 (pin 31)
Direncin (3,3–10 kΩ) alt ucuGNDGNDGND
Aktif buzzer +D8GPIO 25GP14 (pin 19)
ESP32 ve Pico'nun pinleri 3,3 V'a göredir ve az akım verir; Pico'nun bir GPIO pini varsayılan olarak yalnızca 4 mA, en fazla 12 mA sağlar. Bu kartlarda lazeri pinden doğrudan besleme, transistör kullan. LDR bölücüsünü ise mutlaka 3V3 pininden besle: 5V'tan beslenen bir bölücü, lazer LDR'ye vurduğunda analog pine 3,3 V'un üzerinde gerilim gönderir ve pine zarar verebilir. Aktif buzzer'lar da 20–30 mA çekebilir: ESP32'de pinden doğrudan sürülebilir, Pico'da ise buzzer'ı da bir NPN transistörle sür ya da 3 V'luk düşük akımlı bir buzzer seç.

Kodlara geçmeden önce aşağıdaki küçük test programıyla lazeri ve LDR'yi birlikte dene. Program lazeri yarım saniye aralıklarla açıp kapatır ve iki durumda okunan değeri Seri Monitör'e yazar. İki değer arasındaki fark ne kadar büyükse bariyerin o kadar güvenilir çalışır: Uno'da 300'ün üzerinde bir fark çok iyidir; 100'ün altındaysa ışın LDR'ye tam denk gelmiyor ya da ortam ışığı çok güçlü demektir.

C++ (Arduino IDE)
1// KY-008 + LDR ilk test: lazer açıkken ve kapalıyken değerleri gör / First test: see readings with the laser on and off
2const int LASER_PIN = 7;   // KY-008 S pini / KY-008 S pin
3const int LDR_PIN = A0;    // LDR bölücü çıkışı / LDR divider output
4
5void setup() {
6  Serial.begin(9600);
7  pinMode(LASER_PIN, OUTPUT);
8}
9
10void loop() {
11  digitalWrite(LASER_PIN, HIGH);   // lazer açık / laser on
12  delay(500);                      // LDR'nin oturmasını bekle / let the LDR settle
13  int onValue = analogRead(LDR_PIN);
14
15  digitalWrite(LASER_PIN, LOW);    // lazer kapalı / laser off
16  delay(500);
17  int offValue = analogRead(LDR_PIN);
18
19  Serial.print(F("Isin var / beam: "));
20  Serial.print(onValue);
21  Serial.print(F("  Isin yok / no beam: "));
22  Serial.print(offValue);
23  Serial.print(F("  Fark / gap: "));
24  Serial.println(onValue - offValue);
25}

LDR ile lazer bariyeri nasıl çalışır?

Lazer bariyerinin mantığı basittir: lazer ışını karşıdaki bir LDR'ye (ışığa duyarlı direnç) sürekli vurur. Lazer noktası düşen LDR'nin direnci birkaç yüz ohma iner, ışın kesildiğinde ise onlarca kiloohma çıkar. LDR'yi sabit bir dirençle gerilim bölücü olarak bağladığında bu direnç değişimi analog pinde bir gerilim değişimine dönüşür: 5V → LDR → A0 → direnç → GND bağlantısında ışın varken A0 yüksek, ışın kesilince düşük okunur. Biri ışının önünden geçtiği anda değer düşer ve Arduino alarmı çalar.

LDR (foto direnç)
LDR (foto direnç)
NPN transistör (S8050)
NPN transistör (S8050)
Aktif buzzer
Aktif buzzer

Lazerin LDR üzerinde neden bu kadar güçlü bir etki yarattığını küçük bir hesapla görebilirsin: 5 mW'lık ışın yaklaşık 3 mm çaplı bir noktada toplandığında metrekare başına 700 W civarında bir ışık yoğunluğu oluşur. Bu, öğle güneşiyle aynı mertebededir ve aydınlık bir odanın ışığının yüzlerce katıdır. Yine de bariyerin en büyük düşmanı ortam ışığıdır: güneş alan bir pencerenin önünde LDR, ışın kesilse bile aydınlık kalır ve alarm hiçbir şey fark etmez. Çözüm çok ucuzdur: LDR'yi 3–5 cm uzunluğunda siyah bir borunun (boş bir tükenmez kalem gövdesi, siyah pipet ya da makaron) dibine yerleştir. Boru yalnızca karşıdan gelen lazeri içeri alır, yandan gelen ortam ışığını keser.

DurumLDR direnci (örnek)10 kΩ ile analogRead3,3 kΩ ile analogRead
Lazer LDR'de (boru içinde)300 Ω993938
Işın kesik (boru içinde)30 kΩ256101
Işın kesik (borusuz, aydınlık oda)3 kΩ787536
Işınlı ve ışınsız fark (boru içinde)–737837
Bölücüdeki sabit direnç için en iyi değer, ışınlı ve ışınsız LDR dirençlerinin geometrik ortalamasıdır: R = √(R_ışın × R_kesik). Tablodaki 300 Ω ve 30 kΩ için √(300 × 30 000) = 3 000 Ω eder; en yakın standart değer 3,3 kΩ'dur. Kendi LDR'nin iki direncini multimetreyle ölç, sonucu gerilim bölücü hesaplayıcısında dene ve en yakın değeri standart direnç değeri aracıyla bul.

Adım adım: Arduino ile lazerli alarm

  1. KY-008'in S pinini D7'ye, − pinini GND'ye bağla; orta pini boş bırak (lazer yanmazsa 5V'a bağla).
  2. LDR'nin bir bacağını 5V'a, diğer bacağını A0'a bağla; A0 ile GND arasına 3,3 kΩ ya da 10 kΩ'luk bir direnç koy.
  3. LDR'yi siyah bir borunun dibine yerleştir ve borunun ağzını lazere doğru çevir.
  4. Aktif buzzer'ın + bacağını D8'e, − bacağını GND'ye bağla. Susturma butonunu D4 ile GND arasına tak; dahili pull-up kullanıldığı için ek direnç gerekmez.
  5. Lazeri ve LDR'yi sağlam bir zemine sabitle; lazer noktasını önce beyaz bir kâğıtla bul, sonra borunun içine düşür.
  6. Kodu yükle ve Seri Monitör'ü 9600 baud'da aç. Açılışta ışının önünde kimse olmamalı; Arduino lazeri bir kez kapatıp açarak kendini kalibre eder.
C++ (Arduino IDE)
1// KY-008 lazer + LDR ile lazerli alarm / Laser tripwire alarm with KY-008 + LDR
2const int LASER_PIN = 7;       // KY-008 S pini ya da transistör bazı / KY-008 S pin or transistor base
3const int LDR_PIN = A0;        // LDR bölücü çıkışı / LDR divider output
4const int BUZZER_PIN = 8;      // aktif buzzer / active buzzer
5const int LED_PIN = 13;        // kart üzerindeki LED / on-board LED
6const int RESET_PIN = 4;       // susturma butonu, diğer ucu GND / silence button, other leg to GND
7
8const int BREAK_PCT = 40;                // %40'ın altı = ışın kesik / below 40% = beam broken
9const int RESTORE_PCT = 60;              // %60'ın üstü = ışın sağlam / above 60% = beam intact
10const unsigned long CONFIRM_MS = 30;     // en az bu kadar kesik kalmalı / must stay broken this long
11const unsigned long ALARM_MS = 10000;    // alarm süresi / alarm duration
12
13int onLevel = 0, offLevel = 0;           // ışınlı ve ışınsız ölçüm / reading with and without the beam
14bool beamOk = true;
15bool alarmOn = false;
16unsigned long brokenSince = 0;
17unsigned long alarmStart = 0;
18
19int readAvg() {
20  long sum = 0;
21  for (int i = 0; i < 8; i++) sum += analogRead(LDR_PIN);  // 8 ölçüm ortalaması / average of 8 readings
22  return sum / 8;
23}
24
25void calibrate() {
26  while (true) {
27    digitalWrite(LASER_PIN, LOW);        // lazer kapalı = kesik ışın / laser off = broken beam
28    delay(300);                          // LDR yavaştır, bekle / the LDR is slow, wait
29    offLevel = readAvg();
30    digitalWrite(LASER_PIN, HIGH);       // lazer açık = sağlam ışın / laser on = intact beam
31    delay(300);
32    onLevel = readAvg();
33    Serial.print(F("Isinli / beam: "));
34    Serial.print(onLevel);
35    Serial.print(F("  Isinsiz / no beam: "));
36    Serial.println(offLevel);
37    if (abs(onLevel - offLevel) >= 100) return;   // yeterli fark var / enough difference
38    Serial.println(F("Isin LDR'ye ulasmiyor, hizala! / Beam misses the LDR, align it!"));
39    delay(2000);
40  }
41}
42
43// 100 = ışın tam, 0 = ışın yok; LDR'nin yönü fark etmez / 100 = full beam, 0 = no beam; LDR polarity doesn't matter
44int beamPercent() {
45  return (long)(readAvg() - offLevel) * 100 / (onLevel - offLevel);
46}
47
48void setup() {
49  Serial.begin(9600);
50  pinMode(LASER_PIN, OUTPUT);
51  pinMode(BUZZER_PIN, OUTPUT);
52  pinMode(LED_PIN, OUTPUT);
53  pinMode(RESET_PIN, INPUT_PULLUP);
54  calibrate();
55  Serial.println(F("Alarm hazir / Alarm armed"));
56}
57
58void loop() {
59  unsigned long now = millis();
60  int pct = beamPercent();
61
62  if (beamOk && pct < BREAK_PCT) {       // ışın yeni kesildi / beam just broke
63    beamOk = false;
64    brokenSince = now;
65  } else if (!beamOk && pct > RESTORE_PCT) {
66    beamOk = true;                       // ışın geri geldi / beam restored
67  }
68
69  if (!beamOk && !alarmOn && now - brokenSince >= CONFIRM_MS) {
70    alarmOn = true;
71    alarmStart = now;
72    Serial.println(F("ALARM: isin kesildi! / beam broken!"));
73  }
74
75  if (alarmOn && (now - alarmStart >= ALARM_MS || digitalRead(RESET_PIN) == LOW)) {
76    alarmOn = false;                     // süre doldu ya da butona basıldı / timeout or button pressed
77  }
78
79  digitalWrite(LED_PIN, beamOk ? LOW : HIGH);
80  digitalWrite(BUZZER_PIN, (alarmOn && (now / 200) % 2) ? HIGH : LOW);  // kesik siren / beeping siren
81}

Kod sabit bir eşik değeri kullanmaz. Açılışta calibrate() lazeri kapatıp LDR'nin ışın yokken verdiği değeri, sonra lazeri açıp ışın varken verdiği değeri ölçer. beamPercent() anlık ölçümü bu iki değere göre 0 ile 100 arasında bir yüzdeye çevirir: 100 ışının tam geldiğini, 0 tamamen kesildiğini gösterir. Bu hesap LDR'yi bölücünün üstüne ya da altına bağlamandan etkilenmez; değer ışıkla artsa da azalsa da sonuç aynıdır. Işın %40'ın altına düşüp en az 30 ms öyle kalırsa alarm 10 saniye boyunca kesik kesik öter, D4'teki buton ise alarmı erken susturur. Işın hâlâ kesikse alarm yeniden başlar; yani biri ışının önünde durduğu sürece sistem susmaz.

Eşik kalibrasyonu: neden sabit bir sayı yazmamalısın?

İnternetteki birçok lazerli alarm örneği "analogRead(A0) < 500" gibi sabit bir eşik kullanır. Bu, masada denediğin akşam çalışır; ama ertesi sabah güneş odaya girdiğinde, lazeri birkaç milimetre oynattığında ya da LDR'yi değiştirdiğinde bozulur. Doğru eşik, ışınlı ve ışınsız değerlerin tam ortasıdır. Bu iki değeri her açılışta yeniden ölçen otomatik kalibrasyon, sistemi bulunduğu ortama uydurur. Yukarıdaki kodda eşik tek bir sayı değil, iki sayıdır: ışın %40'ın altına inince kesik, %60'ın üstüne çıkınca sağlam kabul edilir. Aradaki bu boşluğa histerezis denir; değer eşiğin tam üzerinde dalgalanırken alarmın saniyede onlarca kez açılıp kapanmasını önler.

AyarKoddaki değerNe işe yarar?Ne zaman değiştirilir?
BREAK_PCT40Işının kesik sayıldığı seviyeYarı saydam cisimleri (cam, ince kumaş) de algılamak için 60–70'e çıkar
RESTORE_PCT60Işının yeniden sağlam sayıldığı seviyeHer zaman BREAK_PCT'nin 15–20 puan üstünde tut
CONFIRM_MS30Kısa parazitleri (böcek, toz, titreşim) yok sayarYanlış alarm çoksa 100–200 ms'ye çıkar, hızlı geçişler kaçıyorsa düşür
Ortalama sayısı8Elektriksel gürültüyü ve lamba titreşimini yumuşatırUno'da her ölçüm yaklaşık 0,1 ms sürer; 8 ölçüm 1 ms'yi geçmez
Kalibrasyon farkı100Işın LDR'ye ulaşmıyorsa kurulumu durdururÇok uzun mesafede ya da çok aydınlık ortamda 50'ye indirebilirsin

Uzun süre çalışacak bir sistemde ortam ışığı gün içinde yavaşça değişir. Bunu telafi etmenin kolay bir yolu, ışın sağlamken ve alarm çalmıyorken (örneğin her saat başı) calibrate() fonksiyonunu yeniden çağırmaktır. Lazeri Arduino kendisi kapattığı için bu kısa karanlığı alarm sanmaz. Ölçümleri izlemek için Arduino IDE'deki Seri Çizici (Serial Plotter) çok işe yarar: ışının önünden elini geçirdiğinde grafiğin ne kadar düştüğünü ve ne kadar sürede toparlandığını görürsün.

Aynalarla çoklu ışın: tek lazerle bir ağ örmek

Tek bir ışının altından eğilerek ya da üstünden atlayarak kolayca geçilebilir. Filmlerdeki lazer ağlarını kurmak için her ışına ayrı bir lazer ve LDR koymak yerine tek lazeri aynalarla zikzak çizecek şekilde yansıtabilirsin. Kapının ya da koridorun iki yanına karşılıklı aynalar yerleştirirsin; ışın bir yandan diğerine sekerek ilerler ve en sonunda LDR'ye ulaşır. Herhangi bir parçası kesildiğinde LDR karanlıkta kalır, yani tek bir LDR ve aynı kod bütün ağı korur. Yansıma açısı geliş açısına eşit olduğu için her aynayı, ışını bir sonraki aynanın ortasına gönderecek kadar çok az eğmen yeter.

Her aynada ışığın bir kısmı kaybolur. Sıradan bir banyo aynası ışığın yaklaşık %90'ını yansıtır ve önündeki camdan sönük bir ikinci nokta (hayalet yansıma) üretir. Yansıtıcı tabakası camın önünde olan ön yüzey aynaları ise %95 ve üzerini yansıtır ve tek, temiz bir nokta verir. Kayıplar çarpılarak birikir; bu yüzden ayna sayısı arttıkça LDR'ye ulaşan ışık hızla azalır:

Ayna sayısıSıradan ayna (%90)Ön yüzey aynası (%95)
1%90%95
2%81%90
4%66%81
6%53%74
8%43%66

Bu tablo önemli bir şeyi gösterir: kalibrasyonlu kod için %43 bile fazlasıyla yeterlidir, çünkü lazer noktası ortam ışığından yüzlerce kat parlaktır. Asıl zorluk güç kaybı değil, hizalamadır. Işının yolu uzadıkça küçük bir açı hatası büyür: 5 m ötede 1 derecelik bir sapma noktayı yaklaşık 9 cm kaydırır. Ucuz lazerlerin ışını da yol boyunca biraz genişler; birkaç metre sonra nokta, LDR'nin 5 mm'lik yüzeyinden büyük hâle gelebilir.

  1. Lazeri, aynaları ve LDR borusunu sağlam tutuculara (vidalı L köşebent, 3D baskı tutucu ya da sıcak silikonla sabitlenmiş tahta takoz) monte et; elle tutulan bir ayna asla hizalı kalmaz.
  2. Odanın ışığını azalt ve ilk aynanın önüne beyaz bir kâğıt tutarak lazer noktasını bul.
  3. Aynaları baştan sona doğru sırayla hizala: her aynayı, nokta bir sonraki aynanın ortasına düşene kadar çok az eğ.
  4. Son ışını LDR borusunun ağzına yönlendir ve test kodunu çalıştırarak Seri Monitör'deki farkın en büyük olduğu konumu bul.
  5. Her şey hizalandığında aynaların açısını sıcak silikon ya da kilit vidasıyla sabitle; masaya yapılan küçük bir darbe bile hizayı bozabilir.
  6. Ağın her parçasını tek tek elinle keserek dene ve her kesintide alarmın çaldığını doğrula.
Kabloları tek tarafta toplamak istersen ışını karşı duvardaki bir aynayla geri yansıt: lazer ve LDR yan yana durur, karşı tarafta elektrik gerektirmeyen bir ayna kalır. Temiz havada lazer ışını yandan bakınca görünmez, yalnızca çarptığı nokta görünür; ışının yolunu görmek istersen havaya biraz su buharı ya da sis ver.

Geçiş sayacı: kaç kişi geçti, ne kadar sürdü?

Aynı bariyer bir kapıdan geçenleri, bantta ilerleyen kutuları ya da bir kutuya düşen topları saymak için de kullanılır. Saymanın püf noktası her geçişi bir kez saymaktır. Aşağıdaki kod ışının kesildiği anı kaydeder ve ışın geri geldiğinde geçişi sayar; böylece ışının önünde bir süre duran biri de tek geçiş olarak sayılır. 15 ms'den kısa kesintiler toz ya da elektriksel parazit kabul edilip yok sayılır. Kod ayrıca ışının ne kadar süre kesik kaldığını da yazar: cismin boyunu biliyorsan bu süre doğrudan hızı verir (v = L / t). Örneğin 25 cm uzunluğundaki bir oyuncak araba ışını 50 ms kesiyorsa hızı 0,25 / 0,05 = 5 m/s'dir.

C++ (Arduino IDE)
1// Lazer bariyeriyle geçiş sayacı ve kesilme süresi / Laser barrier pass counter and block time
2const int LASER_PIN = 7;                 // KY-008 S pini / KY-008 S pin
3const int LDR_PIN = A0;                  // LDR bölücü çıkışı / LDR divider output
4const unsigned long MIN_BREAK_MS = 15;   // daha kısa kesintiler parazittir / shorter breaks are noise
5const float OBJECT_LENGTH_M = 0.0;       // cismin boyu biliniyorsa yaz (ör. 0.25) / object length if known (e.g. 0.25)
6
7int onLevel = 0, offLevel = 0;
8bool beamOk = true;
9unsigned long brokenSince = 0;
10unsigned long passCount = 0;
11
12int readAvg() {
13  long sum = 0;
14  for (int i = 0; i < 4; i++) sum += analogRead(LDR_PIN);  // 4 ölçüm yeterli ve hızlı / 4 readings: enough and fast
15  return sum / 4;
16}
17
18void calibrate() {
19  while (true) {
20    digitalWrite(LASER_PIN, LOW);
21    delay(300);
22    offLevel = readAvg();
23    digitalWrite(LASER_PIN, HIGH);
24    delay(300);
25    onLevel = readAvg();
26    if (abs(onLevel - offLevel) >= 100) return;
27    Serial.println(F("Isin LDR'ye ulasmiyor / Beam misses the LDR"));
28    delay(2000);
29  }
30}
31
32int beamPercent() {
33  return (long)(readAvg() - offLevel) * 100 / (onLevel - offLevel);
34}
35
36void setup() {
37  Serial.begin(9600);
38  pinMode(LASER_PIN, OUTPUT);
39  calibrate();
40  Serial.println(F("Sayac hazir / Counter ready"));
41}
42
43void loop() {
44  unsigned long now = millis();
45  int pct = beamPercent();
46
47  if (beamOk && pct < 40) {
48    beamOk = false;
49    brokenSince = now;                   // kesilme anı / moment of the break
50  } else if (!beamOk && pct > 60) {
51    beamOk = true;
52    unsigned long blocked = now - brokenSince;   // ışın ne kadar kesik kaldı / how long the beam was blocked
53    if (blocked >= MIN_BREAK_MS) {
54      passCount++;
55      Serial.print(F("Gecis / Pass #"));
56      Serial.print(passCount);
57      Serial.print(F("  Sure / Time: "));
58      Serial.print(blocked);
59      Serial.print(F(" ms"));
60      if (OBJECT_LENGTH_M > 0) {
61        float speed = OBJECT_LENGTH_M / (blocked / 1000.0);  // v = L / t
62        Serial.print(F("  Hiz / Speed: "));
63        Serial.print(speed, 2);
64        Serial.print(F(" m/s"));
65      }
66      Serial.println();
67    }
68  }
69}

Kişinin hangi yöne geçtiğini bilmek istersen 10–15 cm arayla iki paralel ışın kullan. Önce dıştaki A ışını, sonra içteki B ışını kesiliyorsa kişi içeri giriyordur; önce B, sonra A kesiliyorsa dışarı çıkıyordur. Yalnızca A kesilip B hiç kesilmeden ışın geri gelirse kişi kapıya yaklaşıp vazgeçmiştir ve sayılmaz. İçerideki kişi sayısını girişlerden çıkışları çıkararak bulursun ve bir 7 segment display ya da I2C LCD ekran üzerinde gösterebilirsin. İki ışın arasındaki boşluk, bir insanın gövdesinin iki ışını bir an aynı anda kesebileceği kadar dar olmalıdır.

Yarış zamanlayıcı ve hız ölçme

İki lazer kapısı arasındaki süreyi ölçmek; koşu, bisiklet, oyuncak araba ya da fizik deneyleri için hassas bir kronometre sağlar. Başlangıç ve bitiş kapılarını aralarında bilinen bir mesafe (d) olacak şekilde kurarsın; hız v = d / t formülüyle bulunur. 10 m'lik bir parkuru 2,5 saniyede koşan biri saniyede 4 m, yani saatte 14,4 km hızla koşmuştur. İki lazeri aynı anda açıp kapatabilmek için ikisinin de − ucunu tek bir 2N2222 ya da S8050 transistörün kollektörüne bağla; S ve orta pinleri 5V'a, transistörün emiterini GND'ye, beyzini 1 kΩ ile D7'ye bağla. Başlangıç kapısının LDR'si A0'a, bitiş kapısınınki A1'e gider.

C++ (Arduino IDE)
1// İki lazer kapılı yarış zamanlayıcı ve hız ölçer / Two-gate laser race timer and speed meter
2const int LASER_PIN = 7;                 // iki lazer tek transistörle / both lasers through one transistor
3const int START_LDR = A0;                // başlangıç kapısı / start gate
4const int FINISH_LDR = A1;               // bitiş kapısı / finish gate
5const int BUZZER_PIN = 8;                // aktif buzzer / active buzzer
6const float DISTANCE_M = 10.0;           // kapılar arası mesafe (metre) / distance between the gates (m)
7const unsigned long TIMEOUT_MS = 60000;  // 60 sn'de bitmezse iptal / cancel after 60 s
8
9int onA, offA, onB, offB;
10enum State { READY, RUNNING, DONE };
11State state = READY;
12unsigned long startUs = 0;
13unsigned long startMs = 0;
14unsigned long doneMs = 0;
15
16int readAvg(int pin) {
17  long sum = 0;
18  for (int i = 0; i < 4; i++) sum += analogRead(pin);
19  return sum / 4;
20}
21
22bool isBroken(int pin, int on, int off) {
23  long pct = (long)(readAvg(pin) - off) * 100 / (on - off);
24  return pct < 40;                       // %40'ın altı = kesik / below 40% = broken
25}
26
27void calibrate() {
28  while (true) {
29    digitalWrite(LASER_PIN, LOW);        // iki lazer de kapalı / both lasers off
30    delay(300);
31    offA = readAvg(START_LDR);
32    offB = readAvg(FINISH_LDR);
33    digitalWrite(LASER_PIN, HIGH);       // iki lazer de açık / both lasers on
34    delay(300);
35    onA = readAvg(START_LDR);
36    onB = readAvg(FINISH_LDR);
37    if (abs(onA - offA) >= 100 && abs(onB - offB) >= 100) return;
38    Serial.println(F("Kapilardan biri hizali degil / One gate is misaligned"));
39    delay(2000);
40  }
41}
42
43void beep(int ms) {
44  digitalWrite(BUZZER_PIN, HIGH);
45  delay(ms);
46  digitalWrite(BUZZER_PIN, LOW);
47}
48
49void setup() {
50  Serial.begin(9600);
51  pinMode(LASER_PIN, OUTPUT);
52  pinMode(BUZZER_PIN, OUTPUT);
53  calibrate();
54  Serial.println(F("Hazir: baslangic kapisini gec / Ready: cross the start gate"));
55}
56
57void loop() {
58  if (state == READY && isBroken(START_LDR, onA, offA)) {
59    startUs = micros();                  // zamanı hemen al / grab the time immediately
60    startMs = millis();
61    state = RUNNING;
62    beep(30);
63  } else if (state == RUNNING) {
64    if (isBroken(FINISH_LDR, onB, offB)) {
65      unsigned long elapsedUs = micros() - startUs;
66      float seconds = elapsedUs / 1000000.0;
67      float speed = DISTANCE_M / seconds;            // v = d / t
68      Serial.print(F("Sure / Time: "));
69      Serial.print(seconds, 3);
70      Serial.print(F(" s  Hiz / Speed: "));
71      Serial.print(speed, 2);
72      Serial.print(F(" m/s = "));
73      Serial.print(speed * 3.6, 1);
74      Serial.println(F(" km/h"));
75      beep(300);
76      state = DONE;
77      doneMs = millis();
78    } else if (millis() - startMs > TIMEOUT_MS) {
79      Serial.println(F("Zaman asimi / Timeout"));
80      state = READY;
81    }
82  } else if (state == DONE && millis() - doneMs > 3000 &&
83             !isBroken(START_LDR, onA, offA) && !isBroken(FINISH_LDR, onB, offB)) {
84    state = READY;                       // 3 sn sonra yeni tur / new run after 3 s
85    Serial.println(F("Hazir / Ready"));
86  }
87}

Kod bir durum makinesi gibi çalışır: HAZIR durumunda başlangıç ışını kesilince micros() ile zamanı kaydeder ve KOŞU durumuna geçer; bitiş ışını kesilince geçen süreyi ve hızı yazar, 3 saniye sonra yeni tura hazırlanır. 60 saniye içinde bitiş kapısı geçilmezse tur iptal edilir. Ölçüm hassasiyeti konusunda dürüst olalım: kodun kendisi 1 ms'den iyi çözünürlükle ölçer, ama LDR'nin karanlığa tepki vermesi 10–30 ms sürer. Neyse ki iki kapıda aynı tip LDR kullandığın için bu gecikme iki uçta da yaşanır ve büyük ölçüde birbirini götürür; koşu ve bisiklet için sonuç fazlasıyla yeterlidir.

Işını 50 ms'den kısa süre kesen hızlı cisimlerde (fırlatılan bir top, hızlı bir oyuncak araba) LDR yetersiz kalır: değer düşmeye fırsat bulamadan ışın geri gelir. Böyle durumlarda LDR yerine mikrosaniyeler içinde tepki veren bir fototransistör ya da fotodiyot kullan, çıkışını dijital bir pine bağla ve zamanı kesme (interrupt) ile yakala. Zamanlamayı neden delay() ile değil millis() ve micros() ile yapman gerektiğini millis ve delay yazısında bulabilirsin.

ESP32 ile telefona bildirim (Telegram)

Alarmın sen evde değilken de işe yaraması için ESP32 kullanabilirsin: ışın kesildiği anda Telegram üzerinden telefonuna mesaj gönderir. Bağlantı yukarıdaki tablodaki gibidir: lazer 5V'tan beslenir ve GPIO 26'ya bağlı bir NPN transistörle anahtarlanır, LDR bölücüsü 3V3'ten beslenir ve GPIO 34'e bağlanır. Bu seçim tesadüf değildir: ESP32'nin ADC2 pinleri Wi-Fi açıkken çalışmaz, bu yüzden analog sensörleri her zaman ADC1 pinlerine (GPIO 32–39) bağla. ESP32'nin ADC'si 12 bittir ve 0–4095 arası değer döndürür; koddaki en küçük kalibrasyon farkı bu yüzden 400'dür. Bot oluşturma, token ve chat ID alma adımlarını ESP32 Telegram bot yazısında ayrıntılı anlattık; kod için Kütüphane Yöneticisi'nden UniversalTelegramBot ve ArduinoJson kütüphanelerini kur.

C++ (Arduino IDE)
1// ESP32 lazer bariyeri + Telegram bildirimi / ESP32 laser tripwire + Telegram notification
2#include <WiFi.h>
3#include <WiFiClientSecure.h>
4#include <UniversalTelegramBot.h>        // ArduinoJson kütüphanesi de gerekir / also needs the ArduinoJson library
5
6const char* WIFI_SSID = "WIFI_ADI";      // Wi-Fi ağının adı / your Wi-Fi name
7const char* WIFI_PASS = "WIFI_SIFRESI";  // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:ABCdefGhIJKlmNoPQRstuVWXyz"  // BotFather'dan / from BotFather
9#define CHAT_ID "123456789"              // senin chat ID'n / your chat ID
10
11const int LASER_PIN = 26;                // NPN transistör bazına 1 kΩ ile / to the NPN base via 1 kΩ
12const int LDR_PIN = 34;                  // ADC1 pini, Wi-Fi ile çalışır / ADC1 pin, works with Wi-Fi
13const int BUZZER_PIN = 25;               // aktif buzzer / active buzzer
14const unsigned long CONFIRM_MS = 30;     // en az bu kadar kesik kalmalı / must stay broken this long
15const unsigned long SIREN_MS = 5000;     // siren süresi / siren duration
16const unsigned long COOLDOWN_MS = 30000; // iki deneme arası en az 30 sn / at least 30 s between attempts
17
18WiFiClientSecure client;
19UniversalTelegramBot bot(BOT_TOKEN, client);
20
21int onLevel = 0, offLevel = 0;
22bool beamOk = true;
23bool counted = false;                    // bu kesinti sayıldı mı / has this break been counted
24unsigned long brokenSince = 0;
25bool sirenOn = false;
26unsigned long sirenStart = 0;
27unsigned long breakCount = 0;
28bool pending = false;                    // gönderilecek bildirim var / a notification is waiting
29bool triedOnce = false;
30unsigned long lastTry = 0;
31
32int readAvg() {
33  long sum = 0;
34  for (int i = 0; i < 16; i++) sum += analogRead(LDR_PIN);  // 16 ölçüm ortalaması / average of 16 readings
35  return sum / 16;
36}
37
38void calibrate() {
39  while (true) {
40    digitalWrite(LASER_PIN, LOW);        // lazer kapalı = kesik ışın / laser off = broken beam
41    delay(300);
42    offLevel = readAvg();
43    digitalWrite(LASER_PIN, HIGH);       // lazer açık = sağlam ışın / laser on = intact beam
44    delay(300);
45    onLevel = readAvg();
46    Serial.printf("Isinli / beam: %d  Isinsiz / no beam: %d\n", onLevel, offLevel);
47    if (abs(onLevel - offLevel) >= 400) return;   // 12 bit ölçekte yeterli fark / enough gap on the 12-bit scale
48    Serial.println("Isin LDR'ye ulasmiyor / Beam misses the LDR");
49    delay(2000);
50  }
51}
52
53int beamPercent() {
54  return (long)(readAvg() - offLevel) * 100 / (onLevel - offLevel);
55}
56
57void setup() {
58  Serial.begin(115200);
59  pinMode(LASER_PIN, OUTPUT);
60  pinMode(BUZZER_PIN, OUTPUT);
61  calibrate();
62
63  WiFi.mode(WIFI_STA);
64  WiFi.begin(WIFI_SSID, WIFI_PASS);
65  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);    // api.telegram.org kök sertifikası / root certificate
66  unsigned long start = millis();
67  while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) {  // en fazla 15 sn bekle / wait up to 15 s
68    delay(500);
69    Serial.print(".");
70  }
71  if (WiFi.status() == WL_CONNECTED) {
72    Serial.println(WiFi.localIP());
73    bot.sendMessage(CHAT_ID, "Lazer alarmi devrede / Laser alarm armed", "");
74  }
75}
76
77void loop() {
78  unsigned long now = millis();
79  int pct = beamPercent();
80
81  if (beamOk && pct < 40) {              // ışın yeni kesildi / beam just broke
82    beamOk = false;
83    counted = false;
84    brokenSince = now;
85  } else if (!beamOk && pct > 60) {
86    beamOk = true;                       // ışın geri geldi / beam restored
87  }
88
89  if (!beamOk && !counted && now - brokenSince >= CONFIRM_MS) {
90    counted = true;                      // her kesinti bir kez sayılır / each break counts once
91    breakCount++;
92    pending = true;
93    sirenOn = true;
94    sirenStart = now;
95    Serial.printf("Kesinti / Break #%lu\n", breakCount);
96  }
97
98  if (sirenOn && now - sirenStart >= SIREN_MS) sirenOn = false;
99  digitalWrite(BUZZER_PIN, (sirenOn && (now / 200) % 2) ? HIGH : LOW);  // kesik siren / beeping siren
100
101  if (pending && (!triedOnce || now - lastTry >= COOLDOWN_MS)) {
102    triedOnce = true;
103    lastTry = now;
104    if (WiFi.status() == WL_CONNECTED) {
105      String text = "Lazer bariyeri kesildi! / Laser beam broken! Toplam / Total: " + String(breakCount);
106      if (bot.sendMessage(CHAT_ID, text, "")) pending = false;  // gitmezse 30 sn sonra yeniden / retry in 30 s if it fails
107    } else {
108      WiFi.reconnect();                  // bağlantı koptuysa yeniden dene / reconnect if the link dropped
109    }
110  }
111}

Her kesinti bir kez sayılır, siren 5 saniye öter ve bir bildirim sıraya girer. Bildirim denemeleri en fazla 30 saniyede bir yapılır; bu sırada gelen yeni kesintiler toplam sayıya eklenir ve bir sonraki mesajda görünür. Böylece biri ışının önünde gidip gelirken telefonun mesaj yağmuruna tutulmaz. Mesaj gönderilemezse kod 30 saniye sonra yeniden dener, Wi-Fi koptuysa yeniden bağlanmayı başlatır. sendMessage() güvenli bir HTTPS bağlantısı kurduğu için bir iki saniye sürer; bu sırada siren deseni donar ve ışın izlenmez, bu normaldir.

Raspberry Pi Pico ve MicroPython ile lazer bariyeri

Raspberry Pi Pico'da aynı mantığı MicroPython ile birkaç satırda kurabilirsin. Lazer VBUS'tan (USB'nin 5 V'u, pin 40) beslenir ve GP15'e bağlı bir NPN transistörle anahtarlanır; LDR bölücüsü 3V3(OUT) pininden beslenir ve GP26'ya (ADC0) bağlanır, aktif buzzer GP14'e gider. Pico'nun ADC'si read_u16() ile 0–65535 arası değer verdiği için kalibrasyonda aranan en küçük fark 6000'dir. Kod aynı yüzde hesabını, histerezisi ve onay süresini kullanır; her kesintiyi sayar, 5 saniye siren çaldırır ve ışının ne kadar süre kesik kaldığını yazar. Pico'nun bilgisayara bağlı olmadan da çalışması için dosyayı Thonny ile kartın üzerine main.py adıyla kaydet.

MicroPython
1# Raspberry Pi Pico lazer bariyeri: alarm + geçiş sayacı / Laser barrier: alarm + pass counter
2from machine import Pin, ADC
3import time
4
5laser = Pin(15, Pin.OUT)        # NPN transistör bazına 1 kΩ ile / to the NPN base via 1 kΩ
6ldr = ADC(26)                   # GP26 = ADC0, bölücü 3V3'ten / divider fed from 3V3
7buzzer = Pin(14, Pin.OUT)       # aktif buzzer / active buzzer
8
9CONFIRM_MS = 30                 # en az bu kadar kesik kalmalı / must stay broken this long
10SIREN_MS = 5000                 # siren süresi / siren duration
11
12
13def read_avg(n=8):
14    total = 0
15    for _ in range(n):
16        total += ldr.read_u16()
17    return total // n
18
19
20def calibrate():
21    while True:
22        laser.value(0)          # lazer kapalı = kesik ışın / laser off = broken beam
23        time.sleep_ms(300)
24        off = read_avg(32)
25        laser.value(1)          # lazer açık = sağlam ışın / laser on = intact beam
26        time.sleep_ms(300)
27        on = read_avg(32)
28        print("Isinli / beam:", on, " Isinsiz / no beam:", off)
29        if abs(on - off) > 6000:          # 16 bit ölçekte yeterli fark / enough gap on the 16-bit scale
30            return on, off
31        print("Isin LDR'ye ulasmiyor / Beam misses the LDR")
32        time.sleep(2)
33
34
35on_level, off_level = calibrate()
36beam_ok = True
37counted = False
38broken_at = time.ticks_ms()
39siren_until = time.ticks_ms()
40count = 0
41
42while True:
43    now = time.ticks_ms()
44    pct = (read_avg() - off_level) * 100 // (on_level - off_level)   # 100 = ışın tam / full beam
45
46    if beam_ok and pct < 40:            # ışın yeni kesildi / beam just broke
47        beam_ok = False
48        counted = False
49        broken_at = now
50    elif not beam_ok and pct > 60:      # ışın geri geldi / beam restored
51        beam_ok = True
52        print("Kesik kaldigi sure / blocked for", time.ticks_diff(now, broken_at), "ms")
53
54    if not beam_ok and not counted and time.ticks_diff(now, broken_at) >= CONFIRM_MS:
55        counted = True                  # her kesinti bir kez sayılır / each break counts once
56        count += 1
57        siren_until = time.ticks_add(now, SIREN_MS)
58        print("Gecis / Pass:", count)
59
60    siren = time.ticks_diff(siren_until, now) > 0
61    buzzer.value(1 if siren and (now // 200) % 2 else 0)   # kesik siren / beeping siren

Lazer modülü ile proje fikirleri

  • Lazerli ev alarmı: Kapı ve koridor ışınlarını bir PIR hareket sensörü ile birleştir ve bütün girişleri tek bir merkezde topla; ayrıntılar Arduino alarm sistemi yazısında.
  • Lazer arp: Yan yana 5–7 ışın kur ve her ışın kesildiğinde pasif bir buzzer ile farklı bir nota çal.
  • Ziyaretçi sayacı: İki ışınla giriş ve çıkışları ayır, içerideki kişi sayısını ekranda göster.
  • Bilim fuarı hız ölçeri: Eğik düzlemden kayan cisimlerin hızını iki kapıyla ölç ve sürtünmeyi karşılaştır; daha fazla fikir için TÜBİTAK proje fikirleri yazısına bak.
  • Lazer labirenti oyunu: Aynalarla diz hizasının altında bir ışın ağı kur; ağa dokunmadan geçmeye çalışanın süresini tut, her dokunuşta ceza süresi ekle.
  • Çekmece ve kasa koruması: Kapak açıldığında ışının kesildiğini algıla ve ESP32 ile telefonuna bildirim gönder.

Sık yapılan hatalar ve çözümleri

BelirtiOlası sebepÇözüm
Lazer hiç yanmıyorS ile − ters bağlanmış ya da orta pinin beslenmesi gereken bir kartPin yazılarını kontrol et, orta pini 5V'a bağlayıp yeniden dene
Lazer çok sönükModül 3,3 V ile besleniyor ya da pinin akımı yetmiyorLazeri 5V'tan besle ve transistörle anahtarla
"Isin LDR'ye ulasmiyor" mesajıNokta LDR'ye denk gelmiyor ya da ortam ışığı çok güçlüNoktayı kâğıtla bul, LDR'yi siyah boruya yerleştir
Alarm sürekli çalıyorHiza kaymış, lazer ya da ayna sallanıyorTutucuları sabitle, Seri Çizici'de değeri izle
Alarm hiç çalmıyorIşın kesilse de LDR güneş ya da lamba ışığıyla aydınlanıyorBoru ekle, sensörü pencereye bakmayacak şekilde çevir
Hızlı geçişler sayılmıyorLDR'nin tepki süresi (10–30 ms) yetersizCONFIRM_MS ve MIN_BREAK_MS'i düşür ya da fototransistör kullan
Arduino resetleniyor ya da pin ısınıyorBirden fazla lazer tek pinden sürülüyorLazerleri 5V'tan besleyip transistörle anahtarla
ESP32'de değer Wi-Fi açılınca bozuluyorLDR bir ADC2 pinine bağlıLDR'yi GPIO 32–39 arasındaki bir ADC1 pinine taşı
Telegram mesajı gelmiyorToken ya da chat ID yanlış, bota hiç yazılmamışBota /start yaz, token ve chat ID'yi yeniden kontrol et
Kurulumdan sonra sistemi gerçek koşullarda dene: odayı karart, lambayı aç, perdeyi aç ve her durumda Seri Monitör'deki ışınlı ve ışınsız farkı not al. En kötü durumda bile fark 100'ün üzerinde kalıyorsa bariyerin güvenilirdir. Bu projeyi bir öğrenme ve hobi alarmı olarak düşün; profesyonel güvenlik sistemlerinde görünmez kızılötesi ışın ve modülasyonlu alıcılar kullanılır.

KY-008 lazer modülü, tek bir ucuz parçayla optik, gerilim bölücü, kalibrasyon ve zaman ölçümünü aynı anda öğreten nadir projelerden birini mümkün kılar. Önce test koduyla farkı gör, sonra alarmı kur, ardından aynalar, sayaç ve zamanlayıcıyla projeni büyüt. BlueGrays uygulamasında lazerli uyarı ve güvenlik sistemi, LDR ile ışık ölçme ve gece lambası, ESP32 hareket alarmı ve Telegram bildirimli projeleri adım adım devre şeması ve kodlarıyla bulabilirsin.

Sıkça sorulan sorular

KY-008 lazer modülü kaç volt ile çalışır?

KY-008 5 V için tasarlanmıştır ve modüldeki akım sınırlama direnci sayesinde Arduino Uno'nun bir dijital pinine doğrudan bağlanabilir. 3,3 V ile de yanar ama daha sönüktür. Modüle asla 5 V'un üzerinde gerilim verme ve lazer diyodu dirençsiz besleme.

5 mW lazer göze zarar verir mi?

5 mW'lık kırmızı lazer Sınıf 3R'dir: kazara ve çok kısa bir göz teması genellikle kalıcı hasar bırakmaz, ama ışına bilerek bakmak ya da aynadan yansıyan ışını göze almak retinaya zarar verebilir. Işını göz hizasının altında tut, insanlara ve hayvanlara doğrultma, aynalı kurulumlarda ışının bütün yolunu kontrol et.

Lazerli alarm kaç metreye kadar çalışır?

Mesafeyi lazerin gücünden çok hizalama ve ortam ışığı sınırlar. Sağlam tutucular ve siyah boru içindeki bir LDR ile iç mekânda 10–20 m sorunsuz çalışır; daha uzun mesafede nokta büyüdüğü için LDR'ye düşen ışık azalır. Dış mekânda güneş, sis ve rüzgârın yarattığı sarsıntı menzili belirgin şekilde düşürür.

Lazer bariyerinde LDR yerine ne kullanılabilir?

LDR ucuz ve kolaydır ama tepki süresi 10–30 ms'dir. Daha hızlı ölçüm gereken zamanlayıcı ve sayaçlarda mikrosaniyeler içinde tepki veren fototransistör ya da fotodiyot kullanılır. Hazır lazer alıcı modülleri de vardır; ışık aldığında dijital bir çıkış verirler ve doğrudan bir dijital pine bağlanırlar.

Lazer modülü ESP32 ve Raspberry Pi Pico ile çalışır mı?

Evet, ama lazeri pinden doğrudan beslemek yerine 5V'tan besleyip bir NPN transistörle anahtarlamak daha doğrudur; Pico'nun pinleri varsayılan olarak yalnızca 4 mA verir. LDR bölücüsünü bu kartlarda 3V3'ten besle ve ESP32'de Wi-Fi ile birlikte çalışan bir ADC1 pini (GPIO 32–39) kullan.

Lazerli alarm yerine kızılötesi ışın bariyeri daha mı iyi?

Profesyonel güvenlik sistemlerinde görünmez kızılötesi ışın ve modülasyonlu alıcı kullanılır; ışın fark edilmez ve modülasyon sayesinde güneş ışığından çok az etkilenir. Kırmızı lazer ise görünür olduğu için hizalaması çok kolaydır; öğrenme projeleri, sayaçlar ve zamanlayıcılar için idealdir.

Tüm projeleri gör
Ldr İle Işık Şiddeti Okuma
#11Başlangıç

Ldr İle Işık Şiddeti Okuma

Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün

4.6(81)
138
Ldr İle Gece Lambası
#12Başlangıç

Ldr İle Gece Lambası

Hava karardığında kendiliğinden yanan, sabah olunca sönen küçük bir gece lambası. Işık sensörü odadaki aydınlığı ölçer; Arduino ortam yeterince karanlıksa LED'i yakar, aydınlanınca söndürür. Sokak lam

4.8(102)
204
ESP32 LDR Modülü ile Işık Şiddeti Okuma
#113Başlangıç

ESP32 LDR Modülü ile Işık Şiddeti Okuma

LDR modülünün ham ADC değerini ve karanlık/aydınlık referanslarına göre hesaplanan göreli ışık yüzdesini Serial Monitor'da gerçek zamanlı izleme. Bu yüzde lux ölçümü değildir. Modülün kalibrasyon mantığını öğretir. Proje 10'un öncesinde yapılması ideal; çünkü eşik değerini belirlemek için kullanılır.

4.6(36)
55
Lazerli Uyarı Sistemi
#22Orta
Premium

Lazerli Uyarı Sistemi

Filmlerdeki gibi görünmez bir ışın çiti kuruyorsun. Lazer ışığı karşıdaki ışık sensörüne düşer; biri önünden geçip ışını kestiği an LED yanar ve buzzer öter, ışın geri gelince ikisi de susar. Kapı ya

4.8(64)
83
Lazerli Güvenlik Sistemi
#23İleri
Premium

Lazerli Güvenlik Sistemi

Filmlerdeki lazerli soygun sahneleri gibi: lazer ışını bir ışık sensörüne vurur, biri araya girip ışını kestiği an kırmızı LED yanar ve buzzer ötmeye başlar. Alarm kendiliğinden susmaz; butona basarak

4.8(60)
77
ESP32 LDR ile Gece Lambası
#112Başlangıç
Premium

ESP32 LDR ile Gece Lambası

Karanlıkta LED'in otomatik yandığı, aydınlıkta söndüğü gece lambası. LDR Sensör Modülünün D0 (digital out) pini kullanılır — modülün üzerindeki küçük potansiyometre ile karanlık eşiği ayarlanır, modül kendisi HIGH/LOW çıkış üretir. ESP32 sadece digitalRead() ile bu sinyali okur, kod çok basit.

4.6(17)
30
ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
#145İleri
Premium

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)

PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h

0.0(0)
9