Skip to Content
SensörlerLDR (Işık) Sensörü

LDR (Işık) Sensörü

LDR (Light Dependent Resistor — Işığa Bağlı Direnç), üzerine düşen ışık miktarına göre direnci değişen bir bileşendir. Foto direnç olarak da anılır.

Çalışma mantığı basittir:

  • Karanlıkta direnç yüksektir (yüzlerce kΩ, hatta MΩ)
  • Aydınlıkta direnç düşüktür (birkaç yüz Ω)

Bu davranış, otomatik sokak lambalarından ekran parlaklık ayarına, çizgi izleyen robotlardan gün doğumu algılayan sulama sistemlerine kadar pek çok projede kullanılır.

Tipik Direnç Değerleri

OrtamYaklaşık direnç
Tam karanlık1 MΩ ve üzeri
Loş oda50 – 100 kΩ
Normal iç mekan aydınlığı5 – 20 kΩ
Güçlü lamba altı1 – 5 kΩ
Doğrudan güneş ışığı100 – 500 Ω

Bu değerler LDR modeline göre değişir. Kesin sayılardan çok oran önemlidir: aydınlıkta direnç düşer, karanlıkta yükselir.

Gerilim Bölücü Devresi

Arduino direnç ölçemez, yalnızca gerilim okuyabilir. Bu yüzden LDR’nin direncini gerilime çevirmek gerekir. Bunun yolu bir gerilim bölücüdür.

Devre:

  • 5V → LDR → A0 pini → 10 kΩ direnç → GND

Bu bağlantıda:

  • Ortam aydınlanınca LDR direnci düşer → A0’daki gerilim yükseliranalogRead() değeri artar
  • Ortam kararınca LDR direnci artar → A0’daki gerilim düşeranalogRead() değeri azalır

Ters bağlantı

LDR ile direncin yerini değiştirirseniz mantık tersine döner:

  • 5V → 10 kΩ direnç → A0 → LDR → GND
  • Aydınlıkta değer düşer, karanlıkta yükselir

İkisi de doğrudur; hangisini kullandığınızı bilmek yeterlidir. İlk bağlantı (LDR üstte) sezgisel olarak daha anlaşılırdır: çok ışık = çok değer.

Sabit direnç değeri nasıl seçilir?

Devrenin en hassas olduğu nokta, sabit direncin LDR’nin çalışma aralığındaki ortalama direncine yakın olduğu yerdir.

  • İç mekanda kullanacaksanız 10 kΩ iyi bir başlangıçtır.
  • Çok karanlık ortamları ayırt etmek istiyorsanız daha büyük (47 kΩ – 100 kΩ) seçin.
  • Sadece güneş ışığı / gölge ayrımı yapacaksanız daha küçük (1 kΩ) yeterlidir.

Temel Kod

const int LDR_PIN = A0; void setup() { Serial.begin(9600); } void loop() { int deger = analogRead(LDR_PIN); float volt = deger * (5.0 / 1023.0); Serial.print("Ham: "); Serial.print(deger); Serial.print(" Gerilim: "); Serial.print(volt, 2); Serial.print(" V Durum: "); if (deger < 200) { Serial.println("Karanlik"); } else if (deger < 600) { Serial.println("Los"); } else { Serial.println("Aydinlik"); } delay(300); }

Eşik değerlerini kendiniz belirleyin

Yukarıdaki 200 ve 600 değerleri örnektir. Kendi ortamınız için doğru eşikleri bulmanın yolu şudur:

  1. Kodu yükleyin, Seri Monitörü açın.
  2. Odayı karartın, okunan değeri not edin.
  3. Normal aydınlıkta değeri not edin.
  4. Lamba tutup en parlak halinde not edin.
  5. Bu üç değerin arasındaki noktaları eşik olarak seçin.

Karanlıkta Otomatik Lamba

Klasik uygulama: ortam kararınca LED (veya röle üzerinden lamba) yanar.

