Obsah:

Metody časování Arduino s Millis (): 4 kroky
Metody časování Arduino s Millis (): 4 kroky

Video: Metody časování Arduino s Millis (): 4 kroky

Video: Metody časování Arduino s Millis (): 4 kroky
Video: Lesson 95: Using L293D 4 DC Motors Shield for Arduino UNO and Mega | Arduino Step By Step Course 2024, Červenec
Anonim
Metody časování Arduino s Millis ()
Metody časování Arduino s Millis ()

V tomto článku představujeme millis (); funkci a dal ji použít k vytvoření různých příkladů časování.

Millis? Se syntezátory na rty to nemá nic společného … doufejme, že jste poznali mili jako číselnou předponu pro jednu tisícinu; to je vynásobení měrné jednotky 0,001 (nebo deset na mocninu mínus 3).

Je zajímavé, že naše systémy Arduino budou počítat počet milisekund (tisíce sekund) od začátku běhu náčrtu, dokud počet nedosáhne maximálního počtu, který je možné uložit do typu proměnné bez znaménka (32bitové [čtyřbajtové] celé číslo) -to se pohybuje od nuly do (2^32) -1. (2^32) -1, nebo 4294967295 milisekund převede na 49,71027-liché dny.

Počitadlo se resetuje, když je Arduino resetováno, dosáhne maximální hodnoty nebo je nahrán nový náčrt. Chcete -li získat hodnotu čítače v konkrétní situaci, stačí zavolat funkci - například:

start = milis ();

Kde start je nepodepsaná dlouhá proměnná. Zde je velmi jednoduchý příklad, který vám ukáže milis () v akci:

/ * demonstrace milis () */

nepodepsaný dlouhý start, hotový, uplynulý;

neplatné nastavení ()

{Serial.begin (9600); }

prázdná smyčka ()

{Serial.println ("Start …"); start = milis (); zpoždění (1000); skončil = milis (); Serial.println („Dokončeno“); uplynulý = dokončený start; Serial.print (uplynul); Serial.println ("uplynuly milisekundy"); Serial.println (); zpoždění (500); }

Skica uloží aktuální počet milisekund na začátek, poté počká jednu sekundu a poté hodnotu milisekund znovu uloží jako hotovou. Nakonec vypočítá uplynulý čas zpoždění. Na následujícím výpisu obrazovky sériového monitoru vidíte, že doba trvání nebyla vždy přesně 1000 milisekund, jak ukazuje obrázek.

Krok 1:

obraz
obraz

Jednoduše řečeno, funkce millis využívá interní čítač v mikrokontroléru ATmega v srdci vašeho Arduina. Tento čítač zvyšuje každý hodinový cyklus - což se děje (ve standardním Arduinu a kompatibilních) při hodinové rychlosti 16 Mhz. Tato rychlost je řízena krystalem na desce Arduino (stříbrná věc s vyraženým T16 000).

Krok 2:

obraz
obraz

Přesnost krystalu se může lišit v závislosti na vnější teplotě a toleranci samotného krystalu. To zase ovlivní přesnost vašeho milis výsledku. Neoficiální zkušenosti uvádějí, že posun v přesnosti časování může být kolem tří nebo čtyř sekund za dvacet čtyři hodin.

Pokud používáte desku nebo vlastní verzi, která místo krystalu používá keramický rezonátor, všimněte si, že nejsou tak přesné a zavedou možnost vyšších úrovní driftu. Pokud potřebujete mnohem vyšší úroveň přesnosti časování, zvažte konkrétní integrované obvody časovače, jako je Maxim DS3231.

Nyní můžeme použít milis pro různé časové funkce. Jak bylo ukázáno v předchozím příkladu náčrtu, můžeme vypočítat uplynulý čas. Abychom tuto myšlenku posunuli dál, udělejme si jednoduché stopky. Dělat to může být tak jednoduché nebo složité, jak je nutné, ale v tomto případě se přikloníme k jednoduchosti.

Z hlediska hardwaru budeme mít dvě tlačítka-Start a Stop-s 10k ohm stahovacími odpory připojenými k digitálním pinům 2 a 3. Když uživatel stiskne start, skica si všimne hodnoty v milisekundách - poté po stisknutí tlačítka stopa znovu zaznamená hodnotu v milisekundách, vypočítá a zobrazí uplynulý čas. Uživatel pak může stisknutím tlačítka Start proces zopakovat nebo zastavit aktualizovaná data. Zde je skica:

/* Superzákladní stopky pomocí millis (); */

nepodepsaný dlouhý start, hotový, uplynulý;

neplatné nastavení ()

