BP–05 · Başlangıç projesi

LDR ile Otomatik Gece Lambası

Sokak lambaları hava kararınca nasıl kendiliğinden yanar? Bu projede bir LDR (foto direnç) ile ortam ışığını ölçüp karanlıkta otomatik yanan, hatta karanlık arttıkça parlaklaşan bir gece lambası yapacağız.

SeviyeBaşlangıç
Süre35 dk
Malzeme8 çeşit
LDRGerilim bölücüEşik değeriKalibrasyonconstrain()Histerezis

Proje hakkında

LDR (Light Dependent Resistor), üzerine düşen ışık arttıkça direnci azalan bir bileşendir. Karanlıkta direnci megaohm seviyesine çıkabilirken güçlü ışıkta birkaç yüz ohma düşer. Arduino direnci doğrudan ölçemez, ama bir gerilim bölücü kurarak bu değişimi voltaj değişimine çevirebiliriz.

Projenin ilk sürümü basit bir eşik değeriyle çalışır: ortam belirli bir seviyenin altına düşünce LED yanar. İkinci sürüm ise daha akıllıdır; karanlık arttıkça LED'in parlaklığını kademeli olarak artırır. Ayrıca sensörlerle çalışırken en önemli adım olan kalibrasyonu da öğreneceksiniz.

  • LDR'nin çalışma prensibini
  • Gerilim bölücü devre kurmayı
  • Sensör değerini ölçerek eşik değeri belirlemeyi (kalibrasyon)
  • Histerezis ile titreşimsiz açma/kapama yapmayı

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

LDR (foto direnç) 1 adet

5 mm GL5528 veya benzeri.

10 kΩ direnç 1 adet

Gerilim bölücünün sabit direnci.

5 mm LED (beyaz veya sarı) 1 adet

Gece lambası etkisi için sıcak renkler idealdir.

220 Ω direnç 1 adet

LED'i aşırı akımdan korur. Renk kodu: kırmızı-kırmızı-kahverengi.

Jumper kablo (erkek-erkek) 6 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

LDR 1. bacak5VLDR'nin yönü yoktur
LDR 2. bacakA0Gerilim bölücünün orta noktası
10 kΩ direnç (A0 tarafı)GNDLDR 2. bacak ile GND arasında
LED anot (+)D9 (~)220 Ω direnç üzerinden
LED katot (−)GND
Bu bağlantıda ışık arttıkça A0'daki değer yükselir. LDR ile 10 kΩ direncin yerini değiştirirseniz mantık tersine döner ve karanlıkta değer yükselir. İkisi de doğrudur; sadece koddaki karşılaştırma yönünü buna göre ayarlamanız gerekir.

Adım adım kurulum

  1. Güç hatlarını hazırlayın

    5V'u + hattına, GND'yi − hattına bağlayın.

  2. LDR'yi yerleştirin

    LDR'nin bir bacağını + hattına bağlı bir sütuna, diğer bacağını boş bir sütuna takın.

  3. Gerilim bölücüyü tamamlayın

    LDR'nin ikinci bacağının sütunundan 10 kΩ direnci − hattına bağlayın. Aynı sütundan A0 pinine bir kablo çekin.

  4. LED'i bağlayın

    LED'i 220 Ω direnç üzerinden D9'a, kısa bacağını GND'ye bağlayın. LED'i LDR'den biraz uzağa yerleştirin; aksi halde kendi ışığı sensörü yanıltır.

  5. Kalibrasyon yapın

    İlk kodu yükleyip Seri Port Ekranını açın. Odanın normal ışığındaki değeri ve LDR'yi elinizle kapattığınızdaki değeri not edin.

  6. Eşik değerini ayarlayın

    İki değerin ortasına yakın bir sayıyı esikDegeri değişkenine yazın ve kodu tekrar yükleyin.

  7. Kademeli sürümü deneyin

    İkinci kodu yükleyin. Notlarınızdaki en karanlık ve en aydınlık değerleri map() satırına girin.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Eşik değeriyle çalışan, histerezisli temel sürüm.

gece_lambasi.ino
// LDR ile Otomatik Gece Lambası
// RobotikHocasi.com

const int ldrPin = A0;
const int ledPin = 9;

// Kalibrasyon sonrası kendi ortamınıza göre değiştirin
const int karanlikEsigi = 350;   // Bunun altına düşünce LED yanar
const int aydinlikEsigi = 450;   // Bunun üstüne çıkınca LED söner

bool lambaAcik = false;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int isik = analogRead(ldrPin);   // 0 (karanlık) - 1023 (aydınlık)

  Serial.print("Isik seviyesi: ");
  Serial.print(isik);
  Serial.print("  Lamba: ");
  Serial.println(lambaAcik ? "ACIK" : "KAPALI");

  // Histerezis: iki farklı eşik kullanarak titremeyi önle
  if (!lambaAcik && isik < karanlikEsigi) {
    lambaAcik = true;
  } else if (lambaAcik && isik > aydinlikEsigi) {
    lambaAcik = false;
  }

  digitalWrite(ledPin, lambaAcik ? HIGH : LOW);
  delay(200);
}

