sensorDevreMerhaba arkadaşlar bu yazımızda iki adet sıcaklık sensörünü Arduino UNO üzerinde gerçekleyerek karşılaştırması yapacağız.Öncelikle sensörlerimizi tanıtayım.Analog sensörümüz lm35’dir.Dijital sensörümüz TMP102 sensörüdür. Daha önceden TMP102 nin özelliklerini anlatmış bulunmaktaydım. LM35’in özelliklerindende bahsedeceğiz. Arduino’da gerçeklememki sebep iki sensöründe kullanımını görmek ve daha hızlı uygulamasının hazırlanabilmesidir. Diğer işlemci-denetleyicilerde hiçbir şekilde değişmeyecek olup ARM tabanlı Stellaris’te de gerçeklenmesini ileriki bir yazımda paylaşacağım.

Öncelikle sensörlerimizi şekillerini görelim.

Soldaki sensörümüz TMP102 olup gerekli açıklamalarını daha önce bu linkten yapmıştım : http://www.mcu-turkey.com/beaglebone-tmp102-sicaklik-sensoru-ile-i2c-java-haberlesme-uygulamasi/

Sağdaki sensörümüz lm35 olup analog özelliğe sahiptir. Gayet basit olarak 3 bacaktan biri VCC biri GND diğeride VOUT bacaklarıdır. Mantığını tam anlayamayanlar için yazmış olduğum motor uygulamasındaki potansiyometreye bakmalarını tavsiye edeceğim.

3 Bacağı olduğunu söylemiştik. Benim elimdeki sensör : http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf ‘dir. Sizde kendi elinizdeki lm35 sensörünün datasheet’ini kontrol ederek sorgulayınız. Çünkü markalara göre sensörlerdeki pinler yer değişikliği olabiliyor. Bu sebeple sensörünüzü yakmanız içten bile değildir. Sensör ortalama -55 ile +125 C arasında çalışmaktadır.

LM 35 pinleri :
1- Toprak (-)
2- Analog çıkış
3- Pozitif (+)
11

Şematiğimize göz atacak olursak :
sensorDevre

Devreyi kısaca anlatacak olursak:

TMP102 için:
TMP102  —-   Arduino

VDD                      3.3V
SDA                       A4
SCL                        A5
GND                      GND
ADD0                   GND

LM35 için :
LM35      —-     Arduino

GND                      GND
Output                 A0
VCC                       5V

şeklinde bağlantıları yaptığından emin olunuz. Devreye bağlı olan dijital sensörümüz i2c haberleşme tipini kullanmaktadır.Bunun için arduino’nun analog pinine takıyoruz ve bir sonraki işlemde i2c haberleşme konfigurasyonlarımızı yapacağız. Lm35 tarafında ise gücümüzü verdikten sonra aynı potansiyometre’deki gibi analog bir değer okuyacağız.

Burada dikkat edilmesi gereken hususlar iki sensöründe referans değerleri olacaktır. Bunun için datasheet’i iyi incelemenizi tavsiye ediyorum.

LM35‘in referans değerini tanımlayabilmemiz için okuduğumuz analog değeri bazı sabitlerle çarpıp daha sonra örneklememiz gerekiyor bunun için yapmamız gereken işlem bu şekildedir :  (okunandeğer x 100 x 5 )/1024

TMP102 için yapılmamız gereken şeyleri konusacak olursak.TMP102 FIFO yöntemiyle çalışmaktadır. Peki bu yöntem nedir ? FIFO yöntemi ilk giren ilk çıkar olarak bilinmektedir. Bunu daha kolay anlatacak olursak örneğin sıcaklık sensöründen bahsediyoruz ve örneğin “12” derece diye bir değer okuyorum ilk girenimiz “1” ikinci girenimiz “2” böylece çıkışta “21” okuyoruz.Böylece FIFO mantığı ile ilk giren 16’lidan sonraki 16’liyi okuyacağını öğrenmiş oluyoruz. Bir önceki yazımda bahsettiğim gibi yerlerini değiştirerek 4 bit sağa kaydırma işlemini yapmamız gerekiyor. Ayrıyetten ilk olarak okunan değeri yani ilk giren değeri 8 bit sola kaydırma yöntemiylede sensördeki negatif değerler için yapılan konfigurasyonu tamamlamış oluyoruz. Bu bilgileri kullandığım datasheetimiz :  http://www.ti.com/lit/ds/symlink/tmp102.pdf

Arkadaşlar şimdi sıra geldi kod bölümüne dikkat etmenizi istiyorum. Hangi işlemciyi kullanırsanız kullanın aynı işlemleri yapacaksınız. şuan bu kod yerine beaglebone’da kullansam stellariste kullansam msp430’da kullansam arduino’da kullansam aynı işlemleri yapacaktım. Algoritma aynı olacaktır. Sadece değişen kod dizimleri olacaktır. Mantığın değişmediğini unutmayınız.

[codesyntax lang=”php” title=”Arduino Sicaklik Sensör Kodu”]

#include <Wire.h> //i2c için yaptığımız bağlantı kütüphanesi

int lm35Pin = A0;  // LM35'in bağlı olduğu pin
float temp102derece; //derecenin float değeri olacaktır.

int tmp102adres = 0x48; // i2c ile 0x48 adresine yazılıyor

void setup(){
  Serial.begin(9600); //Seri monitör bağlantısı
  Wire.begin();       //i2c bağlantı ayarları
}

void loop(){

  float tmp102Sicaklik = tmp102SicaklikOlcum(); // yapılan ölçüm bir float'a aktarılır.
  Serial.print("TMP102 Sicaklik : ");
  Serial.print(tmp102Sicaklik);
  temp102derece = analogRead(lm35Pin);    //A0'dan okunan değerin bir float'a aktarılır.
  temp102derece = (temp102derece * 100.0 * 5.0)/1024.0;  //aktarılan değer referans alınan değerin örneklenmesi ile bölünür.
  Serial.print("      LM35 Sicaklik :" );
  Serial.println(temp102derece);
  delay(1000); 

}

float tmp102SicaklikOlcum(){
  Wire.requestFrom(tmp102adres,2); // adresten 2bit veri alma. 

  byte ilkDeger = Wire.read(); // i2c ile ilk okunan değer
  byte sonDeger = Wire.read(); // i2c ile son okunan değer

  //okunan 12bit'lik verinin ilk olarak 8bit sağa kaydırılıp son değerle toplanıyor. Ardından
  //oluşan değer 4bit sağa kaydırılarak sonuç elde ediliyor.8 bit kaydırma negatif degerler içindir.
  int toplamOkunanDeger = ((ilkDeger << 8) | sonDeger) >> 4; 

  float derece = toplamOkunanDeger*0.0625; // referans değer ile çarpılıyor ve ana fonksiyona döndürülüyor.
  return derece;
}

[/codesyntax]

Arkadaşlar bu yazımızında sonuna gelmiş bulunmaktayız. Bu yazıda iki farklı sensörün farklı protokol ve materyallerle sıcaklık ölçümünü sağladık. Arkadaşlar benim ölçümlerime göre lm35 ile tmp102 arasında bazen çok yakında değerler bazen ise lm35 hassasiyeti yani örneklemesi yetmediği için sapmalar görmekteyim. Ortalam +- 3-5 derece bazen oynayabiliyor. Bunun için tmp102 maliyetli olması kalitesini gösteriyor. Lm35 ise az maliyetle az hassasiyetli bir sensörü temsil ediyor.
Yazıyı takip ettiğiniz için teşekkür ediyorum. Kendinize iyi bakınız.

______
Gökhan TARIM
tarim.gokhan@gmail.com