Arduino multitasking en tydsbestuur

Arduino-toets vir multitask met milis

Ek is nie 'n Arduino-kenner nie, ten spyte daarvan dat ek lanklaas die bord gehad het, het ek skaars ondersoek ingestel. Die keer dat ek dit gebruik het, was dit al 'n gereedskapkode wat alreeds geskep is, maar sonder veel belangstelling om regtig te leer hoe dit werk, maar bloot met die doel om dit te laat werk en vir my nuttig te wees. Hierdie kersfees het ek die Geboorte van die Geboorte 'n bietjie afgestem met 'n paar LED's en 'n HC-SR04 ultraklank sensor. En ek het stilgehou om te kyk wat daar gedoen moes word.

Ek wou net verskillende dinge doen met twee LED's van dieselfde sein. Oeps. Ek het vinnig afgekom op wat ek dink sal wees een van die eerste beperkings wat u teëkom wanneer u met Arduino begin mors. En u hoef dit nie te ingewikkeld te maak nie. Ek praat net van 'n paar LED's, jy besef dat jy nie reg kan doen wat jy wil nie.

Laat ons dit van die begin af duidelik maak multitasking bestaan ​​nie in Arduino nie, twee take kan nie parallel verwerk word nie. Maar daar is tegnieke om so vinnig oproepe te maak dat dit lyk asof hulle saamwerk.

Ek vertel die saak in meer besonderhede. Met Kersfees het ek 'n geboorte-toneel opgestel en wou hê dat sekere geboorte-ligte moes brand wanneer my dogters naderkom. Niks ingewikkeld nie. Ek wou net hê dat twee takke geleide ligte anders moes werk as die waardes van 'n nabyheidssensor.

Ek wou toe iemand nader as 10 cm kom

  • Een van die takke van die ligte wat na die sterre sou gaan, sou vir 10 sekondes bly
  • Dat die ander een wat binne-in die huise sou gaan, vir 10 sekondes sou bly, maar omdat hulle van die kersttoneel geskei het.

Eenvoudig nee? aangesien dit vir u groot probleme kan veroorsaak. Omdat Arduino nie multitasking kan doen nie, voer hy die een opdrag na die ander uit.

 

stroombaan-monteer-LED's wat flikker en ultrasoniese multitasking

Ek het 'n montage met die HC-SR04 ultrasoniese sensor en 2 LED's, elkeen sou gelyk wees aan 'n tak van die Bethlehem. Die eerste deel is nie baie snaaks nie, want dit is om die opstel en werking van die ultraklanksensor in die LOOP in te stel, maar u kan dit op duisende plekke vind. Soos 'n ander dag, as ek meer ondersoek, doen ek 'n spesiale, want nou is u hier (jammer om nie krediete te plaas nie, maar ek kan nie onthou waar ek dit vandaan kry nie)

HC-SR04-kode op Arduino

