Arduino ile millis komutunun kullanımı

Bu yazımızda arduino ile millis komutunun kullanımını inceleyeceğiz. Bu sayede projelerinizde bekleme yapılması gerektiği durumlarda projenizin çalışmasını durdurmadan çalıştırabileceksiniz.

11 Mayıs 2018 5.551 views 3

Arduino ile projeler yazan hemen hemen herkes delay komutu ile sorun yaşamıştır. Delay komutu bekleme için kullanılan bir komuttur.

Örneğin projenizde 5 saniye bekleme yapılmasını isterseniz delay(5000) komutu ile bu işlemi yapabilirsiniz. Fakat delay komutu görevini bitirene kadar 5 saniye boyunca kod akışı durdurur ve kendisinden sonraki komutların çalışmasını bekletir. Bu durumda projenin çalışma akışı kesintiye uğrar.

Basit bir örnek verecek olursak. Projenizde 1 dakika aralıklarla yanıp sönen bir led olsun. Bu led yanıp sönerken aynı zamanda bir servo motoru 0 ile 180 derece arasında sürekli olarak hareket ettirmeniz gerekiyor. Bu durumda delay komutu ledin 1 dakika aralıkla yanıp sönmesini sağlar fakat sürekli bu işlem yapılacağından servo motorla ilgili kodlara geçilemez ve servo motoru çalışmaz ya da kesik kesik çalışır.

Yukarıdaki örneğe benzer projeleriniz var ise kullanmanız gereken kod delay yerine millis olacaktır.

Millis komutu nedir?

Arduino içinde, güç verildiği andan itibaren başlayarak sürekli olarak zamanı sayan bir zamanlayıcı bulunmaktadır. Bu zamanlayıcı yaklaşık 49,7 günde bir sıfırlanmaktadır. Peki bu 49,7 gün nasıl hesaplanmaktadır. Basitçe zaman milisaniye cisinden unsigned long veri tipinde tutulur. Unsigned long veri tipinin maksimum alabileceği değer 4294967295 dir. Bir günlük zamanı milisaniye cinsinden hesaplayacak olursak,

1000 (milisaniye) x 60 (saniye) x 60(dakika) x 24 (1 gündeki saat)=  86400000 değerini elde ederiz.

unsigned long veri tipinin tutabileceği maksimum değeri bulduğumuz bu değere böldüğümüzde yaklaşık olarak 49,7 sayısını elde ederiz.

4294967295 / 86400000 = 49,7 saat

Arduino ile millis komutu nasıl kullanılır?

Arduinoda millis komutu ile anlık zamanı alabilmek için unsigned long tipinde bir değişken tanımlamalıyız.

unsigned long simdiki_zaman = millis();

Yukarıdaki komut ile arduinodaki anlık zamanı simdiki_zaman değişkenine aktardık.

Şimdi yukarıda bahsettiğimiz 1 saniye aralıklarla led yanıp sönerken aynı zamanda servo motoru 0-180 derece arasında sürekli hareket ettireceğimiz arduino devresini ve kodlarını hazırlayalım.

Yukarıdaki kod ile millis komutunu kullanarak arduino 2 numaralı pine bağlı ledi 1 saniye aralıklarla yakıp söndürüyoruz. Aynı anda servo motoru sürekli olarak 0-180 derece arasında döndürüyoruz.  Bu koddaki bekleme işlemini delay komutu ile yapmış olsaydık servo motorun çalışması bekleme yüzünden etkilenecekti ve proje istediğimiz gibi senkronize bir biçimde çalışmayacaktı.

Değerli arkadaşlar bir yazımızın daha sonuna geldi. Genel anlamda arduino ile millis komutunun kullanımını inceledik. Sizler millis komutunu kendi projelerinizdeki bekleme yapılması gereken yerlerde delay komutu yerine kullanarak daha iyi sonuçlar elde edebilirsiniz.

Soru, öneri, görüş ve yorumlarınızı aşağıdaki yorum alanına yazmaktan çekinmeyiniz.

 

