Işığa Duyarlı Direnç(Light Dependent Resistor) Arduino’dan önce de kullanılan bir devre elemanıydı. Üzerine düşürülen ışık miktarı arttıkça direnci düşüyor (benim ortamımda yaklaşık 1,8 kΩ), tam tersi ışık miktarı azaldıkça da direnci artıyor (100 kΩ civarlarında). Bu özelliği sayesinde ortamdaki ışık şiddetini ölçmek için kullanılabilecek bir eleman. Şimdi öyle mi bilemiyorum ama, önceden sokak aydınlatma lambalarının gece otomatik yanıp gündüz sönmesi için kullanılıyorlardı. Mazisi oldukça eski. Şimdilerde fotodiyot, fototransistör gibi ışığa duyarlı başka devre elemanları da çoğaldı.

Direnci büyük olan yarıiletken kullanılarak yapılan bu elemanlarda kullanılan malzemeler; Kadmiyum/Selenyum, kadmiyum/kükürt, Indiyum/antimon, Indiyum/fosfor,  kurşun/kükürt, kurşun/selenyum, germanyum, germanyum/arsenik gibi maddeler kullanılıyor. (Zamanla kadmiyum içerikli olanla Avrupa’da yasaklanmış). Yukarıdaki malzemelere bakınca bir metal ve altında ışığa duyarlı maddeden imal edilmiş oldukları anlaşılabilir. Daha fazla teknik bilgi bizi aşar. Ama katmanlar halinde bir yapı oluğunu, en üst katmanda (beyaz görünen) metal olduğunu ve elemanın üzerindeki yılana benzeyen şeklin(turuncu) de ışığa duyarlı olduğunu ve yüzeyi arttırmak için öyle bir şekil olduğunu söylersem sanırım uzatmış olurum 😦

IMG_20190625_161748

Bendeki iki modelin boyutları farklı (11,8 mm ve 4,9 mm çaplarında) olmasına rağmen direnç değerlerinin alabileceği en büyük ve en düşük değerleri aynı ortamda üç aşağı beş yukarı aynı idi; yaklaşık 1kΩ ile 120 kΩ arası. Kendisiyle 1983 yılına henüz bir öğrenciyken tanışmış, bir elektronik saat projesinde gece LED displayın parlaklığını azaltmak için kullanmıştım. Aslında birçok sensör gibi Arduino olmadan da rahatlıkla kullanılabilir. Kendi fiyatı 50 kuruş civarında, bir o kadar da transistör, direnç tutsa tüm işi 1 TL civarında halletmek mümkün. Ama neyse biraz da kod yazmak lazım 🙂

Şimdi üzerine düşen ışık şiddetine göre direnci değişen bu arkadaşı, tüm giriş-çıkışları gerilime göre referanslanmış Arduino ile nasıl kullanacağız. Bu direnç değişimini gerilim değişimine dönüştürmek için gerilim bölücü yapacağız. Adının şatafatlı olduğuna bakmayın (aslında daha önce de gördük), iki direnci seri bağlayıp üzerlerindeki gerilim dağılımından faydalanıyoruz. Örneğin iki tane eşit direnci 10 volt gerilime bağladığımızda her birinin üzerinde 5 volt olacağından alın size 5 volt kaynak. Ama 5 volt aldığınız devreden maalesef çok akım çekemiyorsunuz.

devre

Ama Arduino’nun işi zaten akım çekmek değil gerilimi ölçmek. Bunun için 41kΩ bir dirence seri olarak bağlıyoruz LDR’yi. Böylelikle LDR üzerindeki ışıkla değişen gerilim Arduino’nun analog girişi tarafından ölçülebiliyor. Bu işi hallettik ama bu okunan değerlerin hangi aralıkta olduğunu bilmemiz gerekiyor!

Arduino’ da yapacağımız prototip; gece yanan, gündüz sönen 13 numaralı pin’e bağlı olan LED olduğu için, hangi değerin sınır değer olduğunu bulmak için seri haberleşme ile bu değerleri yazdırıp karar vermeliyiz. O yüzden önce ‘setup’ kısmında 13 numaralı pini çıkış pini olarak tanımlayıp,  ‘9600 baud rate’ de seri habeleşme başlatıyoruz. Sonra ‘loop’ kısmında LDR’yi bağladığımız pin’i (A0) analog olarak okutup ‘deger’ isimli tamsayı değişkenine atıyoruz. Daha sonra seri ekranda okunan değerlere bakıyoruz. Benim ölçtüğüm değerlere göre ışıklı ortamda 120 civarı, ışık kesildiği zaman 600 civarı bir değer ölçüldü. Aslında biliyorsunuz analog girişten 0-1023 arası değer ölçülebiliyor. Ama 10 kΩ üzerinde de gerilim düştüğü için gerisi ile ilgilenmiyorum. Sonra bir ‘if’ şartıyla sınır değerime 350 olarak karar veriyorum.

if (deger>=350)

digitalWrite (13, HIGH);

‘if’ komutu; kendisinden sonra “( )” parantezleri arasındaki koşul sağlandığında bir sonraki komut satırını yürütüyor. Parantez sonunda noktalı virgül (;) olmadığını hatırlatıyorum! Koşul sağlandığında yürütülecek komut satırı birden fazla ise tüm komutları “{ }” parantezleri arasına yazmamız gerekli. Koşul sağlanmadıysa ve başka bir koşul daha sorgulanacaksa ‘else if’ komutu aynen ‘if’ de olduğu gibi sorgulanabilir. Ve bu şekilde birden fazla sorgulama yapılabilir. Şart sağlanmadıysa işlenecek komutlar ‘else’ komutu ile yazılabilir. Bu durumda yine birden fazla komut satırı işlenecekse “{ }” parantezlerini kullanıyoruz.

Bu arada ihtiyacınız olmasa da seri haberleşme programdaki hataları görmek/ayıklamak (debugging) için faydalı. Tüm adımlara seri haberleşmede bir şeyler yazdırarak programı kontrol edebiliyorsunuz. Mesela devre normal şartlar altında çalışıyorken bağladığınız bir LEd ya da başka bir devre elemanının çalışmamasını, veya hatalı bir programın hangi aşamada hatalı olduğunu görmek için tavsiye olunur. Kodumuz:

void setup() {
pinMode(13, OUTPUT);
Serial.begin (9600);
}
void loop() {
int deger = analogRead (A0);
Serial.println (deger);
if (deger>=350) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
delay(5000);
}

Bundan sonraki çalışmamız role üzerine olacak. Hep 13 numaralı pin’e bağlı LED yakmayalım!

Hoşça kalın…

 

Kaynak:

https://www.arduino.cc/en/Tutorial/ifStatementConditional

https://www.electronics-notes.com/articles/electronic_components/resistors/light-dependent-resistor-ldr.php