Karanlık arttıkça parlaklığı artan sürüm.

gece_lambasi_kademeli.ino
// Kademeli gece lambası
const int ldrPin = A0;
const int ledPin = 9;

// Seri Port Ekranında ölçtüğünüz değerler
const int enKaranlik = 100;
const int enAydinlik = 800;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int isik = analogRead(ldrPin);

  // Aydınlıkta 0, karanlıkta 255 olacak şekilde ters eşleme
  int parlaklik = map(isik, enKaranlik, enAydinlik, 255, 0);
  parlaklik = constrain(parlaklik, 0, 255);

  analogWrite(ledPin, parlaklik);

  Serial.print(isik);
  Serial.print(",");
  Serial.println(parlaklik);   // Seri Çizici için virgülle ayrılmış
  delay(50);
}

Kod açıklaması

analogRead(ldrPin)

Gerilim bölücünün orta noktasındaki voltajı okur. Işık arttıkça LDR'nin direnci düşer, A0'daki voltaj ve okunan değer yükselir.

karanlikEsigi / aydinlikEsigi

İki ayrı eşik kullanmak histerezis oluşturur. Tek eşik olsaydı ışık seviyesi sınırdayken LED sürekli yanıp sönerdi.

lambaAcik ? HIGH : LOW

Üçlü (ternary) operatör: koşul doğruysa ilk değeri, yanlışsa ikinci değeri seçer. Kısa bir if / else yazımıdır.

map(isik, enKaranlik, enAydinlik, 255, 0)

Hedef aralığı ters yazarak (255'ten 0'a) karanlıkta yüksek, aydınlıkta düşük parlaklık elde ederiz.

constrain(parlaklik, 0, 255)

Ölçülen değer kalibrasyon aralığının dışına çıkarsa map() negatif ya da 255'ten büyük sonuç verebilir. constrain bunu güvenli aralıkta tutar.

Nasıl çalışır?

İki direnç seri bağlandığında, aralarındaki noktada toplam voltajın dirençlerin oranına göre bir kısmı oluşur. Formül: VA0 = 5V × R10k / (RLDR + R10k). Aydınlıkta LDR yaklaşık 1 kΩ olursa A0'da yaklaşık 4,5V; karanlıkta 100 kΩ olursa yaklaşık 0,45V okunur.

Histerezis, termostatlardan sokak lambalarına kadar pek çok otomatik sistemde kullanılır. Lambayı 350'nin altında açıp ancak 450'nin üstünde kapatarak arada 100 birimlik bir "tampon bölge" bırakırız. Böylece alacakaranlıkta lamba sürekli açılıp kapanmaz.

Sorun giderme

Değerler hiç değişmiyor
LDR'nin ikinci bacağı ile 10 kΩ direnç ve A0 kablosu aynı sütunda olmalı. Gerilim bölücünün orta noktasını okuduğunuzdan emin olun.
LED yanınca kendiliğinden sönüyor
LED'in ışığı LDR'ye çarpıyor. LED'i uzaklaştırın veya LDR'nin etrafına küçük bir kâğıt tüp sarın.
Hep 1023 veya hep 0 okuyorum
Direnç eksik ya da LDR doğrudan 5V ile GND arasında kısa devre olmuş. Bağlantıları şemayla karşılaştırın.
Kademeli sürümde LED karanlıkta bile tam parlamıyor
enKaranlik değerini, LDR'yi tamamen kapattığınızda ölçtüğünüz değere eşitleyin.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Gün doğumu alarmı

Sabah ışık arttığında buzzer ile hafif bir melodi çalan bir alarm yapın.

Güneş takipçisi

İki LDR ve bir servo ile ışığa dönen bir mini güneş paneli tutucu yapın.

Lazer güvenlik ışını

Bir lazer işaretçiyi LDR'ye tutun; ışın kesilince alarm çalsın.

Röle ile gerçek lamba

Bir röle modülü ekleyerek masa lambasını kontrol edin. 220V ile mutlaka bir yetişkin gözetiminde çalışın.

Sık sorulan sorular

Neden 10 kΩ direnç seçtik?
Gerilim bölücüde en iyi hassasiyet, sabit direncin LDR'nin çalışma aralığının ortasındaki direncine yakın olduğunda elde edilir. GL5528 için oda ışığında bu değer 10 kΩ civarındadır.
LDR ile foto diyot arasındaki fark nedir?
LDR yavaş tepki verir (onlarca milisaniye) ama ucuz ve kullanımı kolaydır. Foto diyotlar ve foto transistörler çok daha hızlıdır; uzaktan kumanda alıcılarında kullanılırlar.
Lux cinsinden ölçüm yapabilir miyim?
LDR hassas ölçüm için uygun değildir. Lux ölçmek istiyorsanız BH1750 gibi dijital bir ışık sensörü kullanın.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön