úplně poprvé, kdy jste použili Arduino desku, pravděpodobně jste něco takového:
- Připojené LED na Arduino
- Nahrát výchozí blikat skica, že by zapnutí a vypnutí vašeho LED každou sekundu
To se nazývá „Hello World“ program Arduino a ukazuje, že s jen pár řádků kódu, můžete vytvořit něco, co má skutečný svět aplikace.
v předchozím příkladu pomocí funkce delay() definujete intervaly mezi zapnutím a vypnutím LED.
Tady je dohoda: zatímco delay() je šikovný a pracuje pro základní příklady, jste opravdu neměli používat v reálném světě… Mějte se dozvíte, proč.
jak funguje funkce delay ()
způsob, jakým funguje funkce Arduino delay (), je docela přímočarý.
přijímá jediné celé číslo jako argument. Toto číslo představuje čas v milisekundách, který musí program počkat, až přejde na další řádek kódu.
při zpoždění (1000) se vaše Arduino zastaví na této lince po dobu 1 sekundy.
delay () je blokovací funkce. Blokovací funkce zabraňují programu dělat cokoli jiného, dokud nebude tento konkrétní úkol dokončen. Pokud potřebujete více úkolů najednou, jednoduše nemůžete použít delay ().
pokud vaše aplikace vyžaduje, abyste neustále četli/ukládali data ze vstupů, neměli byste používat funkci delay (). Naštěstí existuje řešení.
funkce millis () k záchraně
funkce millis () při volání vrací počet milisekund, které uplynuly od prvního spuštění programu.
proč je to užitečné?
protože pomocí nějaké matematiky můžete snadno ověřit, kolik času uplynulo bez blokování kódu.
níže uvedený náčrt ukazuje, jak můžete použít funkci millis() k vytvoření projektu blink. Rozsvítí kontrolku LED po dobu 1000 milisekund a poté ji vypne. Ale dělá to způsobem, který neblokuje.
Pojďme se blíže podívat na blink skicu, která funguje bez zpoždění funkce:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Zobrazení raw kód
Tento náčrt výše, lze nalézt zde a funguje to tak, že se odečte předchozí nahraný čas (previousMillis) od aktuálního času (currentMillis). Pokud je zbytek větší než interval (v tomto případě 1000 milisekund), program aktualizuje proměnnou previousMillis na aktuální čas a buď zapne nebo vypne LED.
a protože se jedná o neblokování, měl by každý kód, který je umístěn mimo toto první if prohlášení, fungovat normálně.
nyní můžete pochopit, že do funkce loop() můžete přidat další úkoly a váš kód bude stále blikat LED každou sekundu.
jakou funkci byste měli používat?
naučili jsme se dva různé způsoby, jak se vypořádat s časem s Arduino. Použití funkcí millis () vyžaduje trochu práce navíc ve srovnání s použitím delay (). Ale vaše programy nemohou dělat multitasking na Arduino bez něj.