Mündəricat:

Millis () ilə Arduino Zamanlama Metodları: 4 Addım
Millis () ilə Arduino Zamanlama Metodları: 4 Addım

Video: Millis () ilə Arduino Zamanlama Metodları: 4 Addım

Video: Millis () ilə Arduino Zamanlama Metodları: 4 Addım
Video: VL53L1X Uçuş Süresi 400cm Lazer mesafe sensörü 2024, Iyul
Anonim
Millis ilə Arduino Zamanlama Metodları ()
Millis ilə Arduino Zamanlama Metodları ()

Bu yazıda millis () təqdim edirik; funksiyasını yerinə yetirin və müxtəlif vaxt nümunələri yaratmaq üçün istifadə edin.

Millis? Dodaq sinxronizatorları ilə heç bir əlaqəniz yoxdur … inşallah milli mininin üçünün ədədi prefiksi olaraq tanıdınız; ölçü vahidini 0,001 (və ya on mənfi 3 -ə qədər) vurmaqdır.

Maraqlıdır ki, Arduino sistemlərimiz, eskizin başlanğıcından başlayaraq, işarəsiz uzun müddətdə (32 bit [dörd bayt] ədəd -sıfırdan (2^32) -1-ə qədər dəyişir. (2^32) -1 və ya 4294967295 millisaniyə 49.71027-tək günə çevrilir.

Arduino sıfırlandıqda sayğac sıfırlanır, maksimum dəyərə çatır və ya yeni bir eskiz yüklənir. Müəyyən bir nöqtədə sayğacın dəyərini əldə etmək üçün sadəcə funksiyaya zəng edin - məsələn:

başlanğıc = millis ();

Harada başlanğıc işarəsiz uzun bir dəyişkəndir. Millis () in fəaliyyətdə olduğunu göstərmək üçün çox sadə bir nümunə:

/ * millis () nümayiş */

imzasız uzun başlanğıc, bitmiş, keçən;

boş quraşdırma ()

{Serial.begin (9600); }

boşluq döngəsi ()

{Serial.println ("Başla…"); start = millis (); gecikmə (1000); bitmiş = millis (); Serial.println ("Bitdi"); keçdi = bitmiş başlanğıc; Serial.çap (keçən); Serial.println ("milisaniyələr keçdi"); Serial.println (); gecikmə (500); }

Eskiz, mövcud millis sayını əvvəlində saxlayır, sonra bir saniyə gözləyir, sonra millinin dəyərini yenidən bitmiş vəziyyətdə saxlayır. Nəhayət, gecikmənin keçən vaxtını hesablayır. Serial monitorun aşağıdakı ekran boşluğunda, görüntüdə göstərildiyi kimi müddətin həmişə tam olaraq 1000 millisaniyə olmadığını görə bilərsiniz.

Addım 1:

Şəkil
Şəkil

Sadə dillə desək, millis funksiyası Arduino'nuzun mərkəzindəki ATmega mikrokontrolöründəki daxili sayğacdan istifadə edir. Bu sayğac 16 Mhz bir saat sürətində (standart Arduino və uyğunluqlarda) baş verən hər saat dövrünü artırır. Bu sürət Arduino lövhəsindəki kristal tərəfindən idarə olunur (üzərində T16.000 möhürü olan gümüş şey).

Addım 2:

Şəkil
Şəkil

Kristal dəqiqliyi xarici temperaturdan və kristalın tolerantlığından asılı olaraq dəyişə bilər. Bu da öz növbəsində millis nəticənizin düzgünlüyünə təsir edəcək. Anekdot təcrübəsi, vaxt dəqiqliyindəki sürüşmənin iyirmi dörd saat müddətində təxminən üç və ya dörd saniyə ola biləcəyini bildirdi.

Kristal yerinə bir keramika rezonatoru istifadə edən bir lövhə və ya öz versiyanızdan istifadə edirsinizsə, bunların o qədər də dəqiq olmadığını və yüksək sürüşmə səviyyəsi ehtimalını təqdim edəcəyini unutmayın. Zamanlama dəqiqliyinə daha yüksək səviyyədə ehtiyacınız varsa, Maxim DS3231 kimi xüsusi taymer IC -lərini nəzərdən keçirin.

İndi müxtəlif vaxt funksiyaları üçün millisdən istifadə edə bilərik. Əvvəlki nümunə eskizdə göstərildiyi kimi, keçən vaxtı hesablaya bilərik. Bu fikri irəli sürmək üçün sadə bir saniyəölçən hazırlayaq. Bunu etmək lazım olduğu qədər sadə və ya mürəkkəb ola bilər, amma bu vəziyyətdə sadəliyə doğru irəliləyəcəyik.

Avadanlıq baxımından, 2 düyməyə sahib olacağıq-Başlat və Dur-müvafiq olaraq rəqəmsal sancaqlar 2 və 3-ə qoşulan 10k ohm açılan rezistorlar. İstifadəçi basmağa başladıqda eskiz milis dəyərini qeyd edəcək - dayanma düyməsini basdıqdan sonra eskiz yenidən millinin dəyərini qeyd edəcək, keçən vaxtı hesablayacaq və göstərəcək. İstifadəçi sonra prosesi təkrarlamaq və ya yenilənmiş məlumatlar üçün dayandırmaq üçün start düyməsini basa bilər. İşdə eskiz:

/* Millis () istifadə edərək super əsas saniyəölçən; */

imzasız uzun başlanğıc, bitmiş, keçən;

boş quraşdırma ()

{Serial.begin (9600); pinMode (2, GİRİŞ); // başlanğıc düyməsi pinMode (3, GİRİŞ); // dayandır düyməsi Serial.println ("Başlat/sıfırla üçün 1, keçən müddət üçün 2 düyməsini basın"); }

void displayResult ()

{float h, m, s, ms; uzun müddət imzasız; keçən = bitmiş başlanğıc; h = int (keçən/3600000); artıq = keçən%3600000; m = int (60000 -dən çox); artıq =%60000 -dən çox; s = int (1000 -dən çox); ms =%1000 -dən çox; Serial.print ("Ham bitmiş vaxt:"); Serial.println (keçən); Serial.print ("Keçən vaxt:"); Serial. çap (h, 0); Serial.print ("h"); Serial çapı (m, 0); Serial.print ("m"); Serial.çap (lar, 0); Serial.print ("s"); Serial. çap (ms, 0); Serial.println ("ms"); Serial.println (); }

boşluq döngəsi ()

{if (digitalRead (2) == HIGH) {start = millis (); gecikmə (200); // çıxarmaq üçün Serial.println ("Başladı…"); } if (digitalRead (3) == YÜKSEK) {bitmiş = millis (); gecikmə (200); // çıxarmaq üçün displayResult (); }}

Gecikmə () zəngləri açarları ləğv etmək üçün istifadə olunur - bunlar isteğe bağlıdır və onlardan istifadə aparatınızdan asılı olacaq. Şəkil, eskizin ardıcıl monitor çıxışına bir nümunədir - saniyəölçən işə başladı və sonra iki düyməyə vaxt ərzində altı dəfə basıldı.

Addım 3: Sürətölçən…

Image
Image

Sabit bir məsafənin əvvəlində və sonunda bir sensörünüz varsa, sürət hesablana bilər: sürət = məsafə ÷ vaxt.

Təkərli bir hərəkət forması üçün bir sürətölçən də edə bilərsiniz, məsələn velosiped. Hal -hazırda qarışa biləcəyimiz bir velosipedimiz yoxdur, ancaq bunu etmək üçün prosesi təsvir edə bilərik - bu olduqca sadədir. (İmtina etmə - bunu öz riski və s.)

Əvvəlcə lazım olan riyazi məlumatları nəzərdən keçirək. Təkərin ətrafını bilməlisiniz. Avadanlıq - bir sensora ehtiyacınız olacaq. Məsələn - qamış açarı və maqnit. Qamış açarını normal olaraq açılan bir düymə hesab edin və hər zamanki kimi 10k ohm açılan rezistorla bağlayın.

Digərləri, hər biri özünəməxsus bir zal effekti sensoru istifadə edə bilər). Dairəni hesablamaq üçün riyaziyyat dərsindən yadda saxla - düsturu istifadə edin: dairə = 2πr burada r dairənin radiusudur.

İndi təkər çevrəsinə sahib olduğunuz üçün bu dəyər "sabit məsafəmiz" olaraq qəbul edilə bilər və buna görə də sürət tam fırlanma arasında keçən vaxtı ölçməklə hesablana bilər.

Sensorunuz-bir dəfə quraşdırıldıqda-hər dəfə döndərilən normal açılan düymə ilə eyni üsulla hərəkət etməlidir. Eskizimiz sensordan gələn hər nəbz arasında keçən vaxtı ölçəcək.

Bunu etmək üçün, nümunəmizdə rəqəmsal pin 2 -ə bağlı sensor çıxışı olacaq - çünki bu, sürəti hesablamaq üçün bir fasilə verəcəkdir. Eskiz, əks halda sürəti normal bir I2C interfeysli LCD modulunda göstərəcək. I2C interfeysi təklif olunur, çünki bunun üçün Arduino lövhəsindən LCD -yə cəmi 4 tel lazımdır - nə qədər az tel bir o qədər yaxşıdır.

Baxışınızın eskizi budur:

/*Millis () istifadə edərək əsas sürətölçən; */

#I2C avtobus LCD üçün "Wire.h" // daxil edin

#I2C avtobus LCD modulu üçün "LiquidCrystal_I2C.h" daxil edin - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 simvol və 2 sətirli ekran üçün LCD ünvanını 0x27 olaraq təyin edin

üzən başlanğıc, bitmiş;

üzən vaxt keçdi; float circMetric = 1.2; // sensorun mövqeyinə görə təkər çevrəsi (metrlərlə) float circImperial; // 1 kilometrdən istifadə etməklə = 0.621371192 mil üzmək speedk, speedm; // metrik və imperiya hesablanmış sürət vallarını saxlayır

boş quraşdırma ()

{attachInterrupt (0, speedCalc, RISING); // sensorlar rəqəmsal 2 yüksək (hər təkər fırlanmasında) start = millis () göndərdikdə çağırılan kəsmə; // LCD lcd.init () qurmaq; // lcd lcd.backlight () işə salın; // LCD arxa işığı yandırın lcd.clear (); lcd.println ("Dəbilqə geyin!"); gecikmə (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // MPH hesablamaları üçün metrikanı imperiyaya çevirmək}

boş sürətCalc ()

{elapsed = millis ()-başlanğıc; start = millis (); speedk = (3600*circMetric)/keçən; // km/saat sürət m = (3600*circImperial)/keçən; // Saatda mil}

boşluq döngəsi ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/saat"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (keçən)); lcd.print ("ms/rev"); gecikmə (1000); // titrəməni minimuma endirmək üçün şəxsi seçiminizi tənzimləyin}

O qədər də çox şey yoxdur - təkər hər dəfə bir inqilabı tamamladıqda sensordan gələn siqnal aşağıdan yuxarıya doğru gedəcək - speedCalc () funksiyasını çağıran bir kəsilməyə səbəb olur.

Bu milis () oxunuşunu alır və sonra indiki oxunuşla əvvəlki oxunuş arasındakı fərqi hesablayır - bu dəyər məsafəni qət etmək vaxtıdır (bu sensora nisbətən təkərin dairəsi - saxlanılır)

float circMetric = 1.2;

və metrlə ölçülür). Nəhayət sürəti km/saat və MPH ilə hesablayır. Fasilələr arasında eskiz, LCD -də yenilənmiş sürət məlumatlarını və maraq naminə hər bir inqilab üçün xam vaxt dəyərini əks etdirir. Real həyatda heç kimin velosipedə LCD taxacağını düşünmürəm, bəlkə də LED displey daha aktual olardı.

Bu arada, bu nümunənin necə işlədiyini aşağıdakı qısa video klipdə görə bilərsiniz. Velosiped təkəri və qamış açarı/maqnit birləşməsi əvəzinə, sensordan gələn impulsları simulyasiya etmək üçün bir funksiya generatorundan kvadrat dalğa çıxışını kəsmə pininə bağladım, bunun necə işlədiyini anlaya bilərsiniz.

Addım 4:

Hələlik millis () istifadəsini yekunlaşdırır. Mikro () da var; mikrosaniyələri sayan funksiyadır.

Arduino dünyası ilə daha çox problemin həllinə imkan verən başqa bir praktik funksiya var. Həmişə olduğu kimi, indi idarə etmək üçün bir şey tapmaq və ya digər çirkin insanlarla ünsiyyət qurmaq sizə və xəyalınıza bağlıdır.

Bu yazı pmdway.com tərəfindən sizə gətirildi - istehsalçılar və elektronika həvəskarları üçün hər şey, bütün dünyada pulsuz çatdırılma.

Tövsiyə: