Funcția de întârziere Arduino și de ce nu ar trebui să o utilizați

Funcția de întârziere Arduino și de ce nu ar trebui să o utilizați

Când ai început învățarea modului de dezvoltare pentru Arduino , probabil ați construit un produs care funcționează puțin astfel:





Conectat la Arduino ar fi o singură lumină LED. Aceasta se va opri și opri în fiecare secundă și cam așa și va continua până când Arduino este oprit. Acesta este programul „Hello World” al Arduino , și ilustrează perfect cum doar câteva linii de cod pot crea ceva tangibil.





Sunt de asemenea dispus să pariez că ați folosit întârziere() funcție pentru a defini intervalele dintre aprinderea și oprirea luminii. Dar iată: în timp ce întârzierea este utilă pentru demonstrații de bază despre modul în care funcționează Arduino, nu ar trebui să o folosiți în lumea reală. Iată de ce - și ce ar trebui să folosiți în schimb.





Cum funcționează întârzierea ()

Modul în care întârziere() funcția funcționează este destul de simplă. Acceptă un singur argument întreg (sau număr). Acest număr reprezintă timpul (măsurat în milisecunde) pe care programul ar trebui să îl aștepte până la trecerea la următoarea linie de cod.

Dar problema este, întârziere() funcția nu este o modalitate bună de a face programul să aștepte, deoarece este ceea ce este cunoscut sub numele de funcție de „blocare”.



cum se reduce dimensiunea jpeg

Diferența dintre funcțiile de blocare și non-blocare

Pentru a ilustra de ce funcțiile de blocare sunt rele, vreau să vă imaginați doi bucătari diferiți într-o bucătărie: Henry Blocking , și Eduardo NonBlocking . Ambii fac aceeași treabă, dar în moduri extrem de diferite.

Când Henry pregătește micul dejun, începe prin a pune două runde de pâine în prăjitor de pâine. Când în sfârșit pings , iar pâinea iese maro auriu, Henry o pune pe o farfurie și sparte două ouă într-o tigaie. Din nou, stă în picioare în timp ce uleiul apare, iar albii încep să se întărească. Când au terminat, le plătește și începe să prăjească două prăjituri de slănină. Odată ce sunt suficient de crocante, le scoate din tigaie, le pune pe farfurie și începe să mănânce.





Eduardo lucrează într-un mod ușor diferit. În timp ce pâinea îi prăjește, a început deja să-și prăjească ouăle și slănina. În loc să aștepte ca un articol să termine gătitul înainte de a trece la următorul, el gătește mai multe obiecte concomitent . Rezultatul final este că Eduardo ia mai puțin timp să facă micul dejun decât îl face Henry - și până când Henry Blocking a terminat, pâinea prăjită și ouăle s-au răcit.

Este o analogie prostească, dar ilustrează ideea.





Blocare funcțiile împiedică un program să facă orice altceva până la îndeplinirea acelei sarcini. Dacă vrei multiple acțiuni să se întâmple în același timp, pur și simplu nu puteți folosi întârziere() .

În special, dacă aplicația dvs. vă solicită să obțineți în mod constant date de la senzorii atașați, ar trebui să aveți grijă să evitați utilizarea întârziere() funcție, întrucât se întrerupe absolut Tot .

Din fericire, întârziere() nu este singura modalitate de a face programul să aștepte când codificați Arduino.

Faceți cunoștință cu Millis ()

The milis () funcția efectuează o singură sarcină. Când este apelat, acesta revine (ca lung tip de date) numărul de milisecunde care s-au scurs de la lansarea pentru prima dată a programului. Deci, de ce este util acest lucru?

Deoarece folosind un pic de matematică simplă, puteți „cronometra” cu ușurință aspecte ale programului dvs. fără a afecta modul în care funcționează. Următoarea este o demonstrație de bază a modului în care funcționează millis (). După cum veți vedea, programul va aprinde lumina LED-ului timp de 1000 de milisecunde (o secundă), apoi îl va stinge. Dar, în mod crucial, o face într-un mod care nu este blocant.