Like
Beğen!Bunu sevdim!Süper!Muhteşem!Eh işte!Beğenmedim!
22
BENZER KONULAR
YORUM YAZ
Avatar
Gökhan

Hocam for içine delay yazmaz istek servo hızlı tepkime vermeyecegin den sağlıklı çalışmaz diye düşünüyorum.

Avatar
Kadir

merhaba arduino da delay yerine millis kullanmak istiyorum ama programım çalışmıyor sensor okuduktan 5 saniye sonra durmasını istiyorum kodumu yolluyorum i yardımcı olabilir misiniz ?
#define in2 6 // in2 pinini 6. pine tanımladık.
#define ledk 10
#define ledy 11
#define leds 8

int sayac=0;
int butonDegisim = 0; // butonDegisim degişkenini tanımladık
int butonDegisimi2 = 0; // butonDegisimi2 degişkenini tanımladık
int sensorDegeri = 1; // sensorDegeri degişkenini tanımladık

void setup() { // ana kurulum
pinMode (buton1, INPUT); // 3. pin giriş oldu
pinMode(buton2, INPUT); // 4. pin giriş oldu
pinMode(enA, OUTPUT); // enA pini çıkış oldu
pinMode(in1, OUTPUT); // in1 pini çıkış oldu
pinMode(in2, OUTPUT); // in2 pini çıkış oldu
pinMode(ledk, OUTPUT);
pinMode(ledy, OUTPUT);
pinMode(leds, OUTPUT);

Serial.begin(9600); // seri haberleşme aç
}

void loop() { // sonsuz döngü

if (digitalRead(buton1) == HIGH) { // okunan deger 1 ise
butonDegisim = 1; // butonDegisim degiskenini 1 yap
delay(10); // 10 milisaniye bekle
}
while (butonDegisim == 1) { // butonDegisim degiskeni 1 oldugunda

int pot = analogRead(A1); // potansiyometre degerini oku
int pwmoutput = map(pot, 0 , 1023 , 0 , 255); // potansiyometre degerini 0 ile 255 arası ayarla
analogWrite(enA, pwmoutput); //L298N’e PWM sinyal yolla
digitalWrite(ledy, HIGH);
digitalWrite(ledk, LOW);
digitalWrite(leds, LOW);
delay(10);
digitalWrite(in1, LOW);// L298N sürücü devresinde ki in1 girişine 0V verilecek
digitalWrite(in2, HIGH); // L298N sürücü devresinde ki in2 girişine +5V verilecek

int sensor = analogRead(A0); // sensor degerini oku
Serial.println(sensorDegeri); // sensorDegerini görüntüle

if ((sensor) == 0) { //sensorde okunan deger 1 ise
sensorDegeri <= 0; //sensorDegeri degiskenini '<=0' yap
delay(10); // 50 milisaniye bekle
digitalWrite(enA, pwmoutput); //L298N'e PWM sinyal yolla
digitalWrite(leds, HIGH);
digitalWrite(ledy, LOW);
digitalWrite(in1, HIGH); //L298N sürücü devresinde ki in1 girişine +5V verilecek
digitalWrite(in2, LOW); //L298N sürücü devresinde ki in2 girişine 0V verilecek
butonDegisim = 0; // butonDegisim degiskenini 0 yap

delay(5000);

digitalWrite(leds, LOW);
digitalWrite(ledy, LOW);
digitalWrite(ledk, HIGH);
digitalWrite(enA, LOW); //L298N sürücü devresinde ki enable girişine 0V verilecek

}

if (digitalRead(buton2) == HIGH) { // okunan buton 1 ise
butonDegisim = 0; // butonDegisim degiskenini 0 yap
digitalWrite(leds, LOW);
digitalWrite(ledy, LOW);
(digitalWrite(ledk, HIGH));
digitalWrite(enA, LOW); //L298N sürücü devresinde ki enable girişine 0V verilecek

}
}
}

Avatar
Recep Topaloğlu

3 led sırayla yanarken 4 ncü led butona basıldığında yansın bırakıldığında sönsün şeklinde anlatabilirsiniz. Çünkü daha servoya geçemedim. Konuyu birde bu şekilde anlatırsanız çok sevinirim.