12 Mart 2014 Çarşamba

Arduino - LM35 Sıcaklık Sensörü ile Termometre Uygulaması

Analog giriş fonksiyonları ile sadece potansiyometre gibi elemanların çıkışlarını değil aynı zamanda analog çıkış veren bütün sensörlerin gerilim değerlerini Arduino'ya aktarabiliriz.Elbette ki bu değerler 5V değerini aşmamalı.



Sol taraftaki resimde sıcaklık değerini analog çıkış olarak vermekte olan LM35 sensörü ve pinlerinin ne için kullanıldığı gösterilmekte.

Vs+ Arduino'muzun 5V, Toprak pini GND'ye ve Vçıkış olarak gösterilen pin de herhangi bir analog girişe takılarak Arduino ile sıcaklık ölçümü yapabiliriz.

Bu proje ile hem sensör ölçümlerine başlamış olacağız, hem de bir önceki yazıda görmüş olduğumuz "float" kodunu da kullanmış olacağız.






Analog giriş için Arduino'daki A1 pin girişini kullandım. Analog girişler sol tarafta olduğundan devre kurma işininin rahat  olması için breadboard un sağ tarafının kullanılması sağlıklı olur.

Matematiksel ifadeyi kurabilmek için yani analog değeri sayısal değere çevirmek için LM35'in analog çıkış yapısını bilmemiz gerekir.

Orta bacağından verilen mV mertebesindeki gerilim her °C için 10 mV üretir. Yani 25 °C için çıkış 250 mV olur. 




Daha ayrıntılı bilgi için http://www.ti.com/lit/ds/symlink/lm35.pdf

Arduino'daki ADC 10 bitlik olduğu için  ve en yüksek değerimiz 5000 mV olduğu için bu 5000 mV'u 1024 parçaya işlemcimiz ayıracaktır. Yani 1023.değer bize 5V'u verecek ve her 10 mV bize 1 °C 'yi verecek şekilde programımızı yazıyoruz.

Kodlarımız ;

float sicaklik; //Analog değeri dönüştüreceğimiz sıcaklık 
float analoggerilim; //Ölçeceğimiz analog değer

void setup () {
  Serial.begin(9600); //Seri haberleşme,Sıcaklığı ekranda görücez
}

void loop () {
 analoggerilim = analogRead(A1); //A1'den değeri ölç
 analoggerilim = (analoggerilim/1023)*5000;//değeri mV'a dönüştr 
 sicaklik = analoggerilim /10,0; // mV'u sicakliğa dönüştür

 Serial.print("Sicaklik Degeri: ");
 Serial.print (sicaklik);
 Serial.println (" derece");
 delay (1000);

}

Seri Haberleşme monitörü ile okuduğumuz değerler. Sensörün etrafında ateş yakarak değeri arttırabilirsiniz. Tabi sensörü yakmayın ateşle :))).

Bu da devremizin videosu.En  kısa zamanda bu sensör ile yaptığımız sıcaklık ölçümünü LCD'ye bağlayarak burda yayınlayacağım. Video'yu beğenmeyi unutmayın :).










