25 Mart 2017 Cumartesi

Arduino - Su Seviye Sensörü Uygulaması

Su seviye sensörünün kullanımı aslında çok basit. Herhangi bir potansiyometreyi okuyan biri bu sensörü rahatlıkla kullanabilir. "-" ucunu GND, "+" ucunu 5V'a "S" ucunu da herhangi bir analog girişe takıp AnalogReadSerial örneğini açarak bu sensörü kullanabilirsiniz.

Lakin bu sensör, doğrusal çıkış vermemekte ve bu yüzden de okunan adc değerlerinin cm cinsine çevrilmesinin mümkünatı zorlaşmakta.









Bu yüzden biz de adc değerlerinden örnekler alarak bu değerleri MATLAB programındaki "Eğri Uydurma" özelliğini kullanarak cm cinsine çevireceğiz.


Ben sensörün en dibinden itibaren 0,1,2,3,4. santimetrelerini işaretleyerek 5 örnek aldım.

0 cm yi ise sensörü birazcık suya batırarak aldım. Aldığım örnekler;


0 cm --> 350 

1 cm --> 540
2 cm --> 650
3 cm --> 667
4 cm --> 688


Çıkış olmasını istediğimiz taraf cm cinsi olacağı için y dizinine, ADC değerleri x dizinine kaydettim.Sonra yukardan Curve Fitting özelliğine tıkladım ve X data için x, Y data için y değerlerini seçtim. 

Noktaları göz kararı birleştirdiğimizde çıkan eğrinin exponansiyel olduğunu görüyoruz. O yüzden Exponential eğri uydurmayı seçtim ve derecesini de 1 yaptım. Sol tarafta a ve b değerleri çıktı, bizim işimiz bu değerleri, okunan adc değerine göre arduinoya adapte etmek.

Siz daha fazla örnek seçerek sonuca daha fazla yakınlaşabilirsiniz. Aşağıdaki resimde görüldüğü üzere 1.derece exponansiyel eğri uydurma da hata payım bende biraz fazla.

Bu verileri arduinoya adapte ettim. LCD kullananlar LCD fonksiyonunun başındaki slashları silebilirler. Kodlar LCD shield kullananlar içindir.

LCD shield kullanmıyorsanız "LiquidCrystal lcd(8,9,4,5,6,7);" satırına kendi değerlerinizi girmelisiniz.

Kodlar;


//#include <LiquidCrystal.h> // LCD İçin
//LiquidCrystal lcd(8,9,4,5,6,7); // LCD İçin
#include <math.h> // exp özelliği için bu kütüphane eklenmeli

float seviye=0;
float x;

void setup() {
  
  Serial.begin(9600);
//  lcd.begin(16,2); // LCD İçin
}
void loop() 
{
  
  x = analogRead(A1); 
  seviye= 0.0007624*exp(0.01239*x);  
  Serial.println(seviye);
//  lcd.clear(); //LCD için
//  lcd.print(seviye); // LCD için
  
  delay(100);       
}


Konuyu anlatıp yaptığım videom ve LCD Shield kullanarak yaptığım deneme;





1 yorum: