İçindekiler:

Millis() ile Arduino Zamanlama Yöntemleri: 4 Adım
Millis() ile Arduino Zamanlama Yöntemleri: 4 Adım

Video: Millis() ile Arduino Zamanlama Yöntemleri: 4 Adım

Video: Millis() ile Arduino Zamanlama Yöntemleri: 4 Adım
Video: DERS 11: Arduino ile Ultrasonik Mesafe Sensörü - HCSR 04 Çalıştırma 2024, Temmuz
Anonim
Millis() ile Arduino Zamanlama Yöntemleri
Millis() ile Arduino Zamanlama Yöntemleri

Bu yazıda millis(); işlev ve çeşitli zamanlama örnekleri oluşturmak için kullanın.

Milliler? Dudak eşleyicilerle alakası yok… umarım milli'nin binde bir için sayısal önek olduğunu fark etmişsinizdir; bu, bir ölçü birimini 0,001 (veya on üzeri eksi 3'ün kuvveti) ile çarpmaktır.

İlginç bir şekilde Arduino sistemlerimiz, bir çizimin başlangıcından sayım, unsigned long (32 bit [dört bayt] tamsayı) değişken türünde saklanabilecek maksimum sayıya ulaşana kadar milisaniye (bin saniye) sayısını sayacaktır. – sıfırdan (2^32)-1'e (2^32)-1 veya 4294967295 milisaniye, 49.71027-tek güne dönüştürür.

Arduino sıfırlandığında sayaç sıfırlanır, maksimum değere ulaşır veya yeni bir çizim yüklenir. Belirli bir noktada sayacın değerini almak için işlevi çağırmanız yeterlidir – örneğin:

başlat=milis();

start, işaretsiz bir uzun değişkendir. İşte size millis()'i çalışırken gösteren çok basit bir örnek:

/* millis() gösterimi */

imzasız uzun başlangıç, bitmiş, geçmiş;

geçersiz kurulum()

{ Serial.başlangıç(9600); }

boşluk döngüsü()

{ Serial.println("Başlat…"); start=milis(); gecikme(1000); bitmiş=milis(); Serial.println("Bitti"); geçen=bitmiş-başlangıç; Serial.print(geçen); Serial.println("milisaniye geçti"); Seri.println(); gecikme(500); }

Çizim, başlangıçtaki geçerli milis sayısını saklar, ardından bir saniye bekler, ardından milis değerini tekrar bitmiş olarak saklar. Son olarak gecikmenin geçen süresini hesaplar. Seri monitörün aşağıdaki ekran dökümünde, sürenin resimde gösterildiği gibi her zaman tam olarak 1000 milisaniye olmadığını görebilirsiniz.

Aşama 1:

resim
resim

Basitçe söylemek gerekirse, millis işlevi, Arduino'nuzun kalbindeki ATmega mikro denetleyicisinde dahili bir sayacı kullanır. Bu sayaç, (standart Arduino ve uyumlu modellerde) 16 Mhz saat hızında gerçekleşen her saat döngüsünü artırır. Bu hız, Arduino kartındaki kristal tarafından kontrol edilir (üzerinde T16.000 damgalı gümüş şey).

Adım 2:

resim
resim

Kristal doğruluğu, dış sıcaklığa ve kristalin toleransına bağlı olarak değişebilir. Bu da milis sonucunuzun doğruluğunu etkileyecektir. Anekdot deneyimi, zamanlama doğruluğundaki kaymanın yirmi dört saatlik periyot başına yaklaşık üç veya dört saniye olabileceğini bildirmiştir.

Kristal yerine seramik rezonatör kullanan bir tahta veya kendi sürümünüzü kullanıyorsanız, bunların o kadar doğru olmadığını ve daha yüksek kayma seviyeleri olasılığını ortaya çıkaracağını unutmayın. Çok daha yüksek bir zamanlama doğruluğuna ihtiyacınız varsa, Maxim DS3231 gibi belirli zamanlayıcı IC'lerini düşünün.

Şimdi çeşitli zamanlama işlevleri için millis'i kullanabiliriz. Önceki örnek çizimde gösterildiği gibi, geçen süreyi hesaplayabiliriz. Bu fikri ileriye taşımak için basit bir kronometre yapalım. Bunu yapmak gerektiği kadar basit veya karmaşık olabilir, ancak bu durumda basite yöneleceğiz.

