Bu yazımızda Arduino Pulse Okuma uygulaması yapacağız arkadaşlar. Bunun için interrupts ve digitalRead() komutlarını kullanacağız. Bir zamanlayıcı kurup bu esnada arduino’ nun ikinci pinine bağlı olan pulse sinyali okunmaktadır. Zamanlayıcı belirlenen değere geldiğinde bir kesme oluşacak ve o ana kadar saydığı pulse değerlerini bilgisayara gönderecektir. Bu sayede pulse sinyalinin hertz bilgisini edinmiş olacağız.

Aşağıdaki kod digitalRead() komutu ile pulse okuma yapılmış arduino kodudur.

// www.kaizen40.com

const int sensor = 2;
int pulse = 0;

void setup()
{
  Serial.begin(57600);

  pinMode(sensor, INPUT_PULLUP);
  pinMode(13, OUTPUT);

  digitalWrite(13, LOW);

  // Zaman Kesmesi(Hz) = Arduino’nun kristal Hızı/(Zaman Kesmesinin Çözünürlüğü – Sayıcının Başlangıç Değeri + 1)
  cli();

  // Timer1 kesmesi ayarlanıyor
  TCNT1  = 0;
  TCCR1A = 0;
  TCCR1B = 0;
  OCR1A = 15624;  // 1 saniye çalışması için gerekli zaman kesmesi frekansı
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
}

ISR(TIMER1_COMPA_vect)                //Her kesmeye girildiğinde otomatik çalıştırılacak fonksiyon.
{
  Serial.print("Pulse adedi: ");
  Serial.println(pulse);
  pulse = 0;
}

void loop()
{
  if(digitalRead(sensor) == 0)
  {
    //delay(10);
    while(digitalRead(sensor) == 0){}
    pulse++;
  }
}

Arduino pulse okuma uygulaması içi diğer bir yöntem kesme kullanımıdır. Her pulse darbesinde kesme (interrupts) oluşturarak sayacımızı arttırabiliriz. Buna güzel bir örnek ile gösterelim. Bir türbin debimetreniz olduğunu düşünün ve akış olduğunda türbin bıçakları dönecektir. Bu sayede hall efect sensor her bıçak hareketinde bir pulse üretecektir. Bu pulse bilgilerini okuyarak geçen akış miktarını hesaplamaya yönelik arduino kodunu aşağıda bulabilirsiniz.

// www.kaizen40.com

byte statusLed    = 13;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

volatile byte pulseCount;  

unsigned long oldTime;

void setup()
{
  Serial.begin(57600);    // seri portu aç
  
  pinMode(statusLed, OUTPUT);     // durum ledini ayarla
  digitalWrite(statusLed, HIGH);  // durum ledi aktif
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  // hall efect sensor 2.pine bağlı düşen kenarda tetikleme olsun
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

// Ana program
void loop()
{  
  if((millis() - oldTime) > 1000) // sadece 1 sn de bir çalışsın
  {     
    detachInterrupt(sensorInterrupt); // kesmeyi pasif et
    
    oldTime = millis();

    // debimetrenizin pulse faktörüne göre kodunuzu buraya yazın
    // flowrate (akış değeri) veya toplam litre gibi değerleri hesaplattırıp
    // serialporttan bilgisayara gödnerin yada bilgisayarda hesaplattırın
    Serial.println(pulseCount);     // sadece pulse bilgisini gönder
    pulseCount = 0;
      
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // kesmeleri aktif et
  }
}

// Kesme geldiğinde burası çalışsın
void pulseCounter()
{
  pulseCount++;   // sayacı arttır
}

Yukarıdaki programda sadece pulse bilgisini saniye bir kez bilgisayara gönderimi yapılmaktadır. İsterseniz debimetrenizin pulse bilgisinin litreye oranını hesaplattırıp litre bilgisini de veya toplam litre gibi değerleri de gönderebilirsiniz. İsterseniz pulse bilgisini bilgisayar ile okuyup hesaplatma işlemini bilgisayara yaptırabilirisiniz.


0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

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