Obsah:
Video: Metody časování Arduino s Millis (): 4 kroky
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
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:
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:
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…
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:
Techniky průmyslového zapojení robotů FTC - metody a tipy: 4 kroky
Techniky průmyslového zapojení robotů FTC - metody a tipy: Mnoho týmů FTC spoléhá při nastavování elektroniky svých robotů na základní techniky a nástroje zapojení. Tyto základní metody a materiály však na pokročilejší požadavky na zapojení nestačí. Ať už váš tým využívá pokročilejší senzor
Reproduktor podle metody pokusu a omylu: 11 kroků (s obrázky)
Design reproduktoru metodou pokusu a omylu: „Nyní potřebuji vytvořit vlastní pár reproduktorů!“Pomyslel jsem si, když jsem dokončil svůj Serious Amplifier. " A pokud dokážu vytvořit slušný zesilovač, určitě to dokážu. " Vrhl jsem se tedy do světa designu a stavění reproduktorů a čekal, že
Metody detekce vodní hladiny Arduino pomocí ultrazvukového senzoru a Funduino vodního senzoru: 4 kroky
Metody detekce hladiny vody Arduino pomocí ultrazvukového senzoru a Funduino senzoru vody: V tomto projektu vám ukážu, jak vytvořit levný detektor vody pomocí dvou metod: 1. Ultrazvukový senzor (HC-SR04) .2. Senzor vody Funduino
Oboustranná deska plošných spojů pomocí metody toneru: 4 kroky (s obrázky)
Oboustranná deska plošných spojů pomocí metody toneru: Popisuje snadný způsob, jak si doma vyrobit oboustranné desky s plošnými spoji profesionálního vzhledu
Střídavé světlo časování motoru: 8 kroků
AC Powered Engine Timing Light: Ještě v 70. letech jsem chtěl xenonové časovací světlo nahradit téměř zbytečné neonové časovací světlo, které jsem měl. Půjčil jsem si k použití kamarádovu AC časovanou kontrolku. Když jsem to měl, otevřel jsem to a udělal schéma obvodu. Pak jsem šel k elektronice