Donanım perspektifinde, sırasıyla dijital pin 2 ve 3'e bağlı 10k ohm aşağı çekme dirençleri ile Start ve Stop olmak üzere iki düğmemiz olacak. Kullanıcı başlat düğmesine bastığında, taslak milis değerini not edecektir – ardından durdurmaya basıldıktan sonra, taslak tekrar milis değerini not edecek, geçen süreyi hesaplayacak ve gösterecektir. Kullanıcı daha sonra işlemi tekrarlamak için başlat düğmesine basabilir veya güncellenmiş veriler için durabilir. İşte taslak:

/* millis() kullanan süper basit kronometre; */

imzasız uzun başlangıç, bitmiş, geçmiş;

geçersiz kurulum()

{ Serial.başlangıç(9600); pinMode(2, GİRİŞ); // start butonu pinMode(3, INPUT); // stop butonu Serial.println("Başlatma/Sıfırlama için 1'e, geçen süre için 2'ye basın"); }

geçersiz görüntülemeSonuç()

{ kayan h, m, s, ms; uzun zamandır imzasız; geçen=bitmiş-başlangıç; h=int(geçen/3600000); fazla=geçen%3600000; m=int(/60000 üzeri); fazla=%60000'den fazla; s=int(üzerinde/1000); ms=%1000'in üzerinde; Serial.print("Ham geçen süre: "); Serial.println(geçen); Serial.print("Geçen süre: "); Seri.baskı(h, 0); Seri.print("h"); Seri.baskı(m, 0); Seri.print("m"); Seri.baskı(lar, 0); Seri.print("s"); Seri.baskı(ms, 0); Serial.println("ms"); Seri.println(); }

boşluk döngüsü()

{ if (digitalRead(2)==HIGH) { start=millis(); gecikme(200); // geri dönme için Serial.println("Başladı…"); } if (digitalRead(3)==HIGH) { bitmiş=millis(); gecikme(200); // geri dönme için displayResult(); } }

Delay() çağrıları, anahtarları devre dışı bırakmak için kullanılır - bunlar isteğe bağlıdır ve kullanımları donanımınıza bağlı olacaktır. Görüntü, çizimin seri monitör çıkışının bir örneğidir - kronometre başladı ve ardından iki düğmeye altı kez basıldı.

Adım 3: Hız göstergesi…

Image
Image

Sabit bir mesafenin başında ve sonunda bir sensörünüz varsa, hız hesaplanabilir: hız = mesafe ÷ zaman.

Bisiklet gibi tekerlekli bir hareket şekli için bir hız göstergesi de yapabilirsiniz. Şu anda uğraşacak bir bisikletimiz yok, ancak bunu yapmak için süreci tanımlayabiliriz - oldukça basit. (Feragatname – riski size ait olmak üzere yapın vb.)

Öncelikle gerekli matematiği gözden geçirelim. Tekerleğin çevresini bilmeniz gerekecek. Donanım – bir sensöre ihtiyacınız olacak. Örneğin – bir kamış anahtarı ve mıknatıs. Kamış anahtarı normalde açık bir düğme olarak düşünün ve her zamanki gibi 10k ohm'luk bir aşağı çekme direnci ile bağlayın.

Diğerleri bir salon efekt sensörü kullanabilir - her biri kendi başına). Çevreyi hesaplamak için matematik dersinden hatırlayın – şu formülü kullanın: çevre = 2πr burada r dairenin yarıçapıdır.

Artık tekerlek çevresine sahip olduğunuza göre, bu değer bizim 'sabit mesafemiz' olarak kabul edilebilir ve bu nedenle bir tam dönüş arasında geçen süre ölçülerek hız hesaplanabilir.

Sensörünüz – bir kez takıldığında – her dönüşte basılan normalde açık bir düğmeyle aynı yöntemle hareket etmelidir. Çizimimiz, sensörden gelen her darbe arasında geçen süreyi ölçecektir.

Bunu yapmak için örneğimizde sensör çıkışı dijital pin 2'ye bağlı olacaktır - çünkü hızı hesaplamak için bir kesmeyi tetikleyecektir. Çizim aksi takdirde hızı normal bir I2C arayüzü LCD modülünde görüntüleyecektir. I2C arayüzü, Arduino kartından LCD'ye sadece 4 kablo gerektirdiğinden önerilir - ne kadar az kablo o kadar iyi.

İşte incelemeniz için taslak:

/*Millis() kullanan temel hız göstergesi; */

#include "Wire.h" // I2C veri yolu LCD için

#include "LiquidCrystal_I2C.h" // I2C veri yolu LCD modülü için - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd(0x27, 16, 2); // 16 karakter ve 2 satırlık bir ekran için LCD adresini 0x27 olarak ayarlayın

şamandıra başlangıç, bitmiş;

geçen şamandıra, zaman; kayan daireMetrik=1.2; // sensör konumuna göre tekerlek çevresi (metre olarak) float circImperial; // 1 kilometre kullanarak = 0.621371192 mil float speedk, speedm; // metrik ve emperyal olarak hesaplanan hız değerlerini tutar

geçersiz kurulum()

{ AttachInterrupt(0, speedCalc, YÜKSELEN); // sensörler dijital 2 yüksek (her tekerlek dönüşü) gönderdiğinde çağrılır start=millis(); // LCD lcd.init() kurulumu; // lcd lcd.backlight()'ı başlat; // LCD arka ışığını aç lcd.clear(); lcd.println("Kask giyin!"); gecikme(3000); lcd.clear(); Seri.başla(115200); circImperial=circMetric*.62137; // MPH hesaplamaları için metriği imparatorluğa çevir }

geçersiz hızCalc()

{ geçen=milis()-başlangıç; start=milis(); speedk=(3600*circMetric)/geçen; // km/h hızm=(3600*circImperial)/geçen; // Saatte mil }

boşluk döngüsü()

{ lcd.setCursor(0, 0); lcd.print(int(hızk)); lcd.print("km/s"); lcd.print(int(hızm)); lcd.print("MPH"); lcd.setCursor(0, 1); lcd.print(int(geçen)); lcd.print("ms/devir"); gecikme(1000); // titremeyi en aza indirmek için kişisel tercihe göre ayarlayın }

O kadar fazla bir şey olmaz – tekerlek bir dönüşü her tamamladığında sensörden gelen sinyal düşükten yükseğe gidecek ve speedCalc() işlevini çağıran bir kesmeyi tetikleyecektir.

Bu, millis() okumasını alır ve ardından mevcut okuma ile önceki okuma arasındaki farkı hesaplar - bu değer, mesafeyi kat etme süresi olur (bu, sensöre göre tekerleğin çevresidir -

kayan daireMetrik=1.2;

ve metre cinsinden ölçülür). Son olarak hızı km/sa ve MPH olarak hesaplar. Kesintiler arasında çizim, LCD'de güncellenmiş hız verilerini ve ayrıca merak için her devir için ham zaman değerini görüntüler. Gerçek hayatta kimsenin bir LCD'yi bisiklete monte edeceğini sanmıyorum, belki bir LED ekran daha alakalı olurdu.

Bu arada aşağıdaki kısa video klipte bu örneğin nasıl çalıştığını görebilirsiniz. Bir bisiklet tekerleği ve manyetik anahtar/mıknatıs kombinasyonu yerine, sensörden gelen darbeleri simüle etmek için bir fonksiyon üretecinden kare dalga çıkışını kesme pimine bağladım, böylece nasıl çalıştığı hakkında bir fikir edinebilirsiniz.

4. Adım:

Bu hemen hemen şu an için millis() kullanımını özetliyor. Ayrıca micros(); mikrosaniye sayan fonksiyon.

İşte karşınızda – Arduino dünyası aracılığıyla daha fazla problemin çözülmesine izin verebilecek başka bir pratik fonksiyon. Her zaman olduğu gibi, şimdi kontrol edecek bir şey bulmak veya diğer maskaralıklara karşı çıkmak size ve hayal gücünüze kalmış.

Bu gönderi size pmdway.com tarafından getirildi - dünya çapında ücretsiz teslimat ile üreticiler ve elektronik meraklıları için her şey.

Önerilen: