Arduino gre na začetek programa po pogoju. Arduino zanke. Pogoj in razvejanje v besedilu programa

Oblikovanje za uporablja se za ponavljanje bloka stavkov, zaprtih v zavitih oklepajih. Števec povečanja se običajno uporablja za povečanje in prekinitev zanke. Operater za Primerno za vsako ponavljajočo se dejavnost in se pogosto uporablja v povezavi z nizi za zbiranje podatkov/izhodov.

Glava zanke za je sestavljen iz treh delov:

za (inicializacija ; stanje ; prirastek) (operatorji, ki se izvajajo v zanki)

Inicializacija se izvede najprej in samo enkrat. Vsakič v zanki se preveri pogoj, če je resničen, se izvede blok stavkov in inkrement, nato se pogoj ponovno preveri. Ko logična vrednost pogoja postane napačna, se zanka konča.

Primer

// Zatemnitev LED z uporabo pina PWM int PWMpin = 10; // LED v seriji z uporom 470 ohmov za 10 zatičev void setup() ( // nastavitev ni potrebna) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cikel za C je veliko bolj prilagodljiv kot zanke za v drugih programskih jezikih, na primer BASIC. Kateri koli ali vsi trije elementi glave so lahko izpuščeni, čeprav so podpičja obvezna. Poleg tega so lahko inicializacijski, pogojni in inkrementni stavki zanke kateri koli veljaven stavek C z neodvisnimi spremenljivkami in uporabljajo kateri koli podatkovni tip C, vključno s plavajočimi. Te so neobičajne za cikel za tipi operaterjev omogočajo programsko rešitev nekaterih nestandardnih problemov.

Na primer, z uporabo množenja v operatorju števca zanke lahko ustvarite logaritemsko napredovanje:

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

Ustvarjeno: 2,3,4,6,9,13,19,28,42,63,94

Drug primer, gladko zmanjševanje ali zvišanje ravni signala LED z enim ciklom za:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / preklopni nadzor pri največji zakasnitvi (10); ) )

Oblikovanje za uporablja se za ponavljanje bloka stavkov, zaprtih v zavitih oklepajih. Števec povečanja se običajno uporablja za povečanje in prekinitev zanke. Operater za Primerno za vsako ponavljajočo se dejavnost in se pogosto uporablja v povezavi z nizi za zbiranje podatkov/izhodov.

Glava zanke za je sestavljen iz treh delov:

za (inicializacija ; stanje ; prirastek) (operatorji, ki se izvajajo v zanki)

Inicializacija se izvede najprej in samo enkrat. Vsakič v zanki se preveri pogoj, če je resničen, se izvede blok stavkov in inkrement, nato se pogoj ponovno preveri. Ko logična vrednost pogoja postane napačna, se zanka konča.

Primer
// Zatemnitev LED z uporabo pina PWM int PWMpin = 10; // LED v seriji z uporom 470 ohmov za 10 zatičev void setup() ( // nastavitev ni potrebna) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cikel za C je veliko bolj prilagodljiv kot zanke za v drugih programskih jezikih, na primer BASIC. Kateri koli ali vsi trije elementi glave so lahko izpuščeni, čeprav so podpičja obvezna. Poleg tega so lahko inicializacijski, pogojni in inkrementni stavki zanke kateri koli veljaven stavek C z neodvisnimi spremenljivkami in uporabljajo kateri koli podatkovni tip C, vključno s plavajočimi. Te so neobičajne za cikel za tipi operaterjev omogočajo programsko rešitev nekaterih nestandardnih problemov.

Na primer, z uporabo množenja v operatorju števca zanke lahko ustvarite logaritemsko napredovanje:

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

Ustvarjeno: 2,3,4,6,9,13,19,28,42,63,94

Drug primer, gladko zmanjševanje ali zvišanje ravni signala LED z enim ciklom za:

