Kod Ara

Ders 14/31-2: Arduino kodlama millis() örneği 2 etkinlikle

Ders 14/31-2: Arduino kodlama millis() örneği 2 etkinlikle

Bu eğitimde, Arduino millis() fonksiyonunu kullanarak, programınızın geri kalanını engellemeden yalnızca belirli bir süre geçtikten sonra bir eylemi tetiklemeyi öğreneceksiniz. Bu, LED'leri yakıp söndürürken sensörleri okuma veya buton basışlarını izleme gibi birden fazla görevin aynı anda çalışması gereken duyarlı Arduino projeleri oluşturmak için temel bir tekniktir. Bu özel örnek, beş saniye sonra bir olayı tetiklemeye odaklanır, ancak mantık sayısız gerçek dünya senaryosuna uygulanabilir.

Monte edilmiş Sunfounder araba

Kendi projelerinizde bu deseni nasıl kullanabileceğinize dair birkaç pratik örnek:

  • Gecikmeli aktivasyon: Bir sistemi belirli bir süre çalıştırdıktan sonra yalnızca bir fanı veya pompayı açın.
  • Güvenlik kilitleri: Bir motoru çalıştırmak gibi tehlikeli bir eylem gerçekleştirmeden önce bir butona belirli bir süre basılı tutulmasını gerektirin.
  • Zamana dayalı uyarılar: Bir sensör okuması belirli bir süre içinde değişmezse bir alarm veya bildirim tetikleyin.
  • Engellemeyen zamanlayıcılar: Cihaz yanıt vermezse sıfırlayan bir "bekçi" zamanlayıcı oluşturun.

Bunun çözdüğü temel sorun, delay() fonksiyonunun sınırlamasıdır. delay(5000) kullandığınızda, Arduino bu beş saniye boyunca başka hiçbir kodu çalıştırmayı durdurur. Bu basit çizimler için iyidir, ancak beklerken sensörleri okumanız, ekranları güncellemeniz veya buton basışlarını dinlemeniz gereken daha karmaşık projelerde büyük bir sorun haline gelir. Kartın açılışından bu yana geçen milisaniyeleri sayan millis() fonksiyonu, programı duraklatmadan zamanı kontrol etmenizi sağlar.

Gerekli Donanım

  • Arduino kartı (Uno, Nano, Mega vb.)
  • Bir buton
  • Jumper kablolar

Bağlantı Kılavuzu

Bu örnek için bağlantı çok basittir. Dahili pull-up direnci kullanır, bu nedenle buton için harici bir direnç gerekmez.

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

Kodda INPUT_PULLUP kullandığımız için, butona basılmadığında pin HIGH, basıldığında ise pini toprağa bağlayarak LOW okuyacaktır. (videoda 08:29'da)

Kodu Anlama

Bu kod, basit bir olay tabanlı zamanlayıcıyı gösterir. Program, geçerli millis() değerini sürekli olarak Seri Monitöre yazdırır. Butona basılı tutulduğunda ve Arduino en az 5 saniyedir çalışıyorsa, Seri Monitöre "Take action" yazdırır. Anahtar nokta, millis() kontrolünün zamanın sürekli yazdırılmasını durdurmamasıdır.

Kodun kullanıcı tarafından yapılandırılabilir kısımlarını inceleyelim:

unsigned long event = 5000;// 5 saniye

Bu, yapılandırılacak en önemli değişkendir. "Olayınızın" süresini milisaniye cinsinden tanımlar. Bu örnekte, 5 saniyeye eşit olan 5000 olarak ayarlanmıştır. Gecikmeyi değiştirmek için bu sayıyı değiştirmeniz yeterlidir. Örneğin, 10000 olarak ayarlamak eylemin 10 saniye sonra tetiklenmesini sağlar. unsigned long veri türünü kullanmak çok önemlidir, çünkü millis() değeri çok büyüyebilir ve sonunda standart bir int değişkeninin maksimum değerini aşarak karşılaştırmalarda hatalara neden olabilir. (videoda 05:46'da)

pinMode(2,INPUT_PULLUP);

Bu satır, dijital pin 2'yi giriş olarak yapılandırır ve dahili pull-up direncini etkinleştirir. Bu, harici bir direnç olmadan bir buton bağlamanıza olanak tanıyan önemli bir yapılandırma adımıdır. Pin varsayılan olarak HIGH okuyacak ve butona basıldığında toprağa bağlanarak LOW olacaktır. Farklı bir pin kullanmak istiyorsanız, buradaki 2 sayısını ve döngü içindeki digitalRead(2) satırındaki sayıyı değiştirin. (videoda 08:46'da)

loop() içindeki mantık basittir. Butonun durumunu okur. Butona basılıysa (pb == LOW), geçerli zamanın (millis()) tanımladığınız event süresinden büyük veya eşit olup olmadığını kontrol eder. Her iki koşul da doğruysa, eylem mesajını yazdırır. Döngünün zamanı yazdıran geri kalanı kesintisiz çalışmaya devam eder ve millis()'in delay() üzerindeki gücünü gösterir.

Bu örnek, zamanı Arduino'nun başladığı andan itibaren kontrol eder. Video serisindeki üçüncü örnek, ilk buton basışının zamanını kaydederek ve yalnızca ikinci bir basış en az 5 saniye sonra gerçekleşirse bir eylemi tetikleyerek bunun üzerine inşa eder. Bu mantık Ders 14/31-3: Arduino kodlama millis() örnek 3 buton ile bölümünde ele alınmıştır.

Canlı Proje Gösterimi

Kodu yükledikten ve Seri Monitörü (9600 baud) açtıktan sonra, kartın açılışından bu yana geçen milisaniyeleri temsil eden sürekli bir sayı akışı göreceksiniz. 5 saniye geçmeden butona basılı tutarsanız, hiçbir şey olmayacaktır. Ancak, 5 saniyelik işaretten sonra butona basılı tutarsanız, Seri Monitörde "Take action" mesajının yazdırıldığını göreceksiniz. Buton basılı tutulduğu sürece eylem yazdırılmaya devam edecektir. Bu, diğer kodun (yazdırma) sorunsuz çalışmasına izin veren engellemeyen bir zamanlayıcıyı gösterir. (videoda 10:52'de)

Bu videoyla ilgili projeler

Bu video, Arduino zamanlama ve eşleme fonksiyonları üzerine çok parçalı bir serinin parçasıdır. Aynı kaynak materyalden oluşturulan diğer eğitimleri keşfedin:

Bölümler

  • [00:00] millis() ve SunFounder Kiti'ne giriş
  • [01:19] millis() nedir ve neden delay() yerine kullanılmalı?
  • [03:06] Pratik gösterim: millis() değerini yazdırma
  • [05:46] millis() ve unsigned long ile bir olay oluşturma
  • [08:29] INPUT_PULLUP ile bir butonun bağlanması ve kodlanması
  • [10:52] Butonla olay örneğini çalıştırma
  • [12:14] Örnek 3'e önizleme: ikinci buton basışını algılama
  • [17:20] map() fonksiyonuna giriş
  • [19:47] map() fonksiyonunu bir LED ile kodlama ve gösterme

Görseller

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Dil: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
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
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

Kaynaklar ve referanslar

Dosyalar📁

Kullanım Kılavuzu