17.03.2012

Arduino Project 11 - Temperature Sensor

Herkese merhaba bu çalışmada ısı sensöründen aldığım ölçüm değerlerini processing ile hazırladığım bir grafik arayüz üzerinde göstereceğim. Başlamadan önce kısa bir not. Bu aralar yoğun olduğum için yaptığım projelerin yazıları çok gecikiyor. Tabikide bu yazdığım bir bahane ve bunun gerçek adı tembellik ;) Daha sırada düzenlenmeyi bekleyen bir çok yazı  ve proje var :/ (pic, opencv ve lua vs.). Gelelim projeye, bu çalışmada kullanılan sensörün adı LM35DZ basit, ucuz, bulması kolay kullanması çok çok kolay bir sıcalık sensörü. Analog değerler üretiyor ve analog değerleri değerlendirip Celsius ve Fahrenheit cinsinden değerlerndirmek bize düşüyor. 

Programda özen göstermediğim bazı konular var bunları baştan bildireyim ;P İlk olarak grafiksel gösterim çok yeterli değil, ikincisi grafiksel çizimde yuvarlamalar yapıldığı için değerde küçük sapmalar söz konusu. Ayrıca algoritmanın çok da iyi olduğu söylenemez bir iki denemede hatalı ölçümler aldım :). Tabiki öyle bir durumda programı yeniden derlemek en iyi çözüm oldu :) Peki sen neyi düzgün yaptın derseniz ilk olarak gerekliler listesine bakarak başlayalım.

Gerekliler litesi :

- 1x LM35dz
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı
- Processing Yazılımı

Arduino Kod :

int lm35Pin =0;
// sensörü bağladığım pin numarası
float temperature = 0; 
void setup (){
 analogReference(DEFAULT);
 Serial.begin(9600);
}
void loop(){

// Anlık sapmaların etksini azaltmak için sensörden okuduğum on değeri topluyorum.
// Sonra ortalamasını alacağım.
 for(int i=0; i<=10 ; i++)
{
 temperature = temperature + analogRead(lm35Pin);
 delay(10);
// Her ölçüm arasına 10 ms lik zaman dilimi koyuyorum
 }
 temperature = temperature / 10;
// Topladığım değerin aritmetik ortalamasını alıyorum
 temperature = (5 * temperature * 100)/1024; 

 // Elde ettiğim değeri celsiusa çeviriyorum. Açıkcası gelen analog değeri voltaj değerine çeviriyorum.
 // Referans değerim 5V. 10 bitlik ADC kullanıyorum. Sensöründe her 1 C için 10mV yolldığını biliyordum.
 Serial.println(temperature);
// Seri port üzerinden veriyi gönderiyorum
 temperature = 0;
// Değişkeni yeniden toplamda kullanılması için sıfırlıyorum
}
-------------------------------------------------------------------------------------------------------------------------
Processing Kod :


/*
*****************
H.Melih ERDOĞAN
*****************
Project 11

Name : Temperature Sensor
*/


import processing.serial.*;
// Gerekli değişkenler tanımlandı
Serial port;
int rect_length= 420;
float temperature;

// sıcaklık değerlerini atacağım değişkenler.
int[] x1 = new int[500];
int[] y1 = new int[500];
int count=0;

// renkleri tanımladım
color orange = color(204, 102, 0);
color white = color(255, 255, 255);
color fire = color(255,0,0);
color ice = color(0,150,255);
int sec,current_sec;
int mx,my;

// Pencere boyutu, seri bağlantı vs. ayarlar yapıldı.
void setup() {
  sec = second();
  size(640,480);
  port = new Serial(this,"COM11",9600);
  port.bufferUntil('\n');
  x1[0]=120;
  y1[0]=500;
  smooth();
}
void draw (){
background(255); 
// Arka plan beyaz
fill(white);
rect(10, 20, 100, rect_length);
// grafiğin ve sıcaklık barının oladuğu alanları oluştur.
rect(120, 20, 500, rect_length);
//bar renklerini ayarla
if(temperature <= 27 )

{
fill(fire);
}
else if(temperature <=20 )
{
fill(ice);
}
else{
fill(orange);
}

// ekrana yazılacak olan yazıları yaz
text("C",125, 35);
text("Time(2s)",565, 455);
text("Current Temperature : " +temperature+" C", 10, 15);
rect(12, rect_length-int((temperature*4))+20, 96, int(temperature*4));
//
grafiği ekrana çiz
if(count==500){
// eğer ekranda 500 tane nokta varsa değişkeni sıfırla.
count=0;
}
current_sec = second();
// bilgisayarın saatinin saniyesini okuyorum.
if(current_sec == sec+2){

// her iki saniyede bir ölçüm alıyorum bunu yapabilmek için bilgisayarın saatini kontrol ettim.
// gereksiz gelebilir fakat kullanımını öğrenmek için yaptığım bir deneme oldu ;)
x1[count]=120+count;
y1[count]=rect_length-(int(temperature*4))+20;
sec = current_sec;
count++;
}
else if(sec+2 > 59){
if(sec+2==60){
sec = 0;
}
else if(sec+2==61){
sec = 1;
}
}

// grafiği ekrana çiziyorum.
for(int i=0; i <= count ; i++ )

{
point(x1[i], y1[i]);
}

// fare ekranda dolaştıkça bulunduğu yerin kaç derece olduğunu gösteriyorum.
// alanı kısıtlıyorumki fare sadece grafik içerisndeyken dereceyi gösteriyor.
if(( mx < 620 && my <= 440 ) && ( mx >= 120 && my >= 20 )) 

{
text((440-my)/4 +" C",mx+5,my-5);
}
delay(10);
}

// farenin hareketlerini takip ediyorum.
void mouseMoved() {
  mx=mouseX;
  my=mouseY;
}

// seri portda gelen değeri değişken içerisine atıyorum
void serialEvent (Serial port){
temperature=float(port.readStringUntil('\n'));
}


Devre Şeması :


Programın Ekran görüntüleri :






Devrenin kurulmuş halinin görüntüleri :




Projenin çalıştırılmış halinin videosu aşağıdadır. Herkese iyi seyirler.


Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

Hiç yorum yok:

Yorum Gönder