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