amikor először használt egy Arduino táblát, valószínűleg valami ilyesmit tett:
- csatlakoztatott egy LED-et az Arduino-hoz
- feltöltötte az alapértelmezett blink vázlatot, amely másodpercenként be-és kikapcsolja a LED-et
ezt az Arduino “Hello World” programjának hívják, és azt mutatja, hogy csak néhány sornyi kóddal létrehozhat valamit, amely valós alkalmazással rendelkezik.
az előző példában a delay() funkcióval határozhatja meg a LED be-és kikapcsolása közötti intervallumokat.
itt van az üzlet: bár a delay() praktikus és alapvető példákhoz működik, valójában nem szabad használni a Való Világban… olvassa tovább, hogy megtudja, miért.
hogyan működik a delay() függvény
az Arduino delay() függvény működése meglehetősen egyenes.
egyetlen egész számot fogad el argumentumként. Ez a szám azt az időt jelenti milliszekundumban, amelyet a programnak meg kell várnia, amíg a következő kódsorra lép.
ha késlelteti(1000) az Arduino megáll ezen a vonalon 1 másodpercig.
a delay() egy blokkoló funkció. A blokkoló funkciók megakadályozzák, hogy a program bármi mást végezzen, amíg az adott feladat befejeződik. Ha egyszerre több feladatra van szüksége, egyszerűen nem használhatja a késleltetést ().
ha az alkalmazás megköveteli, hogy folyamatosan olvassa/mentse az adatokat a bemenetekről, kerülje a delay() funkció használatát. Szerencsére van megoldás.
millis() függvény a mentéshez
a millis() függvény híváskor visszaadja a program első indítása óta eltelt milliszekundumok számát.
miért hasznos ez?
mivel néhány matematika használatával könnyedén ellenőrizheti, hogy mennyi idő telt el a kód blokkolása nélkül.
az alábbi vázlat bemutatja, hogyan használhatja a millis() függvényt egy blink projekt létrehozásához. 1000 milliszekundumra bekapcsolja a LED-et, majd kikapcsolja. De olyan módon teszi, amely nem blokkolja.
vessünk egy közelebbi pillantást egy blink vázlatra, amely késleltetési funkció nélkül működik:
/* 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); }}
nyers Kód megtekintése
ez a fenti vázlat itt található, és úgy működik, hogy kivonja az előző rögzített időt (previousMillis) az aktuális időből (currentMillis). Ha a fennmaradó idő nagyobb, mint az intervallum (ebben az esetben 1000 milliszekundum), a program frissíti a previousMillis változót az aktuális időre, és vagy be-vagy kikapcsolja a LED-et.
és mivel ez nem blokkoló, minden olyan kódnak, amely az első if utasításon kívül található, normálisan kell működnie.
most már megértheted, hogy más feladatokat is hozzáadhatsz a loop() függvényhez, és a kódod még mindig másodpercenként villog a LED-en.
melyik funkciót használja?
az Arduino-val két különböző módszert tanultunk meg az idő kezelésére. A millis () függvények használata egy kis extra munkát igényel a delay () használatához képest. De a programjai nem tudnak multitaskingot végezni az Arduino-n anélkül.