Obsah:

Metódy časovania Arduino s Millis (): 4 kroky
Metódy časovania Arduino s Millis (): 4 kroky

Video: Metódy časovania Arduino s Millis (): 4 kroky

Video: Metódy časovania Arduino s Millis (): 4 kroky
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Júl
Anonim
Metódy časovania Arduino s Millis ()
Metódy časovania Arduino s Millis ()

V tomto článku predstavíme millis (); funkciu a dal ju použiť na vytvorenie rôznych príkladov načasovania.

Millis? Nemá to nič spoločné so synchronizátormi pier … dúfajme, že ste poznali mili ako číselnú predponu pre jednu tisícinu; to je vynásobenie mernej jednotky 0,001 (alebo desať na mocninu zápornej hodnoty 3).

Je zaujímavé, že naše systémy Arduino budú počítať počet milisekúnd (tisíce sekúnd) od začiatku behu náčrtu, kým počet nedosiahne maximálny počet, ktorý je možné uložiť do typu premennej bez znamienka (32-bitové [štyri bajty] celé číslo) -to sa pohybuje od nuly do (2^32) -1. (2^32) -1, alebo 4294967295 milisekúnd sa prevádza na 49,71027 nepárnych dní.

Počítadlo sa vynuluje, keď sa Arduino resetuje, dosiahne maximálnu hodnotu alebo sa nahrá nový náčrt. Ak chcete získať hodnotu počítadla v konkrétnom čase, stačí zavolať funkciu - napríklad:

štart = milis ();

Kde začiatok je dlhá premenná bez znamienka. Tu je veľmi jednoduchý príklad, ktorý vám ukáže milis () v akcii:

/ * milis () ukážka */

nepodpísaný dlhý štart, dokončený, uplynulý;

neplatné nastavenie ()

{Serial.begin (9600); }

prázdna slučka ()

{Serial.println ("Štart …"); štart = milis (); oneskorenie (1000); skončil = milis (); Serial.println („Dokončené“); uplynulý = dokončený štart; Serial.print (uplynul); Serial.println ("uplynuli milisekundy"); Serial.println (); oneskorenie (500); }

Skica uloží aktuálny počet milisekúnd na začiatok, potom počká jednu sekundu a potom hodnotu milisekundov opäť uloží ako dokončenú. Nakoniec vypočíta uplynutý čas oneskorenia. Na nasledujúcom výpise obrazovky sériového monitora vidíte, že trvanie nebolo vždy presne 1 000 milisekúnd, ako je znázornené na obrázku.

Krok 1:

Obrázok
Obrázok

Zjednodušene povedané, funkcia millis využíva interné počítadlo v mikrokontroléri ATmega v srdci vášho Arduina. Toto počítadlo zvyšuje každý hodinový cyklus - čo sa deje (v štandardnom Arduine a kompatibilných) pri takte 16 Mhz. Táto rýchlosť je riadená kryštálom na doske Arduino (strieborná vec s vyrazeným T16 000).

Krok 2:

Obrázok
Obrázok

Presnosť kryštálov sa môže líšiť v závislosti od vonkajšej teploty a tolerancie samotného kryštálu. To zase ovplyvní presnosť vášho milis výsledku. Neoficiálne skúsenosti uvádzajú, že posun v presnosti načasovania môže byť približne tri alebo štyri sekundy za dvadsaťštyri hodinové obdobie.

Ak používate dosku alebo vlastnú verziu, ktorá používa namiesto kryštálu keramický rezonátor, upozorňujeme, že nie sú také presné a zavedie možnosť vyšších úrovní driftu. Ak potrebujete oveľa vyššiu presnosť časovania, zvážte konkrétne integrované obvody časovača, ako napríklad Maxim DS3231.

