Bu yazımızda Arduino Analog Okuma analog pinlerinden A0 pinine bağlı olan bir trimpotun(ayarlı direnç) voltaj değerini okuyup seri porttan bilgisayara göndereceğiz arkadaşlar.

Aşağıdaki devreyi breadboardunuza kurun. 1-10K bir trimpot takabilirsiniz çok önemi yok. Trimpotlar ayarlı dirençlerdir. Üzerindeki yazan değer maksimum olup orta konumunu çevirdiğiniz zaman direnç değeri 0 ile maksimum arasında lineer olarak değişir. Bu direnç değişikliği bize voltaj farklılığı yaratacaktır. Bu voltaj farklılığını arduino ile okuyarak dijital bilgiye dönüştürüp bilgisayara göndereceğiz.

Arduino Trimpot Analog Okuma

Arduino Trimpot Analog Okuma

Aşağıdaki kodu inceleyin ve programınıza yazdıktan sonra derleyip arduino’ ya yükleyin. Serial Monitörü açın programın sağ üst köşesinden ve verilerin geldiğini görün.

// www.kaizen40.com

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);   // A0 pinindeki analog değerini oku

  Serial.println(sensorValue);        // serial porttan gönder
  Serial.flush();                     // tüm data gönderilene kadar bekle

  delay(500);                         // saniyede 2 kere göndermesi için
}

Arduino 10-bitlik bir Analog Dijital Dönüştürücü (ADC Analog Dijital Converter) sahip olduğundan maksimum okuyacağı volaj değeri +5V olup dönüşüreceği dijital değerde 1024 olacaktır. Minimum yani sıfır voltta ise 0 değeri verecektir.

Bu değer bir sensor bağladığınızda bu şekilde bir işinize yaramaz. Bu bilgiyi işlemeniz gerekmektedir. Yani bir sıcaklık, veya basınç sensoru düşünün, kataloğunda derki ben 0-10 bar arası 0-5V çıkış yaparım. Siz 0-5V değerni 0-1024 dijital değer olarak arduino’dan okuyacaksınız. Bu digital değeri interpolasyon yaparak volt değerine dönüştürmelisiniz.

Aşağıdaki kod interpolasyon işlemini yapmaktadır.

// www.kaizen40.com

float p1 = 0;
float MaxBasinc = 10.0;     // sensor max değeri
float MinBasinc = 0.0;      // sensor min değeri

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);   // A0 pinindeki analog değerini oku

  p1 = (MaxBasinc - (((MaxBasinc - MinBasinc) * (1024 - sensorValue)) / 1024));    // interpolasyon yapıldı
  Serial.println(p1);                 // serial porttan gönder
  Serial.flush();                     // tüm data gönderilene kadar bekle

  delay(500);                         // saniyede 2 kere göndermesi için
}

Şimdi biraz daha okuma sistemimizi geliştirelim. Belirlediğimiz kadar saniyede okuma yapsın ve bu okunan değerlerin ortalamasını alıp saniyede bir kez bilgisayara göndersin. Bu ne işimize yarar derseniz, analog değerler çok gürültülü olmaktadır. Zaten yukarıdaki kodları çalıştırdığınızda değerlerin çok sabit olmadığını belirli bir sapmada aşağı yukarı hareket ettiğiniz göreceksiniz. O yüzden hem devrede filtre çalışması hem de yazılımda filtre algoritması yaparak çok düzgün değerler okuyabilirsiniz.

Aşağıdaki kod yazılımsal olarak 5 değerin ortalamsını alıp saniye de bir kez bilgisayara göndermektedir.

// www.kaizen40.com

float p1_read[5] = {};                     // 1 sn de 5 kez okunup ortalaması alınması için
int p1_ort = 0;                            // okunan 5 değeri ortalaması
float p1 = 0;                              // okunan 5 değeri ortalaması

float MaxBasinc = 10.0;
float MinBasinc = 0.0;

unsigned long oldTime = 0;
const long interval = 1000;

// ************* KONFİGURASYONLAR ************* //
void setup()
{
  Serial.begin(9600);
}

// ************* ANA PROGRAM ************* //
void loop()
{
  unsigned long currentMillis = millis();       // mevcut saniye bilgisi hafızaya al
  if((currentMillis - oldTime) > interval)      // aralıktan fazla ise 
  { 
    oldTime = currentMillis;                    // mevcut saniyeyi hafızaya al
           
    for(int y = 0; y < 4; y++)
    {
      p1_read[y] = analogRead(0);             // transmitteri oku 5 kez
      p1_ort = p1_read[y] + p1_ort;
      delay(150);                             // saniyede 5 kez okumak için
    }
    p1_ort = p1_ort / 5;                      // 1 sn de 5 okuma yapıldı ve ortalaması alındı
      
    p1 = (MaxBasinc - (((MaxBasinc - MinBasinc) * (1024 - p1_ort)) / 1024));    // interpolasyon yapıldı

    Serial.println(p1);
    Serial.flush();
  }
}

0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.