prima dată când ați folosit o placă Arduino, probabil că ați făcut așa ceva:
- conectat un LED la Arduino
- încărcat schița clipire implicit, care ar activa și dezactiva LED-ul în fiecare secundă
aceasta se numește „Hello World” programul de Arduino și arată că, cu doar câteva linii de cod puteți crea ceva care are o aplicație din lumea reală.
în exemplul precedent, utilizați funcția delay() pentru a defini intervalele dintre LED-ul pornit și oprit.
Iată afacere: în timp ce întârziere() este la îndemână și funcționează pentru exemple de bază, într-adevăr nu ar trebui să fie folosind-o în lumea reală… continuați să citiți pentru a afla de ce.
cum funcționează funcția delay ()
modul în care funcționează funcția Arduino delay() este destul de drept înainte.
acceptă un singur întreg ca argument. Acest număr reprezintă timpul în milisecunde programul trebuie să aștepte până când trece la următoarea linie de cod.
când întârziați(1000) Arduino-ul dvs. se oprește pe acea linie timp de 1 secundă.
delay() este o funcție de blocare. Funcțiile de blocare împiedică un program să facă orice altceva până la finalizarea acelei sarcini. Dacă aveți nevoie de mai multe sarcini să apară în același timp, pur și simplu nu se poate utiliza delay().
dacă aplicația dvs. necesită citirea/salvarea constantă a datelor din intrări, ar trebui să evitați utilizarea funcției delay (). Din fericire, există o soluție.
millis() funcția de salvare
funcția millis() când este apelată, returnează numărul de milisecunde care au trecut de la începerea programului.
de ce este util?
deoarece prin utilizarea unor matematică, puteți verifica cu ușurință cât timp a trecut fără a vă bloca codul.
schița de mai jos arată cum puteți utiliza funcția millis() pentru a crea un proiect blink. Aprinde lumina LED timp de 1000 de milisecunde, apoi o oprește. Dar, o face într-un mod care nu blochează.
să aruncăm o privire mai atentă la o schiță de clipire care funcționează fără o funcție de întârziere:
/* 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); }}
Vizualizați codul brut
această schiță de mai sus poate fi găsită aici și funcționează scăzând timpul înregistrat anterior (previousMillis) din ora curentă (currentMillis). Dacă restul este mai mare decât intervalul (în acest caz, 1000 milisecunde), programul actualizează variabila anterioarămillis la ora curentă și fie pornește sau oprește LED-ul.
și pentru că este un non-blocare, orice cod care se află în afara că prima dacă declarație ar trebui să funcționeze în mod normal.
acum puteți înțelege că puteți adăuga alte sarcini la funcția loop() și codul dvs. va clipi în continuare LED-ul în fiecare secundă.
ce funcție ar trebui să utilizați?
am învățat două moduri diferite de a trata timpul cu Arduino. Utilizarea funcțiilor millis () necesită puțină muncă suplimentară în comparație cu utilizarea delay (). Dar programele dvs. nu pot face multitasking pe Arduino fără ea.