int geleiPin1 = 8; int geleiPin2 = 7; langafstand; lang tyd; lang huidige tyd; lang tydgemaakte; nietige opstelling () {// initialiseer digitale pen LED_BUILTIN as uitset. pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); Serial.begin (9600); pinMode (3, UITVOER); / * aktivering van pen 9 as uitset: vir die ultrasoniese pols * / pinMode (2, INPUT); / * aktivering van pen 8 as invoer: ultraklank weieringstyd * /} // die lusfunksie loop oor en oor vir ewig nietige lus () {digitalWrite (3, LOW); / * As gevolg van sensorstabilisering * / vertraging Mikrosekondes (5); digitalWrite (3, HOOG); / * stuur van die ultrasoniese pols * / vertraging Mikrosekondes (10); tyd = polsIn (2, HOOG); / * Funksie om die lengte van die inkomende pols te meet. Meet die tyd wat verloop tussen die versending van die ultrasoniese pols en wanneer die sensor die weiering ontvang, dit wil sê: vanaf wanneer pen 12 die weiering begin ontvang, HOOG totdat dit ophou, LAAG, die lengte van die inkomende pols * / afstand = int (0.017 * tyd); / * formule om die afstand te bereken wat 'n heelgetalwaarde verkry * / / * Monitering in sentimeter deur die seriële monitor * / Serial.println ("Afstand"); Serial.println (afstand); Serial.println ("cm"); vertraging (1000);

Hiermee sal die afstand wat deur die ultraklanksensor gemeet word, hersien en gestoor word

LEDS-werkingoplossing

Die eerste ding wat by u opkom, is om vertragings te begin opstel. Ek weet nie hoekom nie, maar alle beginners dink aan vertraging () en dit beperk die opsies aansienlik, want tydens die gebruik van vertraging () werk die bord nie verder nie en daarom kan u niks anders doen gedurende die opskortingstyd nie. Die oplossing is om millis () te gebruik

Hier het ek 'n eenvoudige oplossing gevind gebaseer op if en tellers. Soos 'n onderwyser van my gesê het, kan enigiets met baie ifs in 'n ry geprogrammeer word. Maar die waarheid is natuurlik nie baie elegant nie.

// as die afstand kleiner is as 10, skakel ons die twee LED's of takke aan en begin die tyd tel met millis () as (afstand <10) {digitalWrite (ledPin1, HIGH); digitalWrite (ledPin2, HOOG); huidige tyd = millis (); } // as die afstand groter is as 10, sal ons die tyd wat verloop het sedert dit aangeskakel is, kontroleer en as dit groter is as die aangeduide, sal ons die LED1 afskakel as (afstand> 10) {timepast = millis () - huidige tyd ; digitalWrite (ledPin1, LOW); // as die afstand groter is as 10000, skakel ons LED2 uit as (timepast> 10000) {digitalWrite (ledPin2, LOW); }}}

Wat hierdie kode beoog, is dat Arduino voortdurend die drie ifs uitvoer sodat dit so vinnig deur hulle gaan dat dit lyk asof hy verskeie dinge gelyktydig doen. Maar soos ons reeds weet, word die sinne steeds een vir een uitgevoer.

Sodra die afstand gemeet en in die veranderlike gestoor word distancia, sou die ifs geëvalueer word:

  • Die eerste kyk of die afstand kleiner is as die gewenste 10 cm. As dit die geval is, skakel ons die twee LED's aan en begin die tyd tel met millis ()
  • en ons sal na die tweede gaan as vir die afstand groter as 10 cm. As dit voldoen, bereken ons die tyd wat verbygegaan het en lei 1 af, wat slegs van die afstand afhang.
  • Ons sal na die derde gaan as ons kyk of daar meer as 10 sekondes verloop het sedert die teller geaktiveer is, en indien wel, skakel pin 2 uit
  • En so gaan die lus aan. En weer.

Uiteindelik, en hoewel die oplossing gewerk het, was dit vir my duidelik dat hierdie probleem deur baie mense moes ervaar word en dat daar 'n meer ortodokse oplossing moes wees. Ek het begin soek en ek het 'n goeie een gevind (wat sekerlik nie die enigste is nie) van die seuns van Adafruit en objekgerigte programmering. Dit bestaan ​​uit die skep van voorwerpe met gedefinieerde klasse om vinnige oproepe te maak en die kode nie honderde kere in ons program hoef te herhaal nie.

Wat op die ou end "dieselfde" is as my oplossing met if +, maar baie eleganter, en dit bied 'n baie meer leesbare en doeltreffender kode.

Die bestuur van multitasking lei onvermydelik tot tydsbestuur in Arduino. Aanvanklik is dit nie in die artikel opgeneem nie, maar ek dink dit is baie interessant.

Arduino en tydfunksies

Soos ek reeds kommentaar gelewer het Ek dink daar is 'n groot afhanklikheid met vertraging () , moontlik omdat mense wat begin, hierdie funksie sien in al die voorbeelde wat gewoonlik van 'n knippie af na enige verkeerslig of enige manipulasie van LED's aan en uit geplaas word.

Vertraging het 'n baie groot probleem, en dit is wanneer ons 'n oproep doen vertraging () vir 'n tyd lank stop alles. Die bord lees geen sensor nie, en gaan ook nie voort om vonnisse uit te voer of enigiets te doen nie, wag net vir die tyd wat ons gesê het dit moet verbygaan en natuurlik as ons die bord vir meer as een ding wil gebruik dieselfde tyd is dit nie lewensvatbaar nie.

Ons sal moet kyk na milis () Selfs vertragingMikrosekondes () En ons het ook mikro's () wat die aantal mikrosekondes terugstuur sedert die program begin is

Knip sonder versuim

'N Goeie voorbeeld om te sien hoe dit werk bestuur die mitiese Blink, maar sonder die vertraging. Die belangrikste verskil is om die vertragingsfunksie () te vergeet en millis () te gebruik om die verstreke tyd tussen bewerkings te kan tel.

2 kommentaar op "Arduino multitasking and time management"

  1. Om te weet van die bestaan ​​van onderbrekings in Arduino, kan u help om programme met 'n sekere mate van multitasking te implementeer.

    antwoord

Skryf 'n opmerking