multitasking har ført datamaskinene til en revolusjon der ett eller flere programmer kan kjøre samtidig som øker effektivitet, fleksibilitet, tilpasningsevne og produktivitet. I innebygde systemer kan mikrokontrollere også håndtere Multitasking og utfører to eller flere oppgaver samtidig uten å stoppe gjeldende instruksjoner.

Her i denne opplæringen vil vi lære Hvordan Arduino utfører Multitasking Med Arduino millis funksjon. Vanligvis brukes en delay () – funksjon I Arduino for en periodisk oppgave Som LED Blinker, men denne delay () – funksjonen stopper programmet for en endelig tid og tillater ikke andre operasjoner å utføre. Så denne artikkelen forklarer hvordan Vi kan unngå bruk av delay () – funksjonen og erstatte den med millis() for å utføre flere oppgaver samtidig og gjøre Arduino Til En Multitasking-kontroller. Før vi går i detalj, la oss starte Med understating Multitasking.

Hva Er Multitasking?

Multitasking betyr ganske enkelt å utføre mer enn en oppgave eller et program samtidig samtidig. Nesten alle operativsystemer har multitasking. Denne typen operativsystemer er KJENT SOM MOS (multitasking operativsystem). MOS kan være mobil Eller stasjonær Pc Operativsystem. Det gode eksempelet på multitasking i datamaskiner er når brukerne kjører e-postprogrammet, nettleseren, mediespilleren, spillene samtidig, og hvis brukerne ikke vil bruke programmet, kjører det i bakgrunnen hvis det ikke er lukket. Sluttbrukeren bruker alle disse programmene samtidig, MEN OS tar dette konseptet litt annerledes. La oss diskutere hvordan OS håndterer multitasking.

Hva Er Multitasking I Arduino

som vist på bildet deler CPU tiden i de tre like delene og tilordner hver del til hver oppgave / applikasjon. Slik gjøres multitasking i de fleste systemene. Konseptet vil være nesten det samme For Arduino Multitasking, bortsett fra at tidsfordelingen vil være litt annerledes. Siden Arduino kjører i lav frekvens og RAM i forhold Til Bærbar Pc/Mobil / PC, vil tiden til hver oppgave også være forskjellig. Arduino har også en delay () – funksjon som brukes mye. Men før du starter, la oss diskutere det hvorfor vi ikke bør bruke delay () – funksjonen i et prosjekt.

hvorfor hoppe over forsinkelse() I Arduino?

hvis referansedokumentasjonen Til Arduino vurderes, er det to typer forsinkelsesfunksjoner, den første er forsinkelse () og den andre er delayMicroseconds (). Begge funksjonene er identiske når det gjelder å generere forsinkelse. Hvis vi skriver forsinkelse (1000), vil forsinkelsen være på 1000 millisekunder, dvs. 1 sekund. Hvis vi skriver delaymicrosekunder (1000), vil forsinkelsen være på 1000 mikrosekunder, dvs. 1 millisekunder.

her kommer poenget, begge funksjonene pause programmet for hvor mye tid som er gått i forsinkelsesfunksjonen. Så hvis vi gir en forsinkelse på 1 sekund, kan prosessoren ikke gå til neste instruksjon til 1 sekund passert. På samme måte hvis forsinkelsen er 10 sekunder, vil programmet stoppe i 10 sekunder, og prosessoren vil ikke tillate å gå til de neste instruksjonene til 10 sekunder passert. Dette hemmer ytelsen til mikrokontrolleren når det gjelder hastighet og utførelse av instruksjonene.

det beste eksemplet for å forklare ulempen med forsinkelsesfunksjonen er å bruke to trykknapper. Tenk på at vi vil bytte to Lysdioder ved hjelp av to trykknapper. Så hvis en trykknapp trykkes, skal den tilsvarende LYSDIODEN lyse i 2 sekunder, på samme måte hvis andre skyves, SKAL LYSDIODEN lyse i 4 sekunder. Men når vi bruker forsinkelse(), hvis brukeren trykker på den første knappen, stopper programmet i 2 sekunder, og hvis brukeren trykker på den andre knappen før 2 sekunder forsinkelse, vil mikrokontrolleren ikke godta inngangen da programmet er i stoppstadium.den offisielle dokumentasjonen til Arduino nevner dette tydelig i Sine Notater og Advarsler om forsinkelse () funksjonsbeskrivelse. Du kan gå gjennom og sjekke dette ut for å gjøre det tydeligere.

hvorfor bruke millis() ?

for å overvinne problemet forårsaket av å bruke forsinkelse, bør en utvikler bruke millis () – funksjonen som er enkel å bruke når du blir vanlig, og den vil bruke 100% CPU-ytelse uten å generere noen forsinkelse i å utføre instruksjonene. millis () er en funksjon som bare returnerer mengden millisekunder som har gått siden Arduino-styret begynte å kjøre det nåværende programmet uten å fryse programmet. Dette tidsnummeret vil overflyte (dvs. gå tilbake til null), etter omtrent 50 dager.Akkurat Som Arduino har delayMicroseconds (), har den også mikroversjonen av millis () som micros (). Forskjellen mellom micros og millis er at micros () vil overflyte etter omtrent 70 minutter, sammenlignet med millis () som er 50 dager. Så avhengig av programmet kan du bruke millis () eller micros ().

Using millis() instead of delay():

for å bruke millis () for timing og forsinkelse, må du registrere og lagre tiden som handlingen fant sted for å starte tiden og deretter sjekke med intervaller om den definerte tiden har gått. Så som nevnt, lagre gjeldende tid i en variabel.

unsigned long currentMillis = millis();

Vi trenger to variabler for å finne ut om den nødvendige tiden har gått. Vi har lagret gjeldende tid i currentMillis variabel, men vi må også vite at når begynte tidsperioden og hvor lenge er perioden. Så Intervallet og forrigemillis er erklært. Intervallet vil fortelle oss tidsforsinkelsen og previosMillis vil lagre siste gang hendelsen har skjedd.

for å forstå dette, la oss ta et eksempel på en enkel blinkende LED. Perioden = 1000 vil fortelle OSS AT LED vil blinke i 1 sekund eller 1000ms.

const int ledPin = 4; // the LED pin number connectedint ledState = LOW; // used to set the LED stateunsigned long previousMillis = 0; //will store last time LED was blinkedconst long period = 1000; // period at which to blink in msvoid setup() { pinMode(ledPin, OUTPUT); // set ledpin as output}void loop() { unsigned long currentMillis = millis(); // store the current time if (currentMillis - previousMillis >= period) { // check if 1000ms passed previousMillis = currentMillis; // save the last time you blinked the LED if (ledState == LOW) { // if the LED is off turn it on and vice-versa ledState = HIGH; } else {ledState = LOW;} digitalWrite(ledPin, ledState);//set LED with ledState to blink again }}

her er setningen <if (currentMillis – previousMillis >= periode)> kontrollerer om 1000ms har passert. Hvis 1000ms har passert, blinker LYSDIODEN og kommer igjen til samme tilstand. Og dette fortsetter. Det er det, vi har lært å bruke millis i stedet for forsinkelse. På denne måten vil det ikke stoppe programmet for bestemt intervall.

Avbrudd I Arduino fungerer på samme måte som i andre mikrokontrollere. Arduino UNO-brettet har to separate pinner for å feste avbrudd på GPIO-pin 2 og 3. Vi har dekket det i detalj I Arduino Interrupts Tutorial, hvor du kan lære mer om Avbrudd og hvordan du bruker dem.

Her vil Vi vise Arduino Multitasking ved å håndtere to oppgaver samtidig. Oppgavene vil inkludere blinking av To Lysdioder i forskjellig tidsforsinkelse sammen med en trykknapp som vil bli brukt til å kontrollere PÅ / AV-tilstanden TIL LED. Så tre oppgaver vil bli utført samtidig.

Kretsdiagram For Arduino Multitasking

Komponenter Som Kreves

  • Arduino UNO
  • Tre Lysdioder(Hvilken Som Helst Farge)
  • Motstander (470, 10k)
  • Hoppere
  • Brødfjel
  • Kretsdiagram

    kretsdiagrammet for å demonstrere bruken av arduino millis() Fuction Er Veldig Enkelt og har ikke mye komponenter å feste som vist nedenfor.

    Kretsdiagram For Arduino Multitasking ved Hjelp Av Arduino Millis () - Funksjonen

    Programmering Av arduino UNO for multitasking

    Programmering Av arduino UNO for multitasking vil bare kreve logikken bak hvordan millis () fungerer som forklart ovenfor. Det anbefales å øve blink LED med millis igjen og igjen for å gjøre logikken klar og gjøre deg komfortabel med millis() før Du begynner å programmere Arduino UNO for multitasking. I denne opplæringen brukes avbruddet også med millis () samtidig for multitasking. Knappen vil være en avbrudd. Så når en avbrudd genereres, dvs. trykknappen trykkes, VIL LYSDIODEN bytte til på eller AV-tilstand.

    programmeringen starter med å erklære pin-nummer der Lysdioder og Trykknapp er koblet til.

    int led1 = 6;int led2 = 7;int toggleLed = 5;int pushButton = 2;

    neste skriver vi en variabel for å lagre Statusen Til Lysdioder for fremtidig bruk.

    int ledState1 = LOW;int ledState2 = LOW;

    akkurat som forklart ovenfor i blink eksempel, variablene for periode og previousmillis er erklært å sammenligne og generere forsinkelse For Lysdioder. Den første LYSDIODEN blinker etter hvert 1. sekund og en ANNEN LED blinker etter 200ms.

    unsigned long previousMillis1 = 0; const long period1 = 1000;unsigned long previousMillis2 = 0;const long period2 = 200; 

    En annen millis-funksjon vil bli brukt til å generere debounce-forsinkelsen for å unngå flere trykk på trykknappen. Det vil være lignende tilnærming som ovenfor.

    int debouncePeriod = 20; int debounceMillis = 0;

    de tre variablene vil bli brukt til å lagre status for trykknapp som avbrudd, veksle LED og trykknapp tilstand.

    bool buttonPushed = false;int ledChange = LOW; int lastState = HIGH;

    Definer handlingen av pin som hvilken pin vil fungere SOM INNGANG eller UTGANG.

     pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(toggleLed, OUTPUT); pinMode(pushButton, INPUT);

    definer nå avbruddspinnen Ved å feste avbrudd med definisjon AV ISR og avbruddsmodus. Merk at det anbefales å bruke digitalPinToInterrupt (pin_number) når deklarerer attachInterrupt () – funksjonen for å oversette den faktiske digitale pin til det bestemte avbruddsnummeret.

    attachInterrupt(digitalPinToInterrupt(pushButton), pushButton_ISR, CHANGE); 

    avbryt-subrutinen er skrevet, og den vil bare endre det knapppushede flagget. Merk at avbryt subrutine bør være så kort som mulig, så prøv å skrive det og minimere de ekstra instruksjonene.

    void pushButton_ISR(){ buttonPushed = true; }

    Loop starter med å lagre millis-verdien i en currentMillis-variabel som vil lagre verdien av tiden som er gått hver gang sløyfen iterates.

    unsigned long currentMillis = millis();

    det er totalt tre funksjoner i multitasking, blink EN LED på 1 sekund, Blink andre LED på 200ms og hvis trykknappen trykkes deretter slå AV / PÅ LED. Så vi vil skrive tre deler for å gjøre denne oppgaven.

    den første er veksler LED-tilstand etter hvert 1 sekund ved å sammenligne millis forløpt.

     if (currentMillis - previousMillis1 >= period1) { previousMillis1 = currentMillis; if (ledState1 == LOW) { ledState1 = HIGH; } else { ledState1 = LOW; } digitalWrite(led1, ledState1); }

    På samme måte bytter den andre LYSDIODEN ETTER hver 200ms ved å sammenligne den forløpte millisen. Forklaringen er allerede forklart tidligere i denne artikkelen.

     if (currentMillis - previousMillis2 >= period2) { previousMillis2 = currentMillis; if (ledState2 == LOW) { ledState2 = HIGH; } else { ledState2 = LOW; } digitalWrite(led2, ledState2); }

    Til Slutt overvåkes det knapppressede flagget, og etter å ha generert en debounce-forsinkelse på 20ms, veksler DET BARE LED-TILSTANDEN tilsvarer trykknappen festet som avbrudd.

     if (buttonPushed = true) // check if ISR is called { if ((currentMillis - debounceMillis) > debouncePeriod && buttonPushed) // generate 20ms debounce delay to avoid multiple presses { debounceMillis = currentMillis; // save the last debounce delay time if (digitalRead(pushButton) == LOW && lastState == HIGH) // change the led after push button is pressed { ledChange = ! ledChange; digitalWrite(toggleLed, ledChange); lastState = LOW; } else if (digitalRead(pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }

    Dette fullfører Arduino millis() Opplæringen. Merk at for å bli vanlig med millis(), bare trene for å implementere denne logikken i noen andre applikasjoner. Du kan også utvide den til å bruke motorer, servomotorer, sensor og andre eksterne enheter. Hvis du er i tvil, vennligst skriv til vårt forum eller kommentar nedenfor.

    Komplett kode og Video for å demonstrere bruken av millis-funksjonen I Arduino er gitt nedenfor.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert.