Arduino İle Serial Üzerinden Komutla LED Yakıp Söndürmek
Bu serimizin 4. yazısında çoklu LED lerimizi Serial komutla yakıp söndüreceğiz.
Öncelikle bize lazım olan malzemeler:
- Arduino Uno (Aliexpress, Roboshop, Direnc.net)
- 10 tane LED (Aliexpress, Direnc.net)
- 11 adet erkek-erkek dupont bağlantı kablosu (Aliexpress, Direnc.net)
- 10 adet 330 ohm direnç (yaklaşık değerde olabilir) (Aliexpress, Direnc.net)
- Breadboard (Aliexpress, Roboshop)
Yukarıda görüldüğü üzere LED lerimizi breadboard üzerine sırasıyla diziyoruz. Eksi (katot) uçlarına (kısa bacak) dirençleri bağlıyoruz. Dirençlerin diğer bacaklarını ise breadboardın eksi hattına bağlıyoruz. Dirençlerin uzun olan artı (anot) bacaklarını ise kablolarıla Arduino‘muzun dijital 2-11 pinlerine sırasıyla bağlıyoruz.
Breadboard (-) bağlantı noktasından Arduino GND bağlantı noktalarından birine bağlantı yapıyoruz.
Aşağıdaki kodu Arduino IDE’mize yazıp çalıştırıyoruz.
void blink(int LEDPin, int LEDOnTime, int LEDOffTime) // LED yakıp sönme fonksiyonu { digitalWrite(LEDPin, HIGH); delay(LEDOnTime); digitalWrite(LEDPin, LOW); delay(LEDOffTime); } void setup(){ for(int i=2; i<12; i++){ pinMode(i, OUTPUT);} // 2-11 arası pinleri ayarlıyoruz Serial.begin(9600); } void loop(){ if (Serial.available()) { //serialden karakter alıyoruz char ser = Serial.read(); //Serial'den okunan değer "char" yani karakter formatındadır. Yani "int" değer değildir. //Bu nedenle case ifadelerinde tırnak içinde koşul koyuyoruz switch (ser) { case '1': blink(2,250,250); break; case '2': blink(3,250,250); break; case '3': blink(4,250,250); break; case '4': blink(5,250,250); break; case '5': blink(6,250,250); break; case '6': blink(7,250,250); break; case '7': blink(8,250,250); break; case '8': blink(9,250,250); break; case '9': blink(10,250,250); break; case 'a': // 10. pin için a harfi girmemiz gerekli blink(11,250,250); break; } } }
blink fonksiyonu parametreleri ile verilen süre içinde LED’i yakıp söndürme işi yapmaktadır.
Kodu çalıştırdıktan sonra Serial panelini açıyoruz ve hangi ledi yakıp söndüreceksek onun numarasını yazıyoruz. LED sıralaması 1 (bir) den başlayacak, yani 1 girdiğimizde 1. led, 2 yazdığımızda 2. led yanacaktır.
10. led için a girmemiz gerekli. Girişlerde birden fazla ledi arka arkaya yakmak için sıralı komut da girebiliriz. Yani 03567a girersek ilgili ledler sırasıyla yanıp sönecektir.
Bu esnada aklımıza neden Serial’den değer girerken “char” değer alıp kullandık gelebilir. Aslında bunun için “int” sayısal değer olarak da okumamız mümkündür.
Bu durumda biz Serial monitörden her ne kadar rakam girsek bile girilen değerler yine Ascii kod numarasına çevrilecektir. Yani 1 değeri girsek bile Arduino’ya bu değer 48 olarak aktarılacaktır. Bu durumda tekrar 1 değeri oluşturmak için Serial’den gelen değeriden 47 çıkarmamız gerekiyor.
Ancak int değer istediğimizde 10 numaralı LED için (11.pindeki) 10 değeri giremeyeceğiz. Bu 1 ve 0 değer olarak 2 giriş olarak alınır. Bu durumda 10. led için 0 (sıfır) girmemiz gerekecek. Bu durumda onu da kod içersinde özel ayarlamamız gerekiyor.
Aşağıdaki kodu Arduino IDE’mize yazıp çalıştırıyoruz.
void blink(int LEDPin, int LEDOnTime, int LEDOffTime) // LED yakıp sönme fonksiyonu { digitalWrite(LEDPin, HIGH); delay(LEDOnTime); digitalWrite(LEDPin, LOW); delay(LEDOffTime); } void setup(){ for(int i=2; i<12; i++){ pinMode(i, OUTPUT);} // 2-11 arası pinleri ayarlıyoruz Serial.begin(9600); } void loop(){ if (Serial.available()) { //serialden integer değer alıyoruz int ser = Serial.read(); if(ser >= 49 && ser <= 57){ // 1 - 9 Ascii eşdeğeri 49 - 57 dir // Böylece serial gelen değerden 47 çıkardığımızda 2 - 12 arası pinlere eşdeğer olur int usePin = ser - 47; blink(usePin,250,250); } else if(ser == 48){ // 10. led pini (11) için 0 giriyoruz int usePin = 11; blink(usePin,250,250); } } }