Bu yazıda LM35 sıcaklık sensörünü Arduino’ya bağladım ve 128×64 OLED ekran kullandım. Daha önce 128×32 OLED ekran kullanımını görmüştük. Ama o zaman hazır örnek üzerinden analiz yapmıştık. Şimdi çok daha sade bir şekilde kullanımını göreceğiz. Kullandığım OLED yine I2C ekran. yani bağlantısı çok kolay, yine 4 bağlantı: +5 volt, GND, data ve clock bağlantıları. Daha önceki çalışmamızdan data bağlantısının Arduino’nun analog 4, clock bağlantısının da analog 5 numaralı bacağına yapılaması gerektiğini biliyoruz. LM35 ise zaten 3 bacaklı: +5 volt, GND ve çıkış bacakları var. Çıkış bacağını A0 analog girişinden yaptım.
LM35’in data sheet’ini incelediğimizde (http://www.ti.com/lit/ds/symlink/lm35.pdf) bize fiziksel yapısından iç yapısına, bağlantılarına kadar ayrıntılı bilgi var. Fiziksel yapısı TO-92 kılıfında, yani düşük güçlü bir BC serisi transistöre benziyor.
Datasheet’ göre lineer bir değişim var; her bir °C sıcaklık artışında, çıkış gerilimi 10 mV artıyor. Bunun arızası ±1/4 °C. Yani bu kadar sapma olabileceği, 25 °C civarında da (başka sıcaklıklarda farklı mı ki?) 0.5 °C hata payından bahsediyor. Ama salı hiç de öyle değil. -55 °C- 150 °C aralığında ölçüm yaptığından, 4V – 30V arası çalışma geriliminden, 60 μA den az akım çektiğinden bahsetmiş. Maliyetinin düşük olduğu, kullanışlı olduğu, kendi çalışması nedeniyle ölçümü bozacak sıcaklıkta olmadığı ve düşük çıkış empedansı nedeniyle başka devreleri çalıştırabileceğinden bahsedilmiş. En son söylenen özellik güzel. Arduino kullanmadan da bu sensörü çalıştırabiliriz. Mesela derece başına 10 mV hassasiyeti bir işlemsel yükselteç kullanarak arttırabilir, bunu bir transistörde anahtarlama gerilimi olarak kullanabilir ve mesela bir fan çalıştırabiliriz.
Ayarlı dirençle istediğimiz sıcaklığa geldiğinde transistör çalışır ve role ile ister buzdolabı, ister fan, ister ısıtıcı, istediğinizi çalıştırabilirsiniz. Neyse biz devremize dönelim. Bağlantının basit olduğundan bahsetmiştik:
OLED üzerndeki 128×32 sizi aldatmasın, bağlantıları aynı zaten. Ve tüm devre bu kadar! Koda gelince, geçen seferki OLED ile kıyaslandığında çok daha sade. Önce sırasıyla ı2C ve OLED displayin kütüphanelerini çağırıyoruz. Daha sonra ‘display’ ismli bir nesne oluşturuyoruz. Parantez içindeki parametreler sırasıyla; displayin yatay(x) dot boyutu, dikey(y) boyutu, I2C ya da SPI kullanılacağının tanıtımı, ve Arduino’nun hangi bacağının data çıkışı olarak kullanılacağının belirlenmesi.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);
Setup da ise displayın başlatılması için ‘display.begin’ komutunun kullanılması. Bu program zaten Arduino Ide üzerindeki örnek programın sadeleştirilip, uyarlanmış hali. Burada önemli olan 0X3C’nin sizin ekranın adresi olup olmadığını kontrol etmek. Bunu daha önceki OLED yazımızdan biliyoruz zaten. sonra ‘display.display’ ile aktif hale getirdiğimiz ekranımız 2 saniyelik beklemeden sonra siliniyor, yazı karakterinin boyutu ve rengi seçilip, imlecin ekrandaki yeri belirlendikten sonra, o yerden itibaren alt alta ” egitim sart!” yazısı yazılıyor. daha sonra 1 saniye boyunca yazı sağa kayıyor, 1 saniye duruyor, 1 saniye sağa kayıyor, 1 saniye duruyor. Bütün bu komutlar orijinal örnekten alındı. Daha sonra 500 ms aralıklarla ekranın iki kez negatifi alınıyor. Sadece görsellik için. Hepsi bu!
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 20);
display.println(F(“egitim”));
display.println(F(” sart!”));
display.display();
delay(100);
display.startscrollright(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(1000);
display.invertDisplay(true);
delay(500);
display.invertDisplay(false);
delay(500);
display.invertDisplay(true);
delay(500);
display.invertDisplay(false);
delay(500);
}
Loop bölümünde; LM35’den gelen veri A0 bacağından okunuyor, ‘sicaklik’ değişkenine atanıyor. Analog bacaktan okunan 5 volt değeri ile çarpılıp 1024 eşit değere bölünerek her bir değer anlamlı ölçümler haline getiriliyor. LM35 zaten Celsius (santigrat) ayarlı olduğu için başka bir şey yapmıyoruz. Ama °dikkat: data sheet çıkışın milivolt olduğunu söylediği için 5 voltu milivolt cinsinden yazmalıyız( 5 volt = 5000 milivolt ). Ama yine data sheet diyor ki anlamlı en küçük değişim 10 mv! O yüzden dönüşümdeki 5 volt yerine 500 yazdık! Hesaplamalar (ve LM35 ile) ile yaptığımız tüm iş bu kadar. Unutmadan, tanımladığımız float değişkeni ‘sicsklik’in tam sayı olmaması için bölme işleminde değerleri ondalık olarak yazıyoruz (500.0 ve 1024.0 gibi). Gerisi ekran düzenlemesi. Ekrandaki bilgiler silinip, yazı karakteri ayarlanıyor ve yazının nereden başlayacağı seçiliyor. Bu yerden itibaren “Ortam Sicakligi” yazılıyor. Tekrar karakter boyutu ve başlangıç noktası belirleniyor ve ölçtüğümüz değer ekrana yazılıyor. Bu değeri öncekinde daha büyük yazdırmak için karakter boyutu ile oynadım! Daha sonra sonra karakter boyutu tekrar küçültülüp pozisyonları deneme yanılma yöntemi ile bulunarak ‘o’ ve ‘C’ karakterleri santigratı (C) oluşturulacak şekilde yerleştirildi.
void loop() {
float sicaklik = analogRead (A0);
sicaklik = sicaklik * (500.0 / 1024.0);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(25,0);
display.println(F(“Ortam “));
display.println(F(“Sicakligi:”));
display.setCursor(0,42);
display.setTextSize(3);
display.println(sicaklik);
display.setTextSize(1);
display.setCursor(92,40);
display.print(“o”);
display.setTextSize(2);
display.setCursor(101,42);
display.print(“C”);
display.display();
delay(1000);
}
Ve bu kod her 1000 ms’de tekrarlanır. Buraya kadar tamam! Başta izlediğiniz video bu kodun çalışması. Ancak diğer sensörlerde olduğu gibi LM35 de arada bir saçma değer ölçüyor ve bu baştaki videoda da gözlemleniyor. Data sheet 25 °C civarında hata payını en fazla demesine rağmen ölçümlerde bu değerden daha büyük atlamalar olduğu gözleniyor. Daha sağlıklı ölçüm yapabilmek için benim ürettiğim çözüm şudur: Ölçüm aralığını 200 ms’ye düşürüp her 10 ölçümden sonra ortalamasını alıp ekrana yazdırmak! Böylelikle on ölçüm içerisindeki sıçramalar törpülenerek ekranda daha karalı ve doğruya daha yakın değerler yazılacak. Tabi 2 saniyede bir ekran değeri yenilenecek( 200 ms den 10 ölçüm). Bunu ayrı bir kodda daha yalın olması açısından sadece seri ekran kullanımı olarak yaptım, OLED komutlarıyla uğraşmadım. 10 boyutlu bir ‘okuma[10]’ dizisi oluşturdum. Bir ‘for’ döngüsü ile ‘okuma[0]’ den ‘okuma[9]’ a kadar ölçülen değerleri topladım. On ölçümün sonunda bu toplamı 10’a bölüp ortalamasını aldım. Gerçekten fark etti. Genellikle sağlıklı ölçümler için ortalama almak iyi bir yöntem.
int inputPin = A0;
float okuma[10];
float toplam, sicaklik ;
void setup()
{
Serial.begin(9600);
}
void loop() {
toplam = 0.0;
for (int i=0; i<10; i++)
{
float deger =analogRead (A0);
okuma[i]= deger *0.48;
toplam = toplam + okuma[i];
delay (200);
Serial.println (toplam);
}
sicaklik = toplam / 10.0;
Serial.print (“Sicaklik: “);
Serial.print (sicaklik);
Serial.print (“‘C”);
Serial.println() ;
}
Bugünlük de bu kadar…
Merakla kalın!
LM35 Data Sheet : http://www.ti.com/lit/ds/symlink/lm35.pdf
OLED Ekran: https://egitimsart.org/2019/05/03/su-arduino-dedikleri-7-oled-display-kullanimi-i2c-protokolu/
çok işime yaradı teşekkürler
BeğenLiked by 1 kişi