Kod Ara

Ders 14/31-3: Arduino kodlama millis() örnek 3 buton ile

Ders 14/31-3: Arduino kodlama millis() örnek 3 buton ile

Arduinonuzun bir şeyin ne zaman olduğunu—bir düğmeye basılması gibi—hatırlamasını ve ardından programınızın geri kalanı sorunsuz çalışmaya devam ederken tam bir süre sonra harekete geçmesini hiç istediniz mi? Bu, Arduino programlamada klasik bir zorluktur ve çözüm millis() fonksiyonudur. Robojax Arduino kursunun bir parçası olan bu eğitim, pratik bir örneği gösterir: bir butona ilk basıştan 5 saniyelik bir gecikme geçtikten sonra ikinci kez basılıp basılmadığını tespit etmek. Bu teknik, zamanlamanın kritik olduğu duyarlı, engellemeyen projeler oluşturmak için temeldir.

Sunfounder araba monte edilmiş

millis() kullanarak programı durdurmadan zamanı takip etme deseni, çok çeşitli gerçek dünya uygulamaları için gereklidir. İşte kendi projelerinize ilham verecek birkaç fikir:

  • Debounce Edilmiş Buton Arayüzleri: Bir cihazı açmak için bir butonun belirli bir süre (örneğin 3 saniye) basılı tutulması gereken bir sistem uygulayın, böylece yanlışlıkla basmalar önlenir.
  • Sıralı Eylemler: Bir hareket sensörü tetikleyicisi gibi bir olayın, belirli bir zaman penceresi içinde başka bir olay gerçekleşirse ikincil bir eylemi tetiklediği bir sistem oluşturun.
  • Kullanıcı Etkileşim Zamanlayıcıları: Bir komut gönderme veya motor başlatma gibi kritik bir işlevi yürütmek için belirli bir süre içinde bir "onay" girişi (ikinci bir buton basışı gibi) gerektiren bir proje oluşturun.
  • Sensör Kapılama: Bir sensörden gelen ilk sinyali, ikinci farklı bir sensörün okumasının geçerli kabul edildiği veya yok sayıldığı bir zaman penceresi başlatmak için kullanın.

Gerekli Donanım

Bu proje, öğrenmek için harika bir kaynak olan SunFounder 3'ü 1 arada Arduino kitinden bileşenler kullanır. İhtiyacınız olacaklar:

  • Arduino kartı (Uno, Nano vb.)
  • Bir anlık basmalı buton
  • Jumper kablolar

Bağlantı Rehberi

Bu örnek için bağlantı, harici bir direnç ihtiyacını ortadan kaldıran Arduino'nun dahili pull-up dirençleri sayesinde çok basittir. (Videoda 08:29'da)

  • Butonun bir ayağını Arduino'daki GND pinine bağlayın.
  • Butonun diğer ayağını Arduino'daki dijital pin 2'ye bağlayın.

INPUT_PULLUP kullanarak, pin dahili olarak 5V'a bağlanır, bu nedenle normalde HIGH okur. Butona basıldığında, pini GND'ye bağlar ve LOW okumasına neden olur. Kodda kullanacağımız mantık budur.

Kod Açıklaması

Bu projenin çekirdeği, ilk buton basışını izleyen ve ardından belirli bir zaman aralığından sonra ikinci bir basışı kontrol eden mantıktır. Kod, engellemeyen olacak şekilde tasarlanmıştır, yani loop() içindeki diğer görevlerin yürütülmesini duraklatmayacaktır.

Krokilerin en üstünde, zamanlama davranışını kontrol eden kullanıcı tarafından yapılandırılabilir anahtar değişkenleri bulacaksınız:

unsigned long event = 5000;// 5 saniye
unsigned long buttonPushed =0;
  • event: Bu, kritik zamanlama değişkenidir. Gecikme süresini milisaniye cinsinden ayarlar. Bu örnekte, 5 saniyeye eşit olan 5000 olarak ayarlanmıştır. Bu değeri projenizin ihtiyaçlarına uyacak şekilde başka bir süreye değiştirebilirsiniz.
  • buttonPushed: Bu değişken bir bayrak ve zaman damgası olarak kullanılır. 0 ile başlar ve butona ilk basıldığında millis() değerine güncellenir. Bu saklanan zaman daha sonra ikinci basış kontrolü için farkı hesaplamak üzere kullanılır.

loop() fonksiyonundaki mantık iki aşamada çalışır. İlk olarak, butonun durumunu okur ve ilk kez basılıyorsa (pb == LOW && buttonPushed == 0), geçerli zamanı millis() ile buttonPushed değişkenine kaydeder. İkinci aşama, butonun hâlâ basılı olup olmadığını ve ilk basışın kaydedilip kaydedilmediğini kontrol eder. Öyleyse, geçerli zaman ile ilk basış zamanı arasındaki zaman farkını hesaplar. Bu fark event zamanınıza eşit veya daha büyükse, eylemi gerçekleştirir—bu durumda Seri Monitöre bir mesaj yazdırır.

Canlı Proje Gösterimi

Videoda, kod Arduino'ya yüklenir ve davranışı gözlemlemek için Seri Monitör açılır. (Videoda 16:03'te) millis() değerinin sürekli yazdırıldığını ve programın başlangıcından bu yana geçen süreyi gösterdiğini göreceksiniz. Butona ilk kez bastığınızda, İlk basış:5019 gibi bir mesaj yazdırılır. Butona tekrar basar ve ilk basıştan itibaren 5 saniyeden fazla basılı tutarsanız, İlk basıştan 5 saniye sonra eylem mesajı yazdırılır. Bu, eylemin yalnızca belirtilen gecikme geçtikten sonra ikinci basış gerçekleştiğinde tetiklendiğini gösterir.

Bu yaklaşımın gücü, döngünün en üstündeki Serial.println(millis()) satırının kesintisiz çalışmaya devam etmesidir; bu da zamanlama mantığının diğer kodların yürütülmesini engellemediğini kanıtlar. Bu, millis() kullanmanın delay() fonksiyonuna göre temel avantajıdır.

Bu videodan ilgili projeler

Bölümler

  • [00:00] millis() ve kursa giriş
  • [01:19] millis() nedir ve neden kullanılır?
  • [03:06] İlk pratik örnek: millis() yazdırma
  • [05:46] 5 saniye sonra bir olayı tetiklemek için millis() kullanma
  • [08:29] Örnek 2: 5 saniyelik gecikmeli buton eylemi
  • [12:14] Örnek 3: Gecikmeden sonra ikinci buton basımını algılama
  • [17:20] map() fonksiyonuna giriş
  • [19:47] LED parlaklık yüzdelerini eşleme pratik örneği

Görseller

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Dil: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

Kaynaklar ve referanslar

Dosyalar📁

Kullanım Kılavuzu