Acum să vedem cum funcționează cu Arduino.

Acest program - pe care se bazează puternic una din documentația oficială Arduino - funcționează scăzând timpul înregistrat anterior din ora curentă. Dacă restul (adică timpul scurs de la ultima înregistrare a timpului) este mai mare decât intervalul (în acest caz, 1000 milisecunde), programul actualizează data trecută variabilă la ora curentă și fie aprinde, fie oprește LED-ul.

telecomanda roku nu funcționează cu televizorul

Și pentru că este un non-blocant, orice cod care se află mai întâi în afara acelui afirmatie if ar trebui să funcționeze normal.

Simplu, nu-i așa? Rețineți cum am creat variabila ora curentă ca un nesemnat lung. Un nesemnat valoarea înseamnă pur și simplu că nu poate fi niciodată negativă; facem acest lucru astfel încât numărul maxim pe care îl putem stoca să fie mai mare. În mod implicit, variabilele de număr sunt semnate, ceea ce înseamnă că un „bit” de memorie pentru acea variabilă este utilizat pentru a stoca dacă valoarea este pozitivă sau negativă. Specificând că va fi doar pozitiv, avem un pic în plus cu care să ne jucăm.

Întrerupe

Până acum, am învățat despre o modalitate de a aborda sincronizarea în programul nostru Arduino, care este mai bună decât întârziere() . Dar există un alt mod mult mai bun, dar mai complex: întrerupe . Acestea au avantajul de a vă permite să programați cu precizie programul Arduino și să răspundeți rapid la o intrare externă, dar într-un asincron manieră.

Asta înseamnă că rulează împreună cu programul principal, așteptând în permanență să se producă un eveniment, fără a întrerupe fluxul de cod. Acest lucru vă ajută să răspundeți eficient la evenimente, fără a afecta performanța procesorului Arduino.

Când este declanșată o întrerupere, fie oprește programul, fie apelează o funcție, cunoscută în mod obișnuit ca Handler de întrerupere sau un Rutina de întrerupere a serviciului . Odată ce acest lucru a fost încheiat, programul revine apoi la ceea ce mergea.

Cipul AVR care alimentează Arduino acceptă numai întreruperile hardware. Acestea apar atunci când un pin de intrare merge de la mare la scăzut sau când este declanșat de temporizatoarele încorporate ale Arduino.

Sună criptic. Confuz, chiar. Dar nu este. Pentru a vedea cum funcționează și pentru a vedea câteva exemple despre utilizarea lor în lumea reală, apăsați documentația Arduino .

Nu te bloca

Folosind milis () desigur, necesită un pic de muncă suplimentară în comparație cu utilizarea întârziere() . Dar credeți-mă, programele dvs. vă vor mulțumi pentru asta și nu puteți face multitasking pe Arduino fără el.

Dacă doriți să vedeți un exemplu de milis () folosit într-un proiect Arduino din lumea reală, verificați Alarma de noapte și lumina de răsărit a lui Arduino de James Bruce.

Ați găsit alte funcții de blocare de care ar trebui să fim atenți? Anunțați-mă în comentariile de mai jos și vom discuta.

Credite foto: Arduino (Daniel Spiess) , Şef (Ollie Svenson)

Acțiune Acțiune Tweet E-mail Merită să faceți upgrade la Windows 11?

Windows a fost reproiectat. Dar este suficient pentru a vă convinge să treceți de la Windows 10 la Windows 11?

Citiți în continuare
Subiecte asemănătoare
  • DIY
  • Programare
  • Arduino
Despre autor Matthew Hughes(386 articole publicate)

Matthew Hughes este un dezvoltator de software și scriitor din Liverpool, Anglia. Rareori este găsit fără o ceașcă de cafea neagră puternică în mână și își adoră absolut Macbook Pro și camera. Puteți citi blogul său la http://www.matthewhughes.co.uk și îl puteți urmări pe twitter la @matthewhughes.

cum șterg o pagină de afaceri pe facebook
Mai multe de la Matthew Hughes

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona
Categorie Diy