{Serial.begin (9600); pinMode (2, VSTUP); // tlačítko start pinMode (3, INPUT); // tlačítko zastavení Serial.println ("Stiskněte 1 pro spuštění/reset, 2 pro uplynulý čas"); }

zrušit displayResult ()

{float h, m, s, ms; dlouho bez znaménka; uplynulý = hotový začátek; h = int (uplynulý/3600000); over = uplynulý%3600000; m = int (nad/60 000); přes = více než%60 000; s = int (nad/1000); ms = více než%1000; Serial.print ("Nezpracovaný čas:"); Serial.println (uplynul); Serial.print ("Uplynulý čas:"); Serial.print (h, 0); Serial.print ("h"); Sériový tisk (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

prázdná smyčka ()

{if (digitalRead (2) == HIGH) {start = millis (); zpoždění (200); // pro debounce Serial.println ("Spuštěno …"); } if (digitalRead (3) == HIGH) {finished = millis (); zpoždění (200); // pro debounce displayResult (); }}

Volání delay () se používají k odpojení přepínačů - jsou volitelná a jejich použití bude záviset na vašem hardwaru. Obrázek je příkladem výstupu sériového monitoru náčrtu - spustily se stopky a poté bylo šestkrát stisknuto šestkrát napříč časovým obdobím.

Krok 3: Rychloměr…

Image
Image

Pokud jste měli snímač na začátku a na konci pevné vzdálenosti, rychlost by se dala vypočítat: rychlost = vzdálenost ÷ čas.

Můžete si také vyrobit rychloměr pro kolovou formu pohybu, například pro jízdní kolo. V současné době nemáme kolo, s nímž bychom si mohli pohrávat, ale můžeme popsat postup - je to docela jednoduché. (Prohlášení - dělejte to na vlastní nebezpečí atd.)

Nejprve se podívejme na potřebnou matematiku. Budete potřebovat znát obvod kola. Hardware - budete potřebovat senzor. Například - jazýčkový spínač a magnet. Považujte jazýčkový spínač za normálně otevřené tlačítko a připojte jako obvykle pomocí stahovacího odporu 10 k ohmů.

Ostatní mohou použít snímač s Hallovým efektem-každý podle svého). Pamatujte ze třídy matematiky, pro výpočet obvodu použijte vzorec: obvod = 2πr, kde r je poloměr kruhu.

Nyní, když máte obvod kola, lze tuto hodnotu považovat za naši „pevnou vzdálenost“, a proto lze rychlost vypočítat měřením uplynulého času mezi úplným otočením.

Váš senzor-jakmile je namontován-by měl fungovat stejným způsobem jako normálně otevřené tlačítko, které je stisknuto při každém otočení. Náš náčrtek bude měřit čas, který uplynul mezi každým impulzem ze senzoru.

Za tímto účelem bude mít náš příklad výstup snímače připojený k digitálnímu kolíku 2 - protože spustí přerušení pro výpočet rychlosti. Náčrt bude jinak zobrazovat rychlost na normálním LCD modulu s rozhraním I2C. Je doporučeno rozhraní I2C, protože to vyžaduje pouze 4 vodiče od desky Arduino k LCD - čím méně vodičů, tím lépe.

Zde je skica pro vaše nahlédnutí:

/*Základní rychloměr pomocí milis (); */

#include "Wire.h" // pro sběrnici I2C LCD

#include "LiquidCrystal_I2C.h" // pro LCD modul sběrnice I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // pro 16 znaků a 2 řádky nastavte adresu LCD na 0x27

float start, skončil;

uplynulý čas, čas; float circMetric = 1,2; // obvod kola vzhledem k poloze senzoru (v metrech) float circImperial; // pomocí 1 kilometru = 0,621371192 mil float speedk, speedm; // drží vypočítané rychlostní hodnoty v metrických a imperiálních

neplatné nastavení ()

{attachInterrupt (0, speedCalc, RISING); // přerušení vyvolané, když senzory vysílají digitální 2 high (každé otočení kola) start = millis (); // nastavení LCD lcd.init (); // inicializace lcd lcd.backlight (); // zapnout podsvícení LCD lcd.clear (); lcd.println („Noste helmu!“); zpoždění (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // převod metriky na imperiální pro výpočty MPH}

neplatná rychlostCalc ()

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

prázdná smyč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"); zpoždění (1000); // přizpůsobení osobním preferencím, aby se minimalizovalo blikání}

Není toho tolik - pokaždé, když kolo dokončí jednu otáčku, signál ze senzoru přejde z nízké na vysokou - spustí přerušení, které vyvolá funkci speedCalc ().

To trvá odečet milisekund () a poté vypočítá rozdíl mezi aktuálním a předchozím údajem - tato hodnota se stane časem pro překonání vzdálenosti (což je obvod kola vzhledem k senzoru - uložený v

float circMetric = 1,2;

a měří se v metrech). Nakonec vypočítá rychlost v km/h a MPH. Mezi přerušeními skica pro zajímavost zobrazí aktualizované údaje o rychlosti na LCD a také hodnotu surového času pro každou otáčku. V reálném životě si nemyslím, že by někdo namontoval LCD na kolo, možná by byl relevantnější LED displej.

Mezitím se v následujícím krátkém videoklipu můžete podívat, jak tento příklad funguje. Namísto kombinace kola kola a jazýčkového spínače/magnetu jsem připojil výstup čtvercové vlny z funkčního generátoru k přerušovacímu kolíku, abych simuloval impulsy ze senzoru, abyste získali představu o tom, jak to funguje.

Krok 4:

To prozatím shrnuje použití milis (). K dispozici je také micros (); funkce, která počítá mikrosekundy.

Takže tady to máte - další praktická funkce, která umožňuje vyřešit více problémů prostřednictvím světa Arduina. Jako vždy, nyní je jen na vás a vaší fantazii, abyste našli něco, co byste mohli ovládat, nebo vstát s jinými shenanigany.

Tento příspěvek vám přinesl web pmdway.com - vše pro výrobce a nadšence do elektroniky s doručením zdarma po celém světě.

Doporučuje: