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ü 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.
| Özellik | Değer |
|---|---|
| Model | KY-008 (bazı satıcılarda HW-493) |
| Dalga boyu | 650 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 gerilimi | 5 V (3,3 V'ta daha sönük yanar) |
| Akım | 40 mA'in altında; karttan karta değişir |
| Lazer kafası | 6 mm çaplı pirinç tüp |
| Pinler | S (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ıf | Görünür ışıkta güç | Risk |
|---|---|---|
| 1 | Çok düşük ya da ışın cihazın içinde kapalı | Normal kullanımda güvenli |
| 2 | 1 mW'a kadar | Göz kırpma refleksi korur; bilerek bakılmamalı |
| 3R | 1–5 mW (KY-008) | Doğrudan bakış göze zarar verebilir |
| 3B | 5–500 mW | Doğrudan ve aynadan yansıyan ışın tehlikeli |
| 4 | 500 mW üzeri | Gö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.
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 Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| KY-008 S | D7 | 5V (VIN) | VBUS (pin 40) |
| KY-008 orta pin | Boş (lazer yanmazsa 5V) | 5V (VIN) | VBUS (pin 40) |
| KY-008 − | GND | NPN kollektörü | NPN kollektörü |
| NPN emiteri | – | GND | GND (pin 38) |
| NPN beyzi (1 kΩ ile) | – | GPIO 26 | GP15 (pin 20) |
| LDR 1. bacak | 5V | 3V3 | 3V3(OUT) (pin 36) |
| LDR 2. bacak + direncin üst ucu | A0 | GPIO 34 | GP26 (pin 31) |
| Direncin (3,3–10 kΩ) alt ucu | GND | GND | GND |
| Aktif buzzer + | D8 | GPIO 25 | GP14 (pin 19) |
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.
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.



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.
| Durum | LDR direnci (örnek) | 10 kΩ ile analogRead | 3,3 kΩ ile analogRead |
|---|---|---|---|
| Lazer LDR'de (boru içinde) | 300 Ω | 993 | 938 |
| Işın kesik (boru içinde) | 30 kΩ | 256 | 101 |
| Işın kesik (borusuz, aydınlık oda) | 3 kΩ | 787 | 536 |
| Işınlı ve ışınsız fark (boru içinde) | – | 737 | 837 |
Adım adım: Arduino ile lazerli alarm
- KY-008'in S pinini D7'ye, − pinini GND'ye bağla; orta pini boş bırak (lazer yanmazsa 5V'a bağla).
- 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.
- LDR'yi siyah bir borunun dibine yerleştir ve borunun ağzını lazere doğru çevir.
- 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.
- Lazeri ve LDR'yi sağlam bir zemine sabitle; lazer noktasını önce beyaz bir kâğıtla bul, sonra borunun içine düşür.
- 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.
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.
| Ayar | Koddaki değer | Ne işe yarar? | Ne zaman değiştirilir? |
|---|---|---|---|
| BREAK_PCT | 40 | Işının kesik sayıldığı seviye | Yarı saydam cisimleri (cam, ince kumaş) de algılamak için 60–70'e çıkar |
| RESTORE_PCT | 60 | Işının yeniden sağlam sayıldığı seviye | Her zaman BREAK_PCT'nin 15–20 puan üstünde tut |
| CONFIRM_MS | 30 | Kısa parazitleri (böcek, toz, titreşim) yok sayar | Yanlış alarm çoksa 100–200 ms'ye çıkar, hızlı geçişler kaçıyorsa düşür |
| Ortalama sayısı | 8 | Elektriksel gürültüyü ve lamba titreşimini yumuşatır | Uno'da her ölçüm yaklaşık 0,1 ms sürer; 8 ölçüm 1 ms'yi geçmez |
| Kalibrasyon farkı | 100 | Işı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.
- 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.
- Odanın ışığını azalt ve ilk aynanın önüne beyaz bir kâğıt tutarak lazer noktasını bul.
- Aynaları baştan sona doğru sırayla hizala: her aynayı, nokta bir sonraki aynanın ortasına düşene kadar çok az eğ.
- 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.
- 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.
- Ağın her parçasını tek tek elinle keserek dene ve her kesintide alarmın çaldığını doğrula.
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.
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.
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.
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.
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.
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 sirenLazer 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
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| Lazer hiç yanmıyor | S ile − ters bağlanmış ya da orta pinin beslenmesi gereken bir kart | Pin yazılarını kontrol et, orta pini 5V'a bağlayıp yeniden dene |
| Lazer çok sönük | Modül 3,3 V ile besleniyor ya da pinin akımı yetmiyor | Lazeri 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ıyor | Hiza kaymış, lazer ya da ayna sallanıyor | Tutucuları sabitle, Seri Çizici'de değeri izle |
| Alarm hiç çalmıyor | Işın kesilse de LDR güneş ya da lamba ışığıyla aydınlanıyor | Boru ekle, sensörü pencereye bakmayacak şekilde çevir |
| Hızlı geçişler sayılmıyor | LDR'nin tepki süresi (10–30 ms) yetersiz | CONFIRM_MS ve MIN_BREAK_MS'i düşür ya da fototransistör kullan |
| Arduino resetleniyor ya da pin ısınıyor | Birden fazla lazer tek pinden sürülüyor | Lazerleri 5V'tan besleyip transistörle anahtarla |
| ESP32'de değer Wi-Fi açılınca bozuluyor | LDR bir ADC2 pinine bağlı | LDR'yi GPIO 32–39 arasındaki bir ADC1 pinine taşı |
| Telegram mesajı gelmiyor | Token ya da chat ID yanlış, bota hiç yazılmamış | Bota /start yaz, token ve chat ID'yi yeniden kontrol et |
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.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
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

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

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.

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

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

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.

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
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