Teraz môžeme millis využiť na rôzne funkcie časovania. Ako je ukázané v predchádzajúcom príklade náčrtu, môžeme vypočítať uplynulý čas. Aby sme túto myšlienku posunuli ďalej, urobme si jednoduché stopky. To môže byť také jednoduché alebo zložité, ako je potrebné, ale v tomto prípade sa obrátime k jednoduchému.

Z hľadiska hardvéru budeme mať dve tlačidlá-Štart a Stop-s 10k ohmovými sťahovacími odpormi pripojenými k digitálnym kolíkom 2 a 3. Keď používateľ stlačí štart, skica si všimne hodnotu v milisekundách - potom po stlačení tlačidla stopa znova zaznamená hodnotu v milisekundách, vypočíta a zobrazí uplynulý čas. Používateľ potom môže stlačením tlačidla Štart proces zopakovať alebo zastaviť aktualizované údaje. Tu je náčrt:

/* Superzákladné stopky s použitím milis (); */

nepodpísaný dlhý štart, dokončený, uplynulý;

neplatné nastavenie ()

{Serial.begin (9600); pinMode (2, VSTUP); // tlačidlo štart pinMode (3, INPUT); // tlačidlo zastavenia Serial.println ("Stlačte 1 pre spustenie/reset, 2 pre uplynulý čas"); }

void displayResult ()

{float h, m, s, ms; dlho bez znamienka; uplynulý = dokončený štart; h = int (uplynulé/3600000); over = uplynulý%3600000; m = int (nad/60 000); nad = viac ako%60 000; s = int (nad/1000); ms = viac ako%1000; Serial.print ("Nespracovaný uplynulý čas:"); Serial.println (uplynul); Serial.print ("Uplynulý čas:"); Sériový tlač (h, 0); Serial.print ("h"); Sériový tlač (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

prázdna slučka ()

{if (digitalRead (2) == HIGH) {start = millis (); oneskorenie (200); // pre debounce Serial.println ("Spustené …"); } if (digitalRead (3) == HIGH) {finished = millis (); oneskorenie (200); // pre debounce displayResult (); }}

Hovory na delay () sa používajú na odblokovanie prepínačov - sú voliteľné a ich použitie bude závisieť od vášho hardvéru. Obrázok je príkladom výstupu sériového monitora náčrtu - spustili sa stopky a potom sa šesťkrát stlačilo tlačidlo dvakrát v časovom období.

Krok 3: Rýchlomer…

Image
Image

Ak ste mali snímač na začiatku a na konci pevnej vzdialenosti, rýchlosť by sa dala vypočítať: rýchlosť = vzdialenosť ÷ čas.

Môžete si tiež vyrobiť rýchlomer pre kolesovú formu pohybu, napríklad pre bicykel. V súčasnej dobe nemáme k dispozícii bicykel, s ktorým by sme sa mohli popasovať, ale môžeme popísať postup - je to celkom jednoduché. (Vylúčenie zodpovednosti - urobte to na vlastné riziko atď.)

Najprv sa pozrime na potrebnú matematiku. Budete potrebovať poznať obvod kolesa. Hardvér - budete potrebovať senzor. Napríklad - jazýčkový spínač a magnet. Jazýčkový spínač považujte za normálne otvorené tlačidlo a ako obvykle ho spojte so sťahovacím odporom 10 kOhm.

Iní môžu použiť snímač s Hallovým efektom-každý podľa svojho). Zapamätajte si to z hodiny matematiky a na výpočet obvodu použite vzorec: obvod = 2πr, kde r je polomer kruhu.

Teraz, keď máte obvod kolesa, možno túto hodnotu považovať za našu „pevnú vzdialenosť“, a preto je možné rýchlosť vypočítať zmeraním uplynutého času medzi úplným otočením.

Váš senzor-po inštalácii-by mal fungovať rovnakým spôsobom ako normálne otvorené tlačidlo, ktoré sa stlačí pri každom otočení. Náš náčrt bude merať čas, ktorý uplynul medzi každým impulzom zo senzora.

V tomto prípade bude mať náš príklad výstup senzora pripojený k digitálnemu kolíku 2 - pretože spustí prerušenie na výpočet rýchlosti. Náčrt bude inak zobrazovať rýchlosť na normálnom LCD module s rozhraním I2C. Navrhuje sa rozhranie I2C, pretože to vyžaduje iba 4 vodiče z dosky Arduino na LCD - čím menej vodičov, tým lepšie.

Tu je náčrt vášho nahliadnutia:

/*Základný rýchlomer používajúci milis (); */

#include "Wire.h" // pre LCD zbernicu I2C

#include "LiquidCrystal_I2C.h" // pre zbernicový LCD modul I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // nastavte adresu LCD na 0x27 pre 16 znakový a 2 riadkový displej

plavákový štart, hotový;

plavák uplynul, čas; float circMetric = 1,2; // obvod kolesa vzhľadom na polohu snímača (v metroch) float circImperial; // pomocou 1 kilometra = 0,621371192 míľ float speedk, speedm; // uchováva vypočítané rýchlostné hodnoty v metrických a imperiálnych

neplatné nastavenie ()

{attachInterrupt (0, speedCalc, RISING); // prerušenie vyvolané, keď senzory vyšlú digitálne 2 vysoké (každé otáčanie kolies) štart = millis (); // nastavenie LCD lcd.init (); // inicializácia lcd lcd.backlight (); // zapnutie podsvietenia LCD lcd.clear (); lcd.println („Noste prilbu!“); oneskorenie (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // prepočet MPH na konverziu metriky na imperiálnu hodnotu}

neplatná rýchlosťCalc ()

{elapsed = millis ()-start; štart = milis (); speedk = (3600*circMetric)/uplynulý; // km/h speedm = (3600*circImperial)/uplynul // Míle za hodinu }

prázdna slučka ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (uplynulé)); lcd.print ("ms/rev"); oneskorenie (1000); // upravte podľa osobných preferencií, aby ste minimalizovali blikanie}

Nie je toho veľa - vždy, keď koleso dokončí jednu otáčku, signál zo snímača prejde z nízkej na vysokú - spustí sa prerušenie, ktoré vyvolá funkciu speedCalc ().

To odčíta milis () a potom vypočíta rozdiel medzi aktuálnym a predchádzajúcim údajom - z tejto hodnoty sa stane čas na prekonanie vzdialenosti (čo je obvod kolesa vzhľadom na snímač) - uložený v

float circMetric = 1,2;

a meria sa v metroch). Nakoniec vypočíta rýchlosť v km/h a MPH. Medzi prestávkami skica pre zaujímavosť zobrazí aktualizované údaje o rýchlosti na LCD, ako aj hodnotu surového času pre každú otáčku. V skutočnom živote si nemyslím, že by niekto namontoval LCD na bicykel, možno by bol relevantnejší LED displej.

Medzitým si v nasledujúcom krátkom videoklipe môžete pozrieť, ako tento príklad funguje. Namiesto kombinácie bicykla a jazýčkového spínača/magnetu som pripojil výstup štvorcovej vlny z funkčného generátora k prerušovaciemu kolíku, aby sa simulovali impulzy zo snímača, aby ste si mohli urobiť predstavu o tom, ako to funguje.

Krok 4:

To asi len sumarizuje použitie milis () v súčasnosti. Existuje aj mikroskop (); funkcia, ktorá počíta mikrosekundy.

Takže tu to máte - ďalšia praktická funkcia, ktorá vám umožní vyriešiť viac problémov prostredníctvom sveta Arduino. Ako vždy, aj teraz je na vás a vašej fantázii, aby ste našli niečo, čo môžete ovládať, alebo vstať s inými úškrnmi.

Tento príspevok vám prináša pmdway.com - všetko pre výrobcov a nadšencov elektroniky s bezplatným doručením do celého sveta.

Odporúča: