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
| Ortam | Yaklaşık direnç |
|---|---|
| Tam karanlık | 1 MΩ ve üzeri |
| Loş oda | 50 – 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ükselir →
analogRead()değeri artar - Ortam kararınca LDR direnci artar → A0’daki gerilim düşer →
analogRead()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:
- Kodu yükleyin, Seri Monitörü açın.
- Odayı karartın, okunan değeri not edin.
- Normal aydınlıkta değeri not edin.
- Lamba tutup en parlak halinde not edin.
- 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.
| Pin | Açıklama |
|---|---|
| VCC | 3,3 – 5 V |
| GND | Toprak |
| DO | Dijital çıkış — eşik aşıldığında HIGH/LOW |
| AO | Analog çı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 |
|---|---|
| BH1750 | I2C, doğrudan lux cinsinden ölçer, kalibre |
| TSL2561 / TSL2591 | Geniş dinamik aralık, IR ayrımı yapabilir |
| Fotodiyot | Çok hızlı, doğrusal; ama yükselteç gerekir |
| Fototransistör | Hızlı, LDR’den daha duyarlı |
| TCS3200 / TCS34725 | Renk 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