Void loop() ( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; // krmiljenje preklopa pri največji zakasnitvi (10); ) )

« smo se naučili uporabljati zanko »for« za organizacijo delovanja krmilnika. Ta vrsta zanke se uporablja povsod in več kot pokriva "potrebo po operacijah zanke." Vendar pa obstaja še ena vrsta zanke - "medtem ko". Nič boljša od zanke for, le uporablja drugačna načela.

V večini primerov lahko izberete, katero od dveh vrst zank boste uporabili. V "while" smo uporabili za premor programa, dokler uporabnik ne vnese zahtevanih podatkov. V tej lekciji si bomo podrobneje ogledali, kako ta zanka deluje na primeru platforme Arduino.

Nadaljujmo z delom z vezjem, sestavljenim iz 2 LED.

Poleg tega bomo še naprej delali s kodo, ki smo jo dokončali v 14. lekciji.

Nazaj v preteklost: krmilnik pozove uporabnika k vnosu podatkov, počaka na vnos in nato dobljene vrednosti dodeli spremenljivkam utripatiŠtevilkaZelena in utripati ŠtevilkaRdeča. To omogoča uporabniku, da nadzira, kolikokrat utripa vsaka od 2 LED.

Če želite razširiti programerjev pogled na svet, se je vredno naučiti uporabljati dve vrsti zank za izvajanje istih nalog, v prihodnosti pa lahko pokažete naklonjenost eni ali drugi vrsti.

Ugotovimo, kako deluje:

int z= 1; // deklariramo spremenljivko in ji dodelimo vrednost 1

medtem (z<=10) { //запускаем цикл medtem

Serijski. println(z); //izdaj trenutno vrednost spremenljivkez prek serijskih vrat

z= z+1 // poveča vrednost spremenljivkezz 1

) // zaključimo zanko

Zanka while bo še naprej izvajala ukaze, dokler je "pogoj", opisan v oklepajih, resničen. V zgornjem primeru bo zanka še naprej izvajala ukaze, dokler je z manjši ali enak 10. Telo zanke izvaja 2 ukaza:

  • Izpis vrednosti spremenljivke prek serijskih vrat;
  • Povečanje vrednosti spremenljivke za 1 (znanstveno imenovano inkrementiranje).

S povečanjem vrednosti spremenljivke bo program na koncu zapustil zanko. Če si za trenutek predstavljamo, da smo pozabili določiti to vrstico ali pride do neke vrste napake, potem bo program veselo šel v zanko (z drugimi besedami, zamrznil bo).

Zanka začne svoje delo s preverjanjem resničnosti pogoja. Če je z manjši ali enak 10, potem program zažene zanko. Nato se ponovno preveri stanje itd. Ko vrednost spremenljivke doseže z = 11, pogoj ne bo več resničen. Program ne bo izvedel zanke in bo šel v naslednjo vrstico takoj za oklepajem zanke.

Dovolj teorije, pojdimo k praksi. Zamenjajmo zanke for v izvorni kodi z zankami while.

Utripanje, ki ga izvaja cikel FOR:

za (int i = 1; i<= blinkNumberGreen; i++) // kosilo cikelza

{

Serijski. tiskanje("zeleno utripa");

Serial.println(i);

digitalWrite(greenLed, HIGH); //vklopiti zelena Svetleča dioda

zamuda (timeOnGreenLed); //čakamo

digitalWrite(greenLed, LOW); //ugasni zelena Svetleča dioda

zamuda (timeOffGreenLed); //čakamo

}

Utripalnik v ciklu WHILE:

int jaz=1; //deklarirajte spremenljivko in ji dodelite vrednost 1

medtem ko jaz<= blinkNumberGreen)

