Satura rādītājs:

Arduino laika noteikšanas metodes ar Millis (): 4 soļi
Arduino laika noteikšanas metodes ar Millis (): 4 soļi

Video: Arduino laika noteikšanas metodes ar Millis (): 4 soļi

Video: Arduino laika noteikšanas metodes ar Millis (): 4 soļi
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Novembris
Anonim
Arduino laika noteikšanas metodes ar Millis ()
Arduino laika noteikšanas metodes ar Millis ()

Šajā rakstā mēs iepazīstinām ar milis (); funkciju un izmantojiet to, lai izveidotu dažādus laika piemērus.

Millis? Nav nekāda sakara ar lūpu sineceriem … cerams, ka jūs atpazījāt mili par tūkstošdaļu skaitlisko prefiksu; kas reizina mērvienību ar 0,001 (vai desmit līdz negatīvās 3 pakāpei).

Interesanti, ka mūsu Arduino sistēmas saskaitīs milisekundes (tūkstošus sekundes) no skices sākuma līdz skaitīšanas beigām, sasniedzot maksimālo skaitu, ko var uzglabāt mainīgā tipa neparakstītā garumā (32 bitu [četru baitu] vesels skaitlis) -kas svārstās no nulles līdz (2^32) -1. (2^32) -1 jeb 4294967295 milisekundes pārvērš par nepāra dienām 49,71027.

Skaitītājs tiek atiestatīts, kad Arduino tiek atiestatīts, tas sasniedz maksimālo vērtību vai tiek augšupielādēta jauna skice. Lai noteiktu skaitītāja vērtību noteiktā brīdī, vienkārši izsauciet funkciju - piemēram:

sākums = milis ();

Kur sākums ir neparakstīts garš mainīgais. Šeit ir ļoti vienkāršs piemērs, lai parādītu milis () darbību:

/ * milis () demonstrācija */

neparakstīts garš starts, pabeigts, pagājis;

anulēts iestatījums ()

{Sērijas sākums (9600); }

tukša cilpa ()

{Serial.println ("Sākt…"); sākums = milis (); kavēšanās (1000); pabeigts = milis (); Serial.println ("Pabeigts"); pagājušais = pabeigts-starts; Sērijas nospiedums (pagājis); Serial.println ("pagājušas milisekundes"); Sērijas.println (); kavēšanās (500); }

Skice sākumā saglabā pašreizējo milis skaitli, pēc tam nogaida vienu sekundi, pēc tam vēlreiz saglabā milis vērtību pabeigtajā. Visbeidzot, tas aprēķina aizkavēšanās laiku. Nākamajā sērijas monitora ekrāna izgāztuvē varat redzēt, ka ilgums ne vienmēr bija precīzi 1000 milisekundes, kā parādīts attēlā.

1. darbība:

Attēls
Attēls

Vienkārši sakot, millis funkcija izmanto iekšējo skaitītāju ATmega mikrokontrollerī jūsu Arduino centrā. Šis skaitītājs palielinās katru pulksteņa ciklu - kas notiek (standarta Arduino un saderīgos) ar 16 Mhz pulksteņa ātrumu. Šo ātrumu kontrolē kristāls uz Arduino tāfeles (sudraba lieta ar T16.000 zīmogu).

2. darbība:

Attēls
Attēls

Kristāla precizitāte var mainīties atkarībā no ārējās temperatūras un paša kristāla pielaides. Tas savukārt ietekmēs jūsu milis rezultātu precizitāti. Anekdotiskā pieredze liecina, ka laika precizitātes novirze var būt aptuveni trīs vai četras sekundes divdesmit četru stundu periodā.

Ja izmantojat tāfeli vai savu versiju, kurā kristāla vietā tiek izmantots keramikas rezonators, ņemiet vērā, ka tie nav tik precīzi un radīs iespēju augstākam dreifam. Ja jums ir nepieciešams daudz augstāks laika precizitātes līmenis, apsveriet īpašus taimera IC, piemēram, Maxim DS3231.

Tagad miltus varam izmantot dažādām laika funkcijām. Kā parādīts iepriekšējā skices piemērā, mēs varam aprēķināt pagājušo laiku. Lai turpinātu šo ideju, izveidosim vienkāršu hronometru. Tas var būt tik vienkārši vai tik sarežģīti, cik nepieciešams, taču šajā gadījumā mēs pievērsīsimies vienkāršam.

No aparatūras viedokļa mums būs divas pogas-Sākt un Apturēt-ar 10k omu nolaižamajiem rezistoriem, kas savienoti attiecīgi ar 2. un 3. ciparu tapām. Kad lietotājs nospiež sākuma skici, skice atzīmēs milis vērtību - pēc tam, kad ir nospiesta stop, skice atkal atzīmēs milis vērtību, aprēķinās un parādīs pagājušo laiku. Pēc tam lietotājs var nospiest sākuma pogu, lai atkārtotu procesu, vai apstāties, lai iegūtu atjauninātus datus. Šeit ir skice:

/* Super-pamata hronometrs, izmantojot milis (); */

neparakstīts garš starts, pabeigts, pagājis;

anulēts iestatījums ()

{Sērijas sākums (9600); pinMode (2, INPUT); // sākuma poga pinMode (3, INPUT); // apturēšanas poga Serial.println ("Nospiediet 1, lai sāktu/atiestatītu, 2 - pagājušo laiku"); }

tukšs displejsResult ()

{peldēt h, m, s, ms; neparakstīts ilgi; pagājušais = pabeigts-starts; h = int (pagājis/3600000); virs = pagājis%3600000; m = int (virs/60000); vairāk nekā virs%60000; s = int (virs/1000); ms = vairāk nekā%1000; Serial.print ("Neapstrādāts laiks:"); Serial.println (pagājis); Serial.print ("Pagājušais laiks:"); Sērijas nospiedums (h, 0); Sērijas nospiedums ("h"); Sērijas nospiedums (m, 0); Sērijas nospiedums ("m"); Sērijas nospiedums (s, 0); Serial.print ("s"); Sērijas nospiedums (ms, 0); Serial.println ("ms"); Sērijas.println (); }

tukša cilpa ()

{if (digitalRead (2) == HIGH) {start = milis (); kavēšanās (200); // debounce Serial.println ("Sākts …"); } ja (digitalRead (3) == HIGH) {pabeigts = milis (); kavēšanās (200); // debounce displayResult (); }}

Zvani aizkavēt () tiek izmantoti, lai izslēgtu slēdžus - tie nav obligāti, un to izmantošana būs atkarīga no jūsu aparatūras. Attēls ir skices sērijveida monitora izvades piemērs - hronometrs ir iedarbinājies, un pēc tam otrā poga sešas reizes tiek nospiesta laika periodā.

3. darbība: spidometrs…

Image
Image

Ja jums būtu sensors noteiktā attāluma sākumā un beigās, ātrumu varētu aprēķināt: ātrums = attālums ÷ laiks.

Varat arī izveidot spidometru kustībai ar riteņiem, piemēram, velosipēdu. Pašlaik mums nav velosipēda, ar ko sajaukt, tomēr mēs varam aprakstīt tā veikšanas procesu - tas ir pavisam vienkārši. (Atruna - dariet to uz savu risku utt.)

Pirmkārt, pārskatīsim nepieciešamo matemātiku. Jums jāzina riteņa apkārtmērs. Aparatūra - jums būs nepieciešams sensors. Piemēram - niedru slēdzis un magnēts. Uzskata, ka niedru slēdzis ir parasti atvērta poga, un pievienojiet kā parasti ar 10k omu nolaižamo rezistoru.

Citi var izmantot zāles efekta sensoru-katrs savu). Atcerieties no matemātikas klases, lai aprēķinātu apkārtmēru - izmantojiet formulu: apkārtmērs = 2πr, kur r ir apļa rādiuss.

Tagad, kad jums ir riteņa apkārtmērs, šo vērtību var uzskatīt par mūsu “fiksēto attālumu”, un tāpēc ātrumu var aprēķināt, izmērot laiku starp pilnu rotāciju.

Jūsu sensoram-kad tas ir uzstādīts-jārīkojas tāpat kā parasti atvērtai pogai, kas tiek nospiesta katru rotāciju. Mūsu skice izmērīs laiku, kas pagājis starp katru impulsu no sensora.

Lai to izdarītu, mūsu piemērā sensora izeja būs savienota ar 2. ciparu tapu - jo tas izraisīs pārtraukumu, lai aprēķinātu ātrumu. Pretējā gadījumā skice parādīs ātrumu parastā I2C saskarnes LCD modulī. I2C saskarne ir ieteicama, jo no Arduino plates līdz LCD ir nepieciešami tikai 4 vadi - jo mazāk vadu, jo labāk.

Šeit ir skice jūsu iepazīšanai:

/*Pamata spidometrs, izmantojot milis (); */

#include "Wire.h" // I2C kopnes LCD

#include "LiquidCrystal_I2C.h" // I2C kopnes LCD modulim - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // iestatiet LCD adresi uz 0x27, lai parādītu 16 rakstzīmes un 2 rindas

pludiņa starts, pabeigts;

pagājušais pludiņš, laiks; pludiņa aplisMetriskais = 1,2; // riteņa apkārtmērs attiecībā pret sensora stāvokli (metros) float circImperial; // izmantojot 1 kilometru = 0.621371192 jūdzes pludiņš speedk, speedm; // satur aprēķinātās ātruma vērtības metriskā un imperatora formā

anulēts iestatījums ()

{attachInterrupt (0, speedCalc, RISING); // pārtraukums tiek izsaukts, kad sensori sūta ciparu 2 augstu (katru riteņa rotāciju) start = milis (); // LCD iestatīšana lcd.init (); // inicializēt lcd lcd.backlight (); // ieslēgt LCD fona apgaismojumu lcd.clear (); lcd.println ("Valkājiet ķiveri!"); kavēšanās (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // pārvērst metriku par imperiālu MPH aprēķiniem}

tukšs ātrumsCalc ()

{pagājušais = milis ()-sākums; sākums = milis (); speedk = (3600*circMetric)/pagājis; // km/h speedm = (3600*circImperial)/pagājis; // Jūdzes stundā}

tukša cilpa ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (ātrums)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (pagājis)); lcd.print ("ms/rev"); kavēšanās (1000); // pielāgojiet personiskajām vēlmēm, lai samazinātu mirgošanu}

Notiek tik daudz - katru reizi, kad ritenis pabeidz vienu apgriezienu, sensora signāls pāriet no zema uz augstu, izraisot pārtraukumu, kas izsauc funkciju speedCalc ().

Tas nolasa milis () un pēc tam aprēķina starpību starp pašreizējo rādījumu un iepriekšējo rādījumu - šī vērtība kļūst par laiku, lai veiktu attālumu (kas ir riteņa apkārtmērs attiecībā pret sensoru)

pludiņa aplisMetriskais = 1,2;

un to mēra metros). Tas beidzot aprēķina ātrumu km/h un MPH. Starp pārtraukumiem skice LCD displejā parāda atjauninātos ātruma datus, kā arī katra apgrieziena neapstrādāto laika vērtību ziņkārības labad. Reālajā dzīvē es nedomāju, ka kāds uzstādītu LCD uz velosipēda, iespējams, LED displejs būtu atbilstošāks.

Tikmēr šajā īsajā videoklipā varat redzēt, kā darbojas šis piemērs. Velosipēda riteņa un niedru slēdža/magnēta kombinācijas vietā es esmu pievienojis kvadrātveida viļņu izeju no funkciju ģeneratora ar pārtraukuma tapu, lai simulētu sensora impulsus, lai jūs varētu gūt priekšstatu par tā darbību.

4. solis:

Tas gandrīz apkopo milis () izmantošanu pagaidām. Ir arī micros (); funkcija, kas skaita mikrosekundes.

Tātad jums tas ir - vēl viena praktiska funkcija, kas var ļaut atrisināt vairāk problēmu, izmantojot Arduino pasauli. Kā vienmēr, tagad jums un jūsu iztēlei ir jāatrod kaut kas, ko kontrolēt vai pieķerties citiem shananiganiem.

Šo ziņu jums sniedza pmdway.com - viss veidotājiem un elektronikas entuziastiem ar bezmaksas piegādi visā pasaulē.

Ieteicams: