Arduino Ders #13: millis(); fonksiyonu

Arduino da temel düzey eğitimleri tamamladık. Artık buradan sonra biraz daha kafa karıştırıcı ama işimizi gören fonksiyonlar öğrenmeye başlayacağız. O zaman başlayalım. Nedir bu Millis fonksiyonu ?

Öncelikle Neden “millis()” ?

Program içerisinde kullandığımız “delay” fonksiyoları bilindiği üzere programı adeta bir trafik sıkışması gibi sekmeye uğratıyor. Çünkü program delay fonksiyonunda beklerken kod okumamız da gecikmektedir dolayısıyla hem delay fonksiyonunu kullanıp hem de programın o sırada farklı işlerle meşgul olabilmesi için Millis() fonksiyonunu kullanmamız gayet yerli bir davranış olacaktır.

Nedir bu “millis()” ?

Millis fonksiyonu Arduino’ya enerji verildiği zaman otomatik olarak çalışmaya başlar. Fonksiyon içerisinde Arduino’nun çalışma zamanı milisaniye cinsinden tutulur. Değerler milisaniye cinsinden tutulduğu için geri döndürülen değer int veya float’ın tutabileceği kapasitenin çok üstünde olabilir. Bu yüzden bu fonksiyonla birlikte unsigned long türündeki değişkenler kullanılır.

Unsigned long int’ in max değeri olan 4294967295 değeri geçildiğinde de sayaç sıfırlancak ve sıfırdan yeniden saymaya başlyacaktır.

Bilgi: Millis fonksiyonunu yaklaşık 50 gün çalışabilmektedir. Bu süreden sonra kendisini sıfırlar.

Millis fonksiyonunun program içerisindeki kullanımı aynen bu şekildedir

millis();

Delay kod satırı yerine millis() Kullanılması

Led yakıp söndürme işlemini bir de millis fonksiyonu ile yapalım .

Program kodlarımız şu şekilde:

unsigned long eskiZaman = 0;
unsigned long anlikZaman;
int LEDdurumu = 0;

void setup() {
  pinMode(5,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  anlikZaman = millis(); 
  
  if(anlikZaman-eskiZaman > 1000)
  {
     if(LEDdurumu == 1){
      digitalWrite(5,LOW);
      LEDdurumu = 0;
     }else{
      digitalWrite(5,HIGH);
      LEDdurumu = 1;
     } 
    eskiZaman = anlikZaman;
  }
  
  Serial.println(" burada baska islemler de yapabilir.");
  delay(10);

}

Kodların açılanması: Ledlerin yanması için arkada çalışan millis fonksiyonuna sürekli “hey millis 1 saniye geçti mi ? ” diye sorduruyoruz. Geçtiyse, “if” döngüsü içine giriyor ve burada ise, “Led durumu 1 mi ? birse onu sıfırlayalım ” değilse ” le durumu 0 mı ? sıfırsa onu 1’leyelim ” döngüsü karşılıyor. Böyle yaparak her bir saniye geçişinde Led’in durumunu değiştirebiliyoruz. Unutmadan, bu döngü içinden çıkmadan yeniden: anlik zaman ve eskizaman’ı eşitliyoruz.

Tüm bu işlemler olurken aynı zamanda Seri ekranda sürekli olarak, burada farklı işlemler yapılabilir yazısı dönüyor ve hiçbir bekleme olmadan. İşte millis fonksiyonunun farkı bu!

TinkerCad Uygulaması na bu link üzerinden ulaşılabilir https://www.tinkercad.com/things/dcBdPSqyKtg-millis-ile-led-yan-son

Uygulama 2: Üç Adet Led’in farklı zaman dilimlerinde yanıp sönmesi

Yeni uygulamızda ise, 3 adet led 0,5 sn, 1 sn, ve 1,5 saniye aralıklarla yanıp sönecek

int ledPin1 = 5, ledPin2 = 9, ledPin3 = 12;
unsigned long lastTime1 = 0, lastTime2 = 0, lastTime3 = 0;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
 
  //son millis değeri ile arada 1000 fark varsa 
  if (millis() - lastTime1 > 1000)
  {
    digitalWrite(ledPin1, !digitalRead(ledPin1)); //led durumunu değiştir
    lastTime1 = millis();                         //son değere o anki millis 
                                                  //değerini kaydet
  }

  //son millis değeri ile arada 500 fark varsa 
  if (millis() - lastTime2 > 500)
  {
    digitalWrite(ledPin2, !digitalRead(ledPin2)); //led durumunu değiştir
    lastTime2 = millis();                         //son değere o anki millis 
                                                  //değerini kaydet
  }

  //son millis değeri ile arada 1500 fark varsa 
  if (millis() - lastTime3 > 1500)
  {
    digitalWrite(ledPin3, !digitalRead(ledPin3)); //led durumunu değiştir
    lastTime3 = millis();                         //son değere o anki millis 
                                                  //değerini kaydet
  }
}

Kodları inceleyip yorumlayınız

Farkı gör! : Bir önceki uygulamaya kolaylık getirdik ve ledlerin yanık olup olmamalarını “!” karşılaştırma komutu ile daha az satırla değiştirme imkanı bulduk.

Millis fonksiyonuna kullanmaya alışmak çok önemlidir. Çünkü özellikle seri haberleşme uygulamalarında delay fonksiyonu bir çok işlemin gecikmesine yol açabilmektedir. Bu yüzden millis fonksiyonuna alışırsak birçok uygulamada kolaylık karşımıza çıkacaktır.
ÖDEV: Millis fonksiyonu ile ilgili örneklerinizi çoğaltın . Birçok örnek kodlar oluşturun veya bulun ancak her kod satırının ne iş yaptığını ayrıntılı açıklayın.

Kaynaklar: .elektrobot.net/arduino-ile-millis-kullanimi-ve-timer-uygulamalari/, https://www.arduino.cc/reference/en/language/functions/time/millis/ , .elektronikatolyem.com/2020/02/15/arduino-millis-kullanimi/

Bir cevap yazın

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