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.
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