26 yorum:

  1. selamlar.. devre için yazdığın kodları şekildeki devreyi arduino mega üzerinde kurdum. Doğrulamada ve yüklediğimde efeler gibi çalışıyor. Fakat hassasiyet ile ilgili bir problem var; 32,93 yerine 329,32 gibi değerler yazıyor. Nedeni ne olabilir?

    YanıtlaSil
  2. "sicaklik = analoggerilim /10,0 " komutundaki 10,0 yerine direkt 10 yazarak deneyin.Bildiğim kadarıyla Mega'nın da ADC'si 10 bit o yüzden UNO kodlarının Mega için uyumsuz olacağı söylenemez.
    LM35'in hassasiyeti çok iyi değil , bunun yerine ds18b20 sıcaklık sensörünü öneririm. Daha stabil ve hassas.

    YanıtlaSil
  3. Merhaba; peki bu devreye bir servo motor ekleyerek sıcaklık lımıtı ornegın 30 derecenın uzerıne cıksaydı nasıl bır yazılım yada setup a ıhtıyac duyardım yardımcı olabilecek var mı?

    YanıtlaSil
    Yanıtlar
    1. Merhabalar, İsteğinize uygun bir kodu internette buldum, incelersiniz. https://dl.dropboxusercontent.com/u/76467041/LM35%20Temp%20Sensor%20Arduino%20Code.txt
      adresinden alıntıdır!

      Sil
  4. 4 tane ısı sensörünü nasıl bağlayacagız

    YanıtlaSil
  5. ve isteddiğimiz ısı sensörünü sectiğimizde o degeri nasıl ekrena yansıtıcak?

    YanıtlaSil
    Yanıtlar
    1. İstediğiniz 4 sensörü de analog pinlere yazın. Her birinden değerleri sırayla okuyun. Parametre oluşturmanız gerekebilir, parametre seçimlerine göre de sensörlerden gelen verileri ekranda gösterebilirsiniz.

      Sil
  6. int sicaklikpin=1; olarak pin tanımlanmış, pin numarası A1 olarak değer verilmemiş. 1 verince otomatik analog giriş olduğunu algılıyor mu?

    YanıtlaSil
    Yanıtlar
    1. analogread fonksiyonunun içinde yazdığımızdan algılıyor direkt. Siz dilerseniz A1 olarak define edebilirsiniz sicaklikpin değişkenini.

      Sil
    2. Ali arkadaşın soruna ilave olarak;

      1-Bu giriş pinMode ile giriş olarak neden tanımlanmamış?

      2-Devreyi isiste denediğimde 0'ın altındaki sıcaklıklarda sadece 0 gösteriyor?

      Sil
    3. 1-)Analog okumalarda pinMode ile giriş yapmanıza gerek yok..
      2-) Google'a " lm35 negative temperature arduino" yazarak bilgi edinebilirsiniz. 0 derecenin altında sıcaklık değeri okuma biraz farklı :).

      Sil
  7. çok teşekür ederim çok güzel bir paylaşım

    YanıtlaSil
  8. kolay gelsin.yazmış olduğunuz kodları arduino due nin atmega16u2 portundan yükledim. program çok güzel bir şekilde çalışıyor. fakat programı çalıtırdığımda sıcaklığı 48-50 derece arasında gösteriyor dışarısı 25 derece olmasna rağmen lm35 i soğuttuğum zaman enfazla 28 dereceye kadar düşüyor.lm35 in aldığı değerleri bakmak için programı değiştirdiğim zaman ise 90-96 arasında değerler alıyor. sorum şu acaba bir yerlerde yanlışmı yapıyorum devreyi yukarıda gösterildiği gibi kurdum breadboardın üzerinde ve dişi-erkek jumper kablolarlada ayrı ayrı denedim yine olmadı.acaba due de mi bi hata var

    YanıtlaSil
    Yanıtlar
    1. Aynı pinden potansiyometre değeri okumaya çalışın, due bozuk mu değil mi anlayabilirsiniz.
      Başıma böyle bir durum hiç gelmedi, sensörü değiştirmenizi önerebilirim ancak. Çünkü çok komplike bir bağlantısı yok devrenin.

      Sil
    2. Yazılımsal bir sıkıntı var dostum. Aşağıda mücahit arkadaşımıza verdiğim cevabı inceleye bilirsin.

      Sil
    3. Teşekkürler uyarınız için. Kodu düzeltiyorum.

      Sil
  9. ben komutları ve bağlantıları yaptığımda 307 derece gibi bir değer görüyorum nerede hata yapıyor olabilirim acaba.

    YanıtlaSil
    Yanıtlar
    1. Aşağıda Mücahit arkadaşımıza verdiğim cevabı incelerseniz sevinirim.

      Sil
  10. Merhabalar ben aynı projeyi yapıyorum lakin mobil uygulama kontrollü yapıyorum. Uygulamayı hazırladım ama arduino kodlarına eklenmesi gereken şeyler varmış o kısım hakkında yardım edebilecek var mı????

    YanıtlaSil
  11. Merhabalar,
    ben eksi(-30, -25 gibi ) değerleride almak istiyorum, fakat LM35 proteus üzerinde eksi değeri göstermeme rağmen terminalden 0 değeri dönüyor konu hakkında bilgisi olan varsa yardımcı olabilirmi, şimdiden teşekkürler

    YanıtlaSil
    Yanıtlar
    1. Piyasada genelde LM35'in "D" veya "DZ" türevleri bulunmakta. LM35DZ'nin teknik detaylarına baktığınızda da 0-150 derece aralığında ölçüm yaptığını görebilirsiniz. Saygılarımla.

      Sil
  12. Merhaba Hocam ben bu uygulama ve devreyi yaptım fakat değerler 440-500 arası çıkıyor 10,0 sadece 10 yaptım ama sonuç değişmedi yardımcı olabilirmisiinz ?

    YanıtlaSil
    Yanıtlar
    1. Merhaba. Bende dediğiniz gibi sıkıntı yaşadım. ancak biraz uğraştan sonra programın üçüncü satırındaki "int sicaklikpin=1;" kodda hata buldum. bu satırıdaki 1 rakamı birinci porttan okuma yapmaya çalışıyor sanırım. onun yerine "A1" yazarsanız düzelecektir. Ben "A0" portuna bağladığım için o satırı "int sicaklikpin=A0;" olarak düzelttim ve doğru sonuçlar almaya başladım. Saygılar

      Sil
    2. Bu sorunu bu şekilde çözmüş olsam da http://maker.robotistan.com/arduino-dersleri-11-sicaklik-olcumu/ adresindeki örnek ile kıyaslama yaptığımda ondan okuduğum değer ile bundan okuduğum değer arasında yaklaşık 2°C'lik bir fark çıkıyor. tahminim öbür programda kullanılan "analogReference(INTERNAL);" komutu daha net sonuç almamızı sağlıyor. Yani senin için 1-2°C'lik fark önemli ise öbür programı kullanmayı denemelisin. Saygılar

      Sil
  13. öncelikle paylaşım için teşekürler. ben de bir termometre yapmak istiyorum ama sıcaklığını ölçeceğim mesafe uzakta . yani 50m uzaklıktaki bir seranın sıcaklığını ölçeceğim ve bir referans değeri gireceğim ve o referans değerini geçince beni bilgilendirecek( buzzer veya LED ile) neyse asıl soruma geçeyim 50m mesafeden doğru sonuç alabilirmiyim. ve bu mesafeyi daha fazla uzatabilirmiyim mesela 100m gibi.

    YanıtlaSil