const int LDR_PIN = A0; const int LED_PIN = 8; const int ESIK = 300; void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { int isik = analogRead(LDR_PIN); if (isik < ESIK) { digitalWrite(LED_PIN, HIGH); // karanlik -> lamba yansin } else { digitalWrite(LED_PIN, LOW); } delay(200); }

Histerezis — Titremeyi Önlemek

Yukarıdaki kodun gerçek bir sorunu vardır. Işık tam eşik değerinin etrafındayken (örneğin 298–302 arasında oynarken) LED sürekli yanıp söner.

Bunun sebebi gürültü ve doğal ışık dalgalanmasıdır. Daha kötüsü, yanan LED’in kendisi LDR’yi aydınlatırsa sistem sonsuz bir salınıma girer.

Çözüm histerezistir: açma ve kapama için iki farklı eşik kullanmak.

const int LDR_PIN = A0; const int LED_PIN = 8; const int ESIK_AC = 250; // bu degerin altina inerse yak const int ESIK_KAPAT = 400; // bu degerin ustune cikarsa sondur bool lambaAcik = false; void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { int isik = analogRead(LDR_PIN); if (!lambaAcik && isik < ESIK_AC) { lambaAcik = true; digitalWrite(LED_PIN, HIGH); } else if (lambaAcik && isik > ESIK_KAPAT) { lambaAcik = false; digitalWrite(LED_PIN, LOW); } delay(200); }

İki eşik arasındaki 150 birimlik boşluk, sistemin karar verdikten sonra kararında kalmasını sağlar. Bu teknik sıcaklık kontrolü, nem kontrolü ve mesafe eşiği gibi her türlü aç/kapa kararında geçerlidir.

Ortalama Alarak Yumuşatma

Işık kaynağının 50 Hz’lik titremesi (floresan, LED lamba) okumayı oynatabilir. Birkaç okumanın ortalamasını almak bunu temizler:

int isikOku() { long toplam = 0; for (int i = 0; i < 20; i++) { toplam += analogRead(LDR_PIN); delay(1); } return toplam / 20; }

20 okumayı 1 ms aralıkla almak yaklaşık 20 ms sürer ve 50 Hz’lik bir tam periyodu kapsar; bu sayede şebeke kaynaklı titreme büyük ölçüde ortalanır.

LDR Modülü Kullanmak

Piyasada 3 veya 4 pinli LDR modülleri bulunur. Bunların üzerinde LM393 karşılaştırıcı ve ayar potansiyometresi vardır.

PinAçıklama
VCC3,3 – 5 V
GNDToprak
DODijital çıkış — eşik aşıldığında HIGH/LOW
AOAnalog çıkış — ham değer (4 pinli modellerde)

DO çıkışı, kart üzerindeki potansiyometreyle ayarlanan eşiğe göre çalışır. Sadece “karanlık mı, aydınlık mı” bilgisi yeterliyse pratiktir.

Ancak ışık seviyesini ölçmek istiyorsanız AO çıkışını kullanın veya doğrudan çıplak LDR ile gerilim bölücü kurun. DO çıkışı bu bilgiyi vermez.

LDR’nin Sınırları

Yavaştır. LDR’nin ışık değişimine tepki süresi 10–100 ms arasındadır ve karanlıktan aydınlığa geçiş, aydınlıktan karanlığa geçişten daha hızlıdır. Hızlı yanıp sönen bir ışığı takip edemez.

Doğrusal değildir. Direnç ile ışık şiddeti arasındaki ilişki logaritmiktir. Bu yüzden analogRead() değeri lux cinsinden ışık şiddetiyle doğru orantılı değildir.

Kalibre değildir. İki LDR aynı ortamda farklı değerler okuyabilir. Ölçüm cihazı yapacaksanız her birini ayrı kalibre etmeniz gerekir.

Renk hassasiyeti insan gözünden farklıdır. Kadmiyum sülfür (CdS) LDR’ler yeşil-sarı bölgede en duyarlıdır; kırmızı ve kızılötesine tepkisi zayıftır.

Alternatifler

SensörÖzellik
BH1750I2C, doğrudan lux cinsinden ölçer, kalibre
TSL2561 / TSL2591Geniş dinamik aralık, IR ayrımı yapabilir
FotodiyotÇok hızlı, doğrusal; ama yükselteç gerekir
FototransistörHızlı, LDR’den daha duyarlı
TCS3200 / TCS34725Renk sensörü — RGB değeri okur

Gerçek bir ışık şiddeti ölçümü (lux) gerekiyorsa BH1750 kullanın; LDR ile bunu doğru şekilde yapamazsınız.

Özet

LDR, üzerine düşen ışığa göre direnci değişen bir bileşendir. Karanlıkta direnci yükselir, aydınlıkta düşer. Arduino ile kullanmak için gerilim bölücü devresi kurulur.

Bu derste şunları öğrendik:

  • LDR direncinin ışıkla nasıl değiştiğini
  • Gerilim bölücü devresini ve sabit direnç seçimini
  • analogRead() ile ışık okumayı ve eşik belirlemeyi
  • Histerezis ile lambanın titremesini önlemeyi
  • Ortalama alarak şebeke titremesini filtrelemeyi
  • LDR modülündeki DO ve AO çıkışlarının farkını
  • LDR’nin doğrusal ve kalibre olmadığını, BH1750 alternatifini