{ // kosilo cikelmedtem

Serial.print("Zelena pomežiknil «);

Serial.println(i);

digitalWrite(greenLed,HIGH); //vklopiti zelena Svetleča dioda

zamuda (timeOnGreenLed); //čakamo

digitalWrite(greenLed,LOW); //ugasni zelena Svetleča dioda

zamuda (timeOffGreenLed); //čakamo

jaz= jaz+1 //povečaj vrednost spremenljivke za 1

}

Shranite program in naložite firmware v krmilnik. Poglejmo rezultat.

Zanke z uporabo stavkov za in medtem so eden najpomembnejših konstruktov jezika C++, ki je osnova Arduina. Najdete jih v čisto vsaki skici, tudi če tega ne poznate. V tem članku si bomo podrobneje ogledali zanke, ugotovili, kakšna je razlika med for in while, kako lahko z njihovo pomočjo poenostavite pisanje programa in katerim napakam se je treba izogibati.

Če ste še vedno programer začetnik in želite razumeti, kaj je zanka in zakaj je potrebna, si oglejte naslednji razdelek tega članka s podrobnim opisom.

Operator WHILE se uporablja v C++ in Arduinu za ponavljanje istih ukazov poljubno število krat. V primerjavi z zanko FOR je zanka WHILE videti enostavnejša, običajno se uporablja tam, kjer nam ni treba šteti števila iteracij v spremenljivki, ampak moramo le ponavljati kodo, dokler se kaj ne spremeni ali pride do nekega dogodka.

WHILE sintaksa

medtem(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

Vsak jezikovni konstrukt, ki vrne logično vrednost, se lahko uporabi kot pogoj. Pogoji so lahko primerjalne operacije, funkcije, konstante, spremenljivke. Kot pri vseh drugih logičnih operacijah v Arduinu bo vsaka vrednost razen nič zaznana kot resnična, nič pa kot napačna.

// Neskončna zanka while(true)( Serial.println("Čakanje..."); ) // Zanka, ki teče, dokler se vrednost funkcije checkSignal() ne spremeni while(!checkSignal())( Serial.println ("Čakanje ..."); )

Upoštevajte, da je stavek while mogoče uporabiti brez blokiranja bloka z zavitimi oklepaji; v tem primeru se bo ponovil prvi ukaz, ki se pojavi po zanki. Zelo odsvetovana je uporaba brez zavitih oklepajev, ker v tem primeru je zelo enostavno narediti napako. primer:

While(true) Serial.print("Čakanje na prekinitev"); zamuda (1000);

V tem primeru bo napis prikazan v neskončni zanki brez premorov, ker se ukaz delay(1000) ne bo ponovil. Za lovljenje takšnih napak lahko porabite veliko časa - veliko lažje je uporabiti zavit oklepaj.

Primer uporabe medtem ko zanka

Najpogosteje se medtem uporablja za čakanje na dogodek. Na primer, pripravljenost serijskega objekta za delo.

Serial.begin(9600); while (!Serial) ( ; // Nekatere plošče Arduino zahtevajo, da počakate, da se serijska vrata sprostijo)

Primer čakanja, da znak prispe iz zunanjih naprav preko UART:

While(Serial.available())( int byteInput = Seria.read(); // Nekatera druga dejanja)

V tem primeru bomo prebrali vrednosti​​, dokler Serial.available() vrne vrednost, ki ni enaka nič. Ko zmanjka vseh podatkov v medpomnilniku, se zanka ustavi.

Zanka FOR v Arduinu

V zanki FOR imamo možnost, da ne samo nastavimo robne pogoje, ampak tudi takoj definiramo spremenljivko za števec in navedemo, kako se bodo njegove vrednosti spremenile pri vsaki ponovitvi.

Sintaksa zanke FOR

Tu bo zasnova nekoliko bolj zapletena:
za (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

Najenostavnejši primer:

Za (int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

Takoj smo ustvarili spremenljivko, jo inicializirali in nakazali, da je treba na koncu vsakega cikla vrednost števca povečati za eno. In to je to – zdaj lahko uporabite spremenljivko znotraj zanke.

Spremenljivi korak je lahko drugačen. Tu so primeri:

  • for(int i=0; i<10; i=i+2) // Шаг 2
  • for(int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // Pojdi nazaj – od 10 do 1

do while zanke

V nekaterih primerih moramo zanko organizirati tako, da se navodila bloka izvedejo vsaj enkrat, nato pa se izvede preverjanje. Za takšne algoritme lahko uporabite konstrukcijo do while. primer:

Do ( Serial.println("Deluje"); ) medtem ko (checkSomething());

Ta različica zanke ne predstavlja nobenih težav - blok s pogoji smo preprosto premaknili navzdol, tako da se bo vsa vsebina znotraj zavitih oklepajev za operatorjem do izvedla pred prvim preverjanjem.

Nadaljujte in prekinite izjave

Obstajajo situacije, ko morate nujno prekiniti izvajanje zanke znotraj bloka zanke, ne da bi čakali na prehod na blok za preverjanje pogojev. Če želite to narediti, lahko uporabite operater odmor:

Medtem ko (true) ( ​​​​if (preveri nekaj()) ( prekinitev; ) )

Če želimo samo ustaviti napredek trenutne iteracije, vendar ne zapustiti zanke, ampak iti v blok za preverjanje pogojev, potem moramo uporabiti operator nadaljevati:

Medtem ko (true) ( ​​​​if (preveri nekaj()) (nadaljuj; ) )

Stavka continue in break je mogoče uporabiti z vsemi različicami zank FOR in WHILE.

Ugnezdene zanke v Arduinu

Vse različice zank je mogoče enostavno kombinirati med seboj in tako ustvariti ugnezdene strukture. Spremenljivke, definirane v bloku "prekrivajoče" zanke, bodo na voljo v notranji. Najpogostejši primer te vrste zanke je prečkanje dvodimenzionalnih nizov. V naslednjem primeru uporabljamo dvojno zanko: prva bo iterirala po vrsticah (spremenljivka i), druga, ugnezdena, pa po stolpcih (spremenljivka j) matrike, ki smo jo definirali v spremenljivki arr.

Int arr; void setup() ( for (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

Več o ciklih

Če še nikoli niste delali z zankami, se potopimo malo v svet teorije in ugotovimo, kaj so zanke in zakaj potrebujemo te skrivnostne jezikovne konstrukte.

Zakaj potrebujemo zanko?

Pravzaprav je glavna naloga zanke večkratno ponavljanje istih jezikovnih konstruktov. Ta potreba se pojavi v skoraj vsakem programu in zagotovo nobena skica Arduino ne more brez zanke - funkcija loop() se kliče tudi v neskončni zanki.

Poglejmo si naslednji primer. Hkrati morate napajati 5 LED diod, povezanih s ploščo Arduino od nožic 5 do 9. Najbolj očitna možnost za to bi bila postaviti pet navodil v vrsto:

digitalWrite(5, HIGH);

digitalWrite(6, HIGH);

digitalWrite(7, HIGH);

digitalWrite(8, HIGH);

digitalWrite(9, HIGH);

Zaenkrat zanemarimo vprašanje tveganosti takšnega dejanja, saj hkratna vključitev takšnega števila LED diod povzroči povečano obremenitev napajalnega tokokroga plošče. Glavna stvar za nas zdaj je, da smo ustvarili pet vrstic kode, od katerih se vsaka od drugih razlikuje le za eno števko. Ta pristop ima naslednje pomanjkljivosti:

  • Pri vsaki spremembi boste morali spremeniti več vrstic hkrati. Na primer, če moramo preklopiti LED diode na nožice 2 do 6 ali izklopiti napetost, namesto da bi jo vklopili, bomo morali narediti 5 sprememb kode. Kaj pa, če je več navodil in sprememb?
  • Velika koda z velikim številom podobnih navodil je neprijetna in neprijetna za branje. Pet enakih vrstic ni zelo strašljivo. Toda navada umazane kode bo sčasoma povzročila na desetine in stotine dodatnih strani v seznamu, zaradi česar boste vi in ​​vaši sodelavci obupani.
  • V procesu "copy-pasta" skoraj enakih navodil lahko zlahka naredite napako, na primer pozabite spremeniti številko pin: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Če anketarju pokažete to kodo, zlahka padete na razgovoru pri katerem koli običajnem podjetju za programsko opremo.

Iz vsega tega lahko sklepamo, da se je treba skoraj vedno izogibati ponovni uporabi istih nizov in jih nadomestiti z zankami. Poleg tega je v mnogih situacijah nemogoče brez ciklov, nič jih ne more nadomestiti. Med izvajanjem programa ne morete spremeniti števila ponovitev kode. Na primer, vsak element morate obdelati podatkovno polje, prejete od zunanjih naprav. Nikoli ne boste predvideli, koliko podatkov bo, kolikokrat se bo obdelava ponovila, zato ne boste mogli vstaviti zahtevanega števila navodil v času pisanja članka.

In tu nam na pomoč priskočijo cikli.

Sintaksna pravila

Zanka v Arduinu je poseben programski blok, ki bo med izvajanjem programa poklican določeno število krat. Znotraj tega bloka opisujemo same ukaze, ki jih bomo klicali, in pravila, po katerih bo krmilnik določal, kolikokrat jih je treba klicati.

V našem zgornjem primeru bi lahko krmilniku povedali naslednje:

Ponovite ukaz digitalWrite 5-krat

V idealnem svetu z robotskimi programerji bi bilo to verjetno dovolj, a ker se z računalnikom pogovarjamo v C++, moramo ta stavek prevesti v ta jezik:

Ponovite ukaz – morate uporabiti posebna navodila, ki povedo krmilniku, da se bo začelo nekaj zanimivega z zankami while ali for

digitalWrite – pustite, kot je, vendar ga enkrat napišite in zapičite v zavite oklepaje. Kaj storiti s pin številkami - tik spodaj.

5-krat – za to uporabite števec, ki bo z vsako ponovitvijo naraščal. Na začetku (ali koncu) bloka lahko primerjate vrednost tega števca z mejno vrednostjo (v tem primeru 5) z uporabo primerjalne operacije.

Poglejmo primer takega "prevedenega" ukaza zanke s stavkom while:

Int števec = 0; // Spremenljivka, ki bo shranila vrednost števca // Prosimo, da procesor ponavlja konstrukcijo v zavitih oklepajih, dokler pogoj v oklepajih ne vrne resničnega. // V našem primeru je števec naš števec, 5 je mejna vrednost, pogoj je, da je vrednost števca manjša od 5. // Lahko pa določimo povsem druge logične operatorje, medtem ko (števec< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

Tistim, ki so opazili napako v podani kodi, damo pet in zapišemo blok zanke drugače:

Medtem ko (števec< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

Enak rezultat je mogoče doseči z uporabo zanke FOR:

For(int counter =0; counter<5; counter ++){ digitalWrite(counter+5, HIGH); }

Kot lahko vidite, v tem primeru vse potrebne operacije s števcem takoj postavimo v eno navodilo FOR - to je veliko bolj priročno, če morate prešteti zahtevano količino.

Podrobne informacije o pravilih za uporabo zank lahko dobite v ustreznih razdelkih tega članka.

Zaključek

V tem članku smo si ogledali zelo pomembne konstrukcije jezika Arduino: zanki FOR in WHILE. Te operatorje lahko najdete v skoraj vsaki bolj ali manj zapleteni skici, saj bi bilo brez zank veliko operacij s podatki nemogoče. V sintaksi zank ni nič zapletenega - zlahka se jih navadite in jih lahko aktivno uporabljate v svojih projektih.

/ /

Za operaterja

Oblikovanje za uporablja se za ponavljanje bloka stavkov, zaprtih v zavitih oklepajih. Števec povečanja se običajno uporablja za povečanje in prekinitev zanke. Operater za Primerno za vsako ponavljajočo se dejavnost in se pogosto uporablja v povezavi z nizi za zbiranje podatkov/izhodov.

Glava zanke za je sestavljen iz treh delov:

za (inicializacija; stanje; prirastek) (operatorji, ki se izvajajo v zanki)

Inicializacija se izvede najprej in samo enkrat. Vsakič v zanki se preveri pogoj, če je resničen, se izvede blok stavkov in inkrement, nato se pogoj ponovno preveri. Ko logična vrednost pogoja postane napačna, se zanka konča.

Primer

// Zatemnitev LED z uporabo pina PWM int PWMpin = 10; // LED v seriji z uporom 470 ohmov za 10 zatičev void setup() ( // nastavitev ni potrebna) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cikel za C je veliko bolj prilagodljiv kot zanke za v drugih programskih jezikih, na primer BASIC. Kateri koli ali vsi trije elementi glave so lahko izpuščeni, čeprav so podpičja obvezna. Poleg tega so lahko inicializacijski, pogojni in inkrementni stavki zanke kateri koli veljaven stavek C z neodvisnimi spremenljivkami in uporabljajo kateri koli podatkovni tip C, vključno s plavajočimi. Te so neobičajne za cikel za tipi operaterjev omogočajo programsko rešitev nekaterih nestandardnih problemov.

Na primer, z uporabo množenja v operatorju števca zanke lahko ustvarite logaritemsko napredovanje:

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

Ustvarjeno: 2,3,4,6,9,13,19,28,42,63,94

Drug primer, gladko zmanjševanje ali zvišanje ravni signala LED z enim ciklom za:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / preklopni nadzor pri največji zakasnitvi (10); ) )