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.
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 olan5000olarak 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.0ile başlar ve butona ilk basıldığındamillis()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
- Ders 14/31-1: Arduino Millis (delay'siz) ve map fonksiyonları | SunFounder Robojax
- Ders 14/31-2: Arduino millis() kodlama örneği 2, olay ile
- Ders 14/31-4: Arduino map() kodlama örneği 1
- Ders 14/31-5: Arduino map() kodlama örneği 2
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
/*
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");
}
}
}
İhtiyacın olabileceğini düşünüyor
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Kaynaklar ve referanslar
-
BelgelendirmeDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
DışPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Dosyalar📁
Kullanım Kılavuzu
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB