Skip to content
//

Bilim ve Teknoloji Üretmek İçin Buradayız!

delay() Tuzağı ile Robotunuzu Uyutmayın

Robotik kodlamaya yeni başlayan herkesin yolu o kolay komuttan geçer: delay(1000). Mantığı basit: 1 saniye bekle. Ama proje büyüdükçe robot garip davranmaya başlar. Butona basarsınız algılamaz, önüne engel çıkar durmaz, çizgi izlerken yoldan çıkar.

Suçluyu sensörde veya pilde aramayın. Çoğu zaman sorun, robotu narkoz verilmiş gibi uyutan delay() komutudur.

1) delay beyni dondurur

Arduino delay gördüğü an o süre boyunca başka iş yapmaz. Örnek: ışığı yak, 2 saniye bekle, sonra sola dön. O 2 saniye boyunca robot:

  • Önündeki duvarı göremez (ultrasonik okunmaz)
  • Acil durdurma butonunu duyamaz
  • Çizgiden çıktığını fark edemez

delay bir mola değil; kısa süreli bir felç halidir. Süre bitene kadar robot kör, sağır ve dilsizdir.

2) Yumurta haşlama 

delay yöntemi: Yumurtayı suya koyarsınız ve 5 dakika ocağın başında kıpırdamadan beklersiniz. Telefon çalsa bakmazsınız, kapı çalsa açmazsınız.

millis yöntemi: Yumurtayı koyarsınız, saate bakarsınız: 14:00 koydum, 14:05 alırım. Sonra masayı hazırlarsınız, ekmek doğrarsınız, ara ara saate bakarsınız. Vakit gelmediyse işinize devam edersiniz.

Profesyonel robotçular robotu ocak başında bekletmez; ona saati kontrol etme yeteneği verir.

3) Aynı anda birden fazla iş (millis)

Hem LED yakıp söndürmek hem çizgi izlemek istiyorsanız delay kullanamazsınız. LED için beklerken motorları süremezsiniz.

Çözüm: Arduino nun kol saati olan millis(). Mantık: Çizgi izlemeye devam et, motorları sür. Ama gözün saatte olsun. Son ışıktan bu yana 1000 ms geçtiyse LED i değiştir; sakın durma, yoluna devam et.

unsigned long sonZaman = 0;
int ledDurum = LOW;

void loop() {
  // her turda sensor / motor isleri
  cizgiIzle();

  // LED i beklemeden yak-sondur
  if (millis() - sonZaman >= 1000) {
    sonZaman = millis();
    ledDurum = !ledDurum;
    digitalWrite(LED_BUILTIN, ledDurum);
  }
}

Atölye notu: delay tamamen yasak değildir. setup() içinde kısa bir bekleme veya yarışta kullanılmayan tek seferlik işlerde kabul edilebilir. Ama loop() içinde sensör + motor varsa delay tuzağa düşürür.

Robotunuz geç tepki veriyorsa önce koddaki delay satırlarına bakın. Robotu uyutmayın; ona zamanı yönetmeyi öğretin. Gerçek dünyada hayat durmaz; robotunuz da loop içinde durmamalı.