- Kas yra daugiafunkcinis darbas?
- Kodėl praleisti atidėjimą () „Arduino“?
- Kodėl naudoti milis ()?
- Būtini komponentai
- Grandinės schema
- „Arduino UNO“ programavimas daugybei užduočių
Daugiafunkcines lėmė kompiuterių revoliuciją, kai vienas ar daugiau programų galima paleisti vienu metu, kuris padidina efektyvumą, lankstumą, gebėjimą prisitaikyti ir produktyvumą. Įterptosiose sistemose mikrovaldikliai taip pat gali valdyti daugiafunkcines užduotis ir vienu metu atlikti dvi ar daugiau užduočių, nestabdydami dabartinių instrukcijų.
Čia, šioje pamokoje, sužinosime, kaip „Arduino“ atlieka daugiafunkcinį darbą su „ Arduino millis“ funkcija. Paprastai „ delay“ („delay“) funkcija naudojama „Arduino“ atliekant periodinę užduotį, pvz., „LED“ mirksi, tačiau ši „delay“) funkcija sustabdo programą tam tikrą laiką ir neleidžia atlikti kitų operacijų. Taigi šiame straipsnyje paaiškinama, kaip galime išvengti „delay“) funkcijos naudojimo ir pakeisti ją milis (), kad vienu metu atliktumėte daugiau nei vieną užduotį ir „Arduino“ paverstumėte daugiafunkciniu valdikliu. Prieš pradėdami detaliau, pradėkime nuo nepakankamo daugiafunkcinio darbo.
Kas yra daugiafunkcinis darbas?
Daugiafunkcinis darbas reiškia paprasčiausiai daugiau nei vienos užduoties ar programos vykdymą vienu metu vienu metu. Beveik visos operacinės sistemos yra daugiafunkcinės. Šios operacinės sistemos yra žinomos kaip MOS (daugiafunkcinė operacinė sistema). MOS gali būti mobiliojo arba stalinio kompiuterio operacinė sistema. Geras daugiafunkcinio darbo kompiuteriuose pavyzdys yra tai, kai vartotojai vienu metu paleidžia el. Pašto programą, interneto naršyklę, medijos leistuvą, žaidimus ir jei vartotojai nenori naudoti programos, kuri veikia fone, jei neuždaryta. Galutinis vartotojas naudoja visas šias programas vienu metu, tačiau OS šią koncepciją laiko šiek tiek kitokia. Aptarkime, kaip OS valdo daugiafunkcines užduotis.
Kaip matyti paveikslėlyje, procesorius padalija laiką į tris lygias dalis ir priskiria kiekvieną dalį kiekvienai užduočiai / programai. Taip daugumoje sistemų atliekamos daugiafunkcinės užduotys. „ Arduino Multitasking “ koncepcija bus beveik tokia pati, išskyrus tai, kad laiko paskirstymas bus šiek tiek kitoks. Kadangi „Arduino“ veikia žemu dažniu ir RAM, palyginti su nešiojamuoju / mobiliuoju / asmeniniu kompiuteriu, kiekvienai užduočiai skirtas laikas taip pat bus skirtingas. „Arduino“ taip pat turi „ delay“ () funkciją, kuri naudojama plačiai. Bet prieš pradėdami aptarkime, kodėl neturėtume naudoti delay () funkcijos bet kuriame projekte.
Kodėl praleisti atidėjimą () „Arduino“?
Jei atsižvelgiama į „Arduino“ informacinius dokumentus, yra dviejų tipų vėlavimo funkcijos: pirmoji yra delsa (), o antroji - delsaMikrosekundės (). Abi funkcijos yra identiškos vėlavimo generavimo prasme. Vienintelis skirtumas yra tas, kad, esant funkcijai delay (), perduotas parametro sveikasis skaičius nurodomas milisekundėmis, ty jei parašysime vėlavimą (1000), tai vėlavimas bus 1000 milisekundžių, ty 1 sekundė. Panašiai kaip funkcija delayMicroseconds (), perduotas parametras yra mikrosekundėmis, ty jei mes rašome delayMicroseconds (1000), tada vėlavimas bus 1000 mikrosekundžių, ty 1 milisekundė.
Čia ateina taškas, abi funkcijos pristabdo programą tiek laiko, kiek praeina uždelsimo funkcija. Taigi, jei mes suteikiame 1 sekundės vėlavimą, procesorius negali pereiti prie kitos instrukcijos, kol nepraeis 1 sekundė. Panašiai, jei vėlavimas yra 10 sekundžių, programa bus sustabdyta 10 sekundžių, o procesorius neleis vykdyti kitų instrukcijų, kol nepraeis 10 sekundžių. Tai apsunkina mikrovaldiklio veikimą, kalbant apie greitį ir vykdant instrukcijas.
Geriausias uždelsimo funkcijos trūkumų paaiškinimo pavyzdys yra dviejų mygtukų naudojimas. Apsvarstykite, ar norime perjungti du šviesos diodus naudodami du mygtukus. Taigi, jei paspaudžiamas vienas mygtukas, atitinkamas šviesos diodas turėtų šviesti 2 sekundes, panašiai, jei paspaudžiamas antrasis, šviesos diodas turėtų šviesti 4 sekundes. Bet kai mes naudojame atidėjimą (), jei vartotojas paspaudžia pirmąjį mygtuką, programa sustabdoma 2 sekundėms ir jei vartotojas paspaudžia antrąjį mygtuką prieš 2 sekundes, mikrovaldiklis nepriima įvesties, nes programa yra sustabdymo etape.
Oficialiuose „Arduino“ dokumentuose tai aiškiai paminėta funkcijos „Pastabos ir įspėjimai apie vėlavimą“ () aprašyme. Norėdami tai padaryti aiškiau, galite tai patikrinti.
Kodėl naudoti milis ()?
Norėdami įveikti uždelsimo problemą, kūrėjas turėtų naudoti milis () funkciją, kurią lengva naudoti, kai tapsite įprastas, ir ji naudos 100% procesoriaus našumą nesukeldama jokių uždelsimų vykdant instrukcijas. milis () yra funkcija, kuri tiesiog grąžina milisekundžių kiekį, praėjusį nuo tada, kai „Arduino“ plokštė pradėjo vykdyti dabartinę programą, neužšaldydama programos. Po maždaug 50 dienų šis laiko skaičius perpildys (ty grįš į nulį).
Panašiai kaip „Arduino“ turi „delayMicroseconds“ (), taip pat turi milis () kaip mikro mikroskopą (). Skirtumas tarp mikros ir milis yra tas, kad mikros () perpildys maždaug po 70 minučių, palyginti su milis (), kurios yra 50 dienų. Taigi, priklausomai nuo programos, galite naudoti milis () arba mikros ().
Naudojant milis (), o ne vėlavimą ():
Norėdami naudoti milis () laiko nustatymui ir atidėliojimui, turite užfiksuoti ir išsaugoti laiką, per kurį įvyko veiksmas, kad pradėtumėte laiką, o tada intervalais tikrinti, ar praėjo apibrėžtas laikas. Taigi, kaip nurodyta, saugokite dabartinį laiką kintamajame.
nepasirašyta ilga srovėMillis = milis ();
Mums reikia dar dviejų kintamųjų, kad sužinotume, ar praėjo reikalingas laikas. Dabartinį laiką išsaugojome „currentMillis“ kintamajame, tačiau taip pat turime žinoti, kad kada prasidėjo laiko periodas ir kiek laiko jis yra. Taigi deklaruojamas „ Interval“ ir „ PreviousMillis“ . Intervalas parodys laiko vėlavimą ir „previosMillis“ išsaugos paskutinį kartą, kai įvykis įvyko.
nepasirašytas ilgas ankstesnisMillis; nepasirašytas ilgas laikotarpis = 1000;
Norėdami tai suprasti, paimkime paprasto mirksinčio šviesos diodo pavyzdį. Laikotarpis = 1000 mums pasakys, kad šviesos diodas mirksi 1 sekundę arba 1000 ms.
const int ledPin = 4; // LED jungties numeris prijungtas int ledState = LOW; // naudojamas nustatyti LED būseną nepasirašytą ilgą ankstesnįMillis = 0; // išsaugos paskutinį kartą, kai šviesos diodas mirksėjo const long period = 1000; // laikotarpis, per kurį mirksi ms void setup () { pinMode (ledPin, OUTPUT); // nustatykite ledpiną kaip išvestį } void loop () { unsigned long currentMillis = millis (); // išsaugoti esamą laiką, jei (currentMillis - previousMillis> = periodas) {// patikrinkite, ar praėjo 1000ms ankstesnisMillis = currentMillis; // išsaugokite paskutinį kartą, kai mirksėjote šviesos diodu, jei (ledState == LOW) {// jei šviesos diodas yra išjungtas, įjunkite jį ir atvirkščiai ledState = HIGH; } dar { ledState = LOW; } digitalWrite (ledPin, ledState); // nustatykite, kad LED su ledState vėl mirksi } }
Čia pareiškimas
Pertraukimai „Arduino“ veikia taip pat, kaip ir kituose mikrovaldikliuose. „Arduino UNO“ plokštėje yra du atskiri kaiščiai pertraukimams pritvirtinti ant GPIO 2 ir 3 kontaktų. Mes tai išsamiai aptarėme „Arduino“ pertraukimų pamokoje , kur galite sužinoti daugiau apie pertraukimus ir jų naudojimą.
Čia parodysime „ Arduino Multitasking“, vienu metu tvarkydami dvi užduotis. Užduotyse bus mirksėti du šviesos diodai skirtingu laiko atidėjimu ir mygtukas, kuris bus naudojamas LED įjungimo / išjungimo būsenai valdyti. Taigi vienu metu bus atliekamos trys užduotys.
Būtini komponentai
- „Arduino UNO“
- Trys šviesos diodai (bet kokios spalvos)
- Atsparumai (470, 10k)
- Džemperiai
- Bandomoji Lenta
Grandinės schema
Grandinės schema, skirta parodyti „ Arduino Millis“ () fuction naudojimą, yra labai lengva ir neturi daug tvirtinamų komponentų, kaip parodyta žemiau.
„Arduino UNO“ programavimas daugybei užduočių
Norint užprogramuoti „Arduino UNO“ daugiafunkcinėms užduotims atlikti, reikės tik logikos, susijusios su aukščiau paaiškinta, kaip veikia milis (). Prieš pradedant programuoti „Arduino UNO“ daugiafunkciniam darbui, rekomenduojama vėl ir vėl naudoti mirksintį šviesos diodą naudojant milis, kad logika būtų aiški ir jaustumėtės naudodamiesi miliais (). Šioje pamokoje pertraukimas taip pat naudojamas kartu su milis () daugiafunkcinėms užduotims atlikti. Mygtukas bus pertraukimas. Taigi, kai generuojamas pertraukimas, ty paspaudžiamas mygtukas, šviesos diodas persijungs į ON arba OFF būseną.Programavimas prasideda deklaruojant kaiščių numerius, kur yra prijungti šviesos diodai ir mygtukas.
int led1 = 6; int led2 = 7; int perjungtiLed = 5; int mygtukas = 2;
Toliau mes rašome kintamąjį, kad išsaugotume šviesos diodų būseną būsimam naudojimui.
int ledState1 = LOW; int ledState2 = LOW;
Kaip paaiškinta pirmiau mirksinčiame pavyzdyje, deklaruojama, kad laikotarpio ir ankstesnio milijono kintamieji lygina ir generuoja delsą. Pirmasis šviesos diodas mirksi kas 1 sekundę, o kitas - 200 ms.
nepasirašytas ilgas ankstesnisMillis1 = 0; const ilgas laikotarpis1 = 1000; nepasirašytas ilgas ankstesnisMillis2 = 0; const ilgas laikotarpis2 = 200;
Kita milis funkcija bus naudojama sugeneruoti vėlavimą, kad būtų išvengta kelių paspaudimų. Bus panašus požiūris kaip ir aukščiau.
int debouncePeriod = 20; int debounceMillis = 0;
Į trys kintamieji bus naudojamas saugoti push mygtuką statusą nutraukti, Toggle LED ir stumti mygtuką būklę.
„Bool“ mygtukas Push = false; int ledChange = LOW; int lastState = AUKŠTAS;
Apibrėžkite kaiščio veiksmą, kuris kaištis veiks kaip įvestis arba išvestis.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (toggleLed, OUTPUT); pinMode („pushButton“, INPUT);
Dabar apibrėžkite pertraukimo kaištį, pridėdami pertraukimą su ISR apibrėžimu ir pertraukimo režimu. Atminkite, kad deklaruojant „ attachInterrupt“ () funkciją rekomenduojama naudoti „ digitalPinToInterrupt“ (PIN_number) , kad tikrasis skaitmeninis kaištis būtų paverstas konkrečiu pertraukimo numeriu.
attachInterrupt (digitalPinToInterrupt (pushButton), pushButton_ISR, CHANGE);
Pertraukimo paprogramė yra parašyta ir ji pakeis tik mygtuką „ Pushed“. Atkreipkite dėmesį, kad pertrauka paprogramė turėtų būti kuo trumpesnė, todėl pabandykite ją parašyti ir sumažinkite papildomas instrukcijas.
void pushButton_ISR () { buttonPushed = true; }
Ciklas prasideda milis vertės išsaugojimu „currentMillis“ kintamajame, kuriame bus išsaugota laiko vertė, praleista kiekvieną kartą, kai kilpa kartojasi.
nepasirašyta ilga srovėMillis = milis ();
Daugiafunkciniame darbe yra trys funkcijos: mirksi vienas šviesos diodas per 1 sekundę, mirksi antras šviesos diodas esant 200 ms ir jei paspaudžiamas mygtukas, tada išjunkite / įjunkite LED. Taigi šiai užduočiai atlikti parašysime tris dalis.
Pirmasis yra perjungiamas LED būseną po kiekvieno 1 sekundę lyginant Millis praėjo.
if (currentMillis - ankstesnisMillis1> = periodas1 ) { previousMillis1 = currentMillis; jei (ledState1 == LOW) { ledState1 = HIGH; } else { ledState1 = LOW; } digitalWrite (led1, ledState1); }
Panašiai, antrą kartą, jis perjungia šviesos diodą kas 200ms, palygindamas praėjusius milis. Paaiškinimas jau paaiškintas anksčiau šiame straipsnyje.
if (currentMillis - ankstesnisMillis2> = periodas2 ) { previousMillis2 = currentMillis; jei (ledState2 == LOW) { ledState2 = HIGH; } else { ledState2 = LOW; } digitalWrite (led2, ledState2); }
Galiausiai stebima „ buttonPushed“ vėliava, o sugeneravus 20ms vėlavimo vėlavimą, ji tiesiog perjungia šviesos diodo būseną, atitinkančią mygtuką, pridedamą kaip pertraukimą.
if (buttonPushed = true) // patikrinkite, ar ISR yra vadinamas { if ((currentMillis - debounceMillis)> debouncePeriod && buttonPushed) // generuoti 20ms atšaukimo uždelsimą, kad būtų išvengta kelių paspaudimų { debounceMillis = currentMillis; // išsaugoti paskutinį atšaukimo atidėjimo laiką, jei (digitalRead (pushButton) == LOW && lastState == HIGH) // pakeiskite lemputę paspaudus mygtuką { ledChange =! ledChange; digitalWrite (toggleLed, ledChange); lastState = LOW; } else if (digitalRead (pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }
Tai baigs „ Arduino millis“ () mokymo programą. Atkreipkite dėmesį, kad norėdami įprasti milis (), tiesiog praktikuokite įgyvendinti šią logiką kai kuriose kitose programose. Taip pat galite išplėsti jį naudodami variklius, servovariklius, jutiklius ir kitus išorinius įrenginius. Jei kyla abejonių, prašome parašyti mūsų forume arba komentuoti žemiau.
Pilnas kodas ir vaizdo įrašas, rodantis milis funkcijos naudojimą „Arduino“, pateikiamas žemiau.