PAYLAŞIM - MILLIS kullanarak Çoklu Görev (MultiTasking)
ARDUINO programlarında birden fazla işlemi değişik zamanlayıcı kontrolleri altında yapabilmek için aşağıdaki uygulamayı sunuyorum. Umarım yardımcı olur.
Örnekte 3 değişik işlem değişik zaman ayarları ile programlanmıştır. Daha fazlası gerektiğinde aynı yöntem kullanılarak arttırılabilir.
Her işlem için iki değişken tanımlanması gerekir:
unsigned long ISR1_Zaman = 5000; //ms
unsigned long ISR1_evvelkiMILLIS = 0;
ISRnZaman işlemlerin hangi süre ayarı ile gerçekleşmesi gerektiğini ayarlar. Yukarıdaki örnek ayar işlemin her 5 saniyede bir yapılacağını tanımlar.
ISR1_evvelkiMILLIS ise işlemler arası geçen zamanı kontrolde kullanılır.
Bu ayarlardan sonra, LOOP() içinde her işlemin zaman ayarı kontrol edilerek gereken rutin çalıştırılır.
MILLIS() fonksiyonu ARDUINO programı çalışmaya başladığından beri geçen zamanı döndürür. Bu değişkeni arzuladığımız işlemimizin zaman ayarına karşılaştırarak işlemin yapılması gereken zamanı tespit etmiş oluruz.
Bu tekniğin en önemli kısmı ARDUINO nun DELAY() fonksiyonunun kullanılmamasıdır.
DELAY() kumandası çalışırken ARDUINO programındaki başka bütün işlemler çalışmaz. Bundan dolayı birden fazla işlem kontrolü gerektiğinde DELAY() kullanmak doğru değildir.
DELAY yerine MILLIS() fonksiyonunu kullanarak programı durdurmadan istediğimiz kadar işlemi 'gerçek zaman' da çalıştırabiliriz.
İyi Çalışmalar.
ÖRNEK:
Program 3 tane işlem tanımlar.
Her 5 saniyede ekrana bir mesaj yaz.
Her 1 saniyede LED13 ü yak.
LED13 ü 3 saniye yandıktan sonra söndür.
Programın çalışmasını takip için #1 deki MESAJ haricinde öteki işlemler de seri monitöre mesajlar yollamaktadırlar.
ARDUINO LED13 ü izlediğinizde, her 1 saniyede yandığını ve 3 saniye yanık kaldıktan sonra söndüğünü göreceksiniz.
Ayrıca her 5 saniyede seri monitöre
****** ZAMANLAYICI_1: Message @ nnnn
yazılacaktır.
// MILLIS kullanarak Çoklu Görev (MultiTasking)
const int LEDPin= 13; //LED13 kullan
//GÖREV değişkenleri
unsigned long ISR1_Zaman = 5000; //ms
unsigned long ISR2_Zaman = 1000; //ms
unsigned long ISR3_Zaman = 3000; //ms
unsigned long ISR1_evvelkiMILLIS = 0;
unsigned long ISR2_evvelkiMILLIS = 0;
unsigned long ISR3_evvelkiMILLIS = 0;
void setup() {
Serial.begin(115200); //Seri Monitör hız ayarı
pinMode(LEDPin, OUTPUT); //LED13 ü çıkış olarak ayarla
}
void loop() {
unsigned long currentMillis = millis(); // zamanlayıcıyı oku
//ZAMANI gelen işi yap:
// ----- TASK#1:
if (currentMillis - ISR1_evvelkiMILLIS >= ISR1_Zaman)
{
ISR1_evvelkiMILLIS = currentMillis;
ISR_1();
}
// ----- TASK#2:
if (currentMillis - ISR2_evvelkiMILLIS >= ISR2_Zaman)
{
ISR2_evvelkiMILLIS = currentMillis;
ISR_2();
}
// ----- TASK#3:
if (currentMillis - ISR3_evvelkiMILLIS >= ISR3_Zaman)
{
ISR3_evvelkiMILLIS = currentMillis;
ISR_3();
}
}
void ISR_1() {
// Seri monitöre mesaj yazdır
Serial.print("****** ZAMANLAYICI_1: Message @ ");
Serial.println(ISR1_evvelkiMILLIS);
}
void ISR_2() {
// LED13 ü yak
LEDon();
Serial.print("DIAGS - ZAMANLAYICI_2: LEDon @ ");
Serial.println(ISR2_evvelkiMILLIS);
}
void ISR_3() {
// LED 13ü söndür
Serial.print("DIAGS - ZAMANLAYICI_3: LEDoff @ ");
Serial.println(ISR3_evvelkiMILLIS);
LEDoff();
}
void LEDon() {
digitalWrite (LEDPin, HIGH);
}
void LEDoff() {
digitalWrite (LEDPin, LOW);
}