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.
Adım adım kurulum
Güç hatlarını hazırlayın
5V'u + hattına, GND'yi − hattına bağlayın.
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.
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.
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.
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.
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.
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.
// 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.
// 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
LED yanınca kendiliğinden sönüyor
Hep 1023 veya hep 0 okuyorum
Kademeli sürümde LED karanlıkta bile tam parlamıyor
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.