LDR ile Işık kontrolü

Bu konuda, bir Analog Giriş kullanarak ışık şiddetinin nasıl ölçüleceğini inceleyeceğiz. Aşağıdaki devreyi kurup programı yükledikten sonra, aydınlatılacak LED sayısını kontrol etmek için bulunduğumuz ortamdaki ışığın seviyesini kullanacağız.

 

Öncelikle devremizi kuralım.

LDR

Fotosel’ ler

Bu konuda kullanılan fotosel, bazen LDR olarak bilinen, ışığa bağımlı rezistör (Light Dependent Resistor) olarak adlandırılan bir tiptir. Adından da anlaşılacağı üzere, bu komponent bir direnç gibi davranır, üzerine yansıyan ışık miktarına bağlı olarak direnci değişir.

Buradaki LDR, karanlıktayken yaklaşık 50 kΩ, parlak ışıktayken 500 Ω civarında direnç göstermektedir. Bu değişen direnç değerini, Arduino’nun analog girişinden ölçebileceğimiz bir voltaja dönüştüreceğiz.  Bunu yapmanın en basit yolu, LDR’yi sabit bir dirençle birleştirmektir.

LDR

 

Direnç ve fotosel birlikte POTANSİYOMETRE gibi davranıyor. Işık çok parlak olduğunda, fotoselin direnci sabit direnç değerine kıyasla çok düşüktür ve sanki pot maksimuma çevrilmiş gibidir.

Hafif seviyede bir ışığa çıktığında LDR’nin direnci, sabit 1kΩ’lık dirençten daha büyük olur ve sanki pot GND’ye çevrilmiş gibi olur.

Yukarıda bahsettiğimiz direnç özelliklerinden faydalanarak, A0 pinine giden voltajdaki değişimleri programımızda tanımlayacağız, bunun için de Arduino’daki 10 bitlik ADC içerisindeki dijital değerlerden faydalanacağız. Burada meydana gelen işlemleri anlayabilmek için Analog’dan Dijital’e sinyal dönüştürme ile ilgili bilgi sahibi olmalıyız. Eğer konu hakkında bilgi almak isterseniz buradaki konuyu incelemenizi tavsiye ederim.

Şimdi, aşağıda verilen programı Arduinoya yükleyelim ve fotoseli parmağımızla kapatıp bir ışık kaynağının yakınında tutmayı deneyelim.

/*
LDR ile Işık Algılama
*/
int lightPin = 0;
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57;              //Değer 1k olunca Tüm ledler yanacak 1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0;                                                          // Başlangıçta hiçbir LED yanmasın
for (int i = 0; i < numLEDSLit; i++)
{
leds = leds + (1 << i);                                   //  i’nci biti set et
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

 

Programdaki en önemli satır, LED’lerin kaçının aydınlandığını hesaplayan satırdır:

int numLEDSLit = reading / 57;

Burada, ham okumayı  57’yebölüyoruz. Başka bir deyişle, hiçbir ledin yanmaması için yada maximum 8 ledin de yanması için, okunan değeri dokuz bölgeye ayırıyoruz. Bunu sağlamak için, sabit 1 kΩ’luk bir dirençten faydalanıyoruz.

Devreye baktığımızda rahatlıkla görebileceğimiz şey şudur; LDR 1 kΩ direnç gösterecek kadar ışık aldığı zaman, sabit direnç ile birlikte sanki 2 tane 1 kΩ’luk direnç seri bağlanmış gibi olur ve A0 pininde okuduğumuz voltaj değeri olarak ADC deki ham okuma karşılığı 1023/2 = 511 olacağı anlamına gelir. Bir devrede seri bağlı dirençler üzerine düşen gerilimlerin toplamı, devre güç kaynağı değerine eşittir. Eğer direçler eşit değerde ise, Dirençler üzerine düşen gerilimler de eşittir. Çüç kaynağımız 5v olduğuna ve dirençlerin toplamı da 5v değerini geçemeyeceğine, eşit olması gerektiğine ve 2 adet de seri bağlı direncimiz olduğuna göre 5v / 2 = 2,5 v direnç başına düşen gerilimi elde edebiliriz. Ancak bu durumun dirençler birbirine eşit olduğunda geçerli olduğunu unutmayalım. LDR üzerine gelen ışık miktarı değiştiğinde direnç değeri de değişeceğinden, dirençler üzerine düşen gerilimler de değişecektir, zaten biz de bu durumdan faydalanarak A0 pininden gerilim okuyarak devremizi çalıştırıyoruz.  Burada konuyu daha da detaylandırmamak için daha fazla bahsetmeyeceğim ancak isteyen, Seri Bağlı Dirençlerde Akım, Gerilim ve Toplam Direnç konusunda ve OHM kanunu konularında bir araştırma yaparak öğrenebilir. Şurada konu ile ilgili güzel bilgiler var.

A0 pininde okunan değer ADC’de algılandığında, yazdığımız programa göre tüm ledler yanıyor olacaktır. Aşağıdaki liste daha açıklayıcı olabilir.

ham okuma               bölen                           yanan led numarası

0                                       57                                   hiçbir led yanmaz

57                                    57                                   1. led yanar        ( 57/57=1)

114                                  57                                   2. led de yanar        ( 114/57=2)

171                                  57                                   3. led de yanar        ( 171/57=3)

228                                 57                                   4. led de yanar        ( 228/57=4)

285                                 57                                   5. led de yanar        ( 285/57=5)

342                                 57                                   6. led de yanar        ( 342/57=6)

399                                 57                                   7. led de yanar        ( 399/57=7)

456                                 57                                   8. led de yanar        ( 456/57=8)

511                                 57                                   bir değişiklik olmaz ( 511/57=9 (yaklaşık))

if (numLEDSLit > 8) numLEDSLit = 8; satırında numLEDSLit 8’den büyük olamayacak şekilde sınırlandırılmıştır. Bu nedenle hiçbizaman 9 olamayacaktır.

Yaptığınız ışıkölçerin hassasiyetini değiştirmek için, analog okumanın bölündüğü sayının (57) değerini değiştirmeyi deneyin.

Bu değeri artırmak okumayı daha az hassas yapacaktır.

 

 

 

 

 

 

 

 

 

 

 

Yorum bırakın