Funcția de întârziere a funcției Arduino și de ce nu ar trebui să o utilizați
Când ați început să învățați cum să vă dezvoltați Arduino: Ghidul unui începător Arduino: un ghid pentru începători Arduino este o platformă de prototipuri electronice cu sursă deschisă bazată pe hardware și software flexibile și ușor de folosit. Este destinat artiștilor, designerilor, pasionaților și tuturor celor interesați să creeze obiecte sau medii interactive. Citește mai mult pentru Arduino Ce este Arduino și ce poți să faci cu el? Ce este Arduino și ce puteți face cu el? Arduino este un dispozitiv remarcabil de electronică, dar dacă nu ai mai folosit niciodată înainte, ce anume sunt și ce poți să faci cu unul? Citiți mai multe, ați construit probabil un produs care funcționează puțin în felul următor:
Conectat la Arduino ar fi o singură lumină LED. Acest lucru se va întoarce și se va opri în fiecare secundă, și va continua până când Arduino va fi oprit. Acesta este “Salut Lume” programul Arduino și ilustrează perfect modul în care doar câteva linii de coduri pot crea ceva tangibil.
De asemenea, sunt dispus să pariez că ați folosit întârziere() pentru a defini intervalele dintre activarea și dezactivarea luminii. Dar iată ce se întâmplă: întârzierea este utilă pentru demonstrațiile de bază ale modului în care Arduino funcționează, într-adevăr nu ar trebui să o utilizați în lumea reală. Iată de ce - și ce ar trebui să utilizați în schimb.
Cum funcționează Delay ()
Modul în care întârziere() funcția este destul de simplă. Accepta un singur intreg Bazele Programarii Calculatoare 101 - Variabile si Tipuri de Date Bazele Programarii Calculatoarelor 101 - Variabile si DateTypes Dupa ce am introdus si am vorbit putin despre programarea orientata pe obiecte inainte si in cazul in care vine numele sau, am crezut ca este timpul sa trecem prin bazele absolute ale programării într-un mod specific non-lingvistic. Acest argument ... Citește mai mult (sau numărul). Acest număr reprezintă timpul (măsurat în milisecunde), programul ar trebui să aștepte până când trece la următoarea linie de cod.
Dar problema este, întârziere() funcția nu este o modalitate bună de a face programul dvs. să aștepte, pentru că este ceea ce se numește a “blocarea” funcţie.
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. Ambele fac același lucru, dar în moduri diferite.
Când Henry face micul dejun, începe prin a pune două pâini în prajitor. Când este în sfârșit ping-uri, și pâinea explodează în maro auriu, Henry îl pune pe o farfurie și crapă două ouă într-o tigaie. Din nou, el stă în picioare pe măsură ce uleiul se deschide, iar albul începe să se întărească. După ce au terminat, le plătește și începe să prăjească două șobolani de slănină. Odată ce acestea sunt suficient de crocante, le ia de pe tigaie, le pune pe farfurie și începe să mănânce.
Eduardo funcționează într-un mod ușor diferit. În timp ce pâinea lui se toastă, el a început deja să-și prăjească ouăle și slănina. În loc să aștepți ca un element să termine gătitul înainte de a trece la următorul, gătește mai multe elemente concomitent. Rezultatul final este că Eduardo ia mai puțin timp să facă micul dejun decât Henry - și până când Henry Blocking a terminat, toastul și ouăle au răcit.
Este o analogie stupidă, dar ilustrează punctul.
blocarea funcțiile împiedică un program să facă altceva până când acea sarcină specială a fost finalizată. Dacă doriți mai multe 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ă cere să achiziționați în mod constant date de la senzori atașați, trebuie să aveți grijă să nu utilizați întârziere() funcția, deoarece se oprește absolut Tot.
din fericire, întârziere() nu este singura modalitate de a face programul să aștepte la codarea lui Arduino.
Meet Millis ()
Millis () funcția efectuează o singură sarcină. Când este chemat, se întoarce (ca a lung datatype) numărul de milisecunde care au trecut de la lansarea programului. Deci, de ce este util?
Deoarece folosind un pic de matematică simplă, puteți ușor “timp” 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 lumina LED-ul pe 1000 de milisecunde (o secundă) și apoi îl va opri. Dar, crucial, o face într-un mod care nu este blocat.
Acum, să ne uităm la modul în care funcționează cu Arduino.
Acest program - care se bazează în mare măsură pe unul din documentația oficială Arduino - funcționează prin scăderea timpului înregistrat anterior din momentul curent. Dacă restul (adică timpul scurs de la înregistrarea ultimei perioade) este mai mare decât intervalul (în acest caz, 1000 milisecunde), programul actualizează data trecută variabilă până la ora curentă și fie activează sau dezactivează LED-ul.
Și pentru că este un blocaj, orice cod care se află în afara acelei prime dacă declarație ar trebui să funcționeze în mod normal.
Simplu, nu-i așa? Rețineți cum am creat variabila ora curentă ca un nesemnat lung. Un nesemnat valoare înseamnă pur și simplu că nu poate fi niciodată negativă; facem acest lucru astfel încât numărul maxim pe care îl putem stoca este mai mare. În mod prestabilit, variabilele de număr sunt semnate, ceea ce înseamnă unul “pic” de memorie pentru acea variabilă este utilizat pentru a stoca dacă valoarea este pozitivă sau negativă. Prin specificarea ei va fi doar pozitiv, avem un pic mai mult să se joace cu.
Întreruperile
Până acum, am aflat despre o modalitate de abordare a programării în programul nostru Arduino, care este mai bună decât întârziere(). Dar există o altă, mult mai bună, dar mai complexă: întrerupe. Acestea au avantajul de a vă permite să vă acoperiți cu precizie programul dvs. Arduino și să răspundeți rapid la o intrare externă, asincron manieră.
Aceasta înseamnă că rulează împreună cu programul principal, așteptând în mod constant să se întâmple 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.
Atunci când se declanșează o întrerupere, se oprește fie programul, fie se apelează o funcție, cunoscută sub denumirea de an Întrerupere manipulare sau an Întrerupeți serviciul de rutină. Odată încheiată, programul se reîntoarce la ceea ce se întâmpla.
Cipul AVR care alimentează Arduino suportă doar întreruperi hardware. Acestea apar atunci când un pin de intrare trece de la mare la scăzut, sau când este declanșat de temporizatoarele încorporate ale lui Arduino.
Suna 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
Utilizarea Millis () cu siguranță are nevoie de puțină muncă suplimentară în comparație cu utilizarea întârziere(). Dar crede-mă, programele tale îți vor mulțumi pentru asta și nu poți face multitasking pe Arduino fără ea.
Dacă doriți să vedeți un exemplu de Millis () folosit într-un proiect Arduino din lumea reală, verificați arduinul de noapte Arduino și sunrise ale lui James Bruce. Arduino Proiect de iluminare nocturnă și sunrise Sunrise Arduino Proiect de iluminare nocturnă și sunrise de astăzi Astăzi, vom face un ceas deșteptător cu răsărit de soare, care vă va trezi încet și încet fără a recurge la o mașină ofensatoare de zgomot. Citeste mai mult
S-au găsit alte funcții de blocare de care ar trebui să fim atenți? Anunță-mă în comentariile de mai jos și vom vorbi.
Credite foto: Arduino (Daniel Spiess), bucătar (Ollie Svenson)
Explorați mai multe despre: Arduino, Programare.