Satura rādītājs:
Video: Arduino laika noteikšanas metodes ar Millis (): 4 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:55
Š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:
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:
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…
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:
Laika noteikšanas sistēma uz Arduino lāzera: 6 soļi (ar attēliem)
Laika noteikšanas sistēma uz Arduino lāzera bāzes: Mācību ietvaros man bija nepieciešama sistēma, lai precīzi izmērītu, cik ātri modeļa transportlīdzeklis nobrauca 10 metrus. Sākotnēji es domāju, ka es nopirkšu lētu gatavu sistēmu no eBay vai Aliexpress, šīs sistēmas parasti pazīstamas kā gaismas vārti
Rūpnieciskās elektroinstalācijas metodes FTC robotiem - metodes un padomi: 4 soļi
Rūpnieciskās elektroinstalācijas metodes FTC robotiem - metodes un padomi: Daudzas FTC komandas paļaujas uz pamata elektroinstalācijas metodēm un rīkiem, lai uzstādītu elektroniku saviem robotiem. Tomēr ar šīm pamatmetodēm un materiāliem nepietiks, lai uzlabotu vadu prasības. Neatkarīgi no tā, vai jūsu komanda izmanto progresīvākas sajūtas
2 spēlētāju konkurētspējīga VS laika noteikšanas spēle: 4 soļi
2 spēlētāju konkurētspējīga spēles laika noteikšanas spēle: Jums būs nepieciešams: 1.Digilent Basys 3, FPGA padome (vai jebkura cita FPGA) Salīdzinoši atjaunināta Vivado versija vai kāda cita VHDL vide3. Dators, kas spēj palaist minēto programmu
Ūdens līmeņa noteikšanas metodes Arduino, izmantojot ultraskaņas sensoru un Funduino ūdens sensoru: 4 soļi
Arduino ūdens līmeņa noteikšanas metodes, izmantojot ultraskaņas sensoru un Funduino ūdens sensoru: Šajā projektā es jums parādīšu, kā izveidot lētu ūdens detektoru, izmantojot divas metodes: 1. Ultraskaņas sensors (HC-SR04) .2. Funduino ūdens sensors
Laika noteikšanas rokassprādze: 6 soļi (ar attēliem)
Laika noteikšanas rokassprādze: Laika noteikšanas aproce ir auduma potenciometrs. Jūs izvēlaties vēlamo diennakts laiku, sazinoties ar atbilstošo pozīciju uz plaukstas locītavas - kur parasti atrodas jūsu pulkstenis. Tam nav jēgas, bet jautri. Atjauninājums: izmantojot kādu vadu