Arduino ide na začiatok programu podľa podmienky. Arduino slučky. Podmienka a vetvenie v texte programu

Dizajn pre používa sa na zopakovanie bloku príkazov uzavretých v zložených zátvorkách. Počítadlo prírastkov sa zvyčajne používa na zvýšenie a ukončenie slučky. Operátor pre Vhodné pre akúkoľvek opakujúcu sa činnosť a často sa používa v spojení s poliami zberu údajov/výstupov.

Hlavička slučky pre pozostáva z troch častí:

pre (inicializácia ; stave ; prírastok) (operátory vykonávané v slučke)

Inicializácia sa vykoná ako prvá a iba raz. Zakaždým v slučke sa kontroluje podmienka, ak je pravdivá, vykoná sa blok príkazov a prírastok, potom sa podmienka skontroluje znova. Keď sa boolovská hodnota podmienky stane nepravdivou, cyklus sa skončí.

Príklad

// Stmievanie LED pomocou PWM pin int PWMpin = 10; // LED v sérii s 470 ohmovým odporom pre 10 pinov void setup() ( // nie je potrebné žiadne nastavenie) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cyklus pre C je oveľa flexibilnejší ako slučky pre v iných programovacích jazykoch, napríklad BASIC. Ktorýkoľvek alebo všetky tri prvky hlavičky môžu byť vynechané, hoci sú potrebné bodkočiarky. Tiež inicializácia slučky, podmienené a inkrementačné príkazy môžu byť ľubovoľným platným príkazom C s nezávislými premennými a môžu používať akýkoľvek typ údajov C vrátane plávajúcich. Tie sú pre cyklus nezvyčajné pre typy operátorov umožňujú poskytnúť softvérové ​​riešenie niektorých neštandardných problémov.

Napríklad použitie násobenia v operátori počítadla slučky vám umožňuje vytvoriť logaritmickú postupnosť:

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

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

Ďalší príklad, plynulé zníženie alebo zvýšenie úrovne signálu na LED pomocou jedného cyklu pre:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / ovládanie spínania pri maximálnom oneskorení(10); ) )

Dizajn pre používa sa na zopakovanie bloku príkazov uzavretých v zložených zátvorkách. Počítadlo prírastkov sa zvyčajne používa na zvýšenie a ukončenie slučky. Operátor pre Vhodné pre akúkoľvek opakujúcu sa činnosť a často sa používa v spojení s poliami zberu údajov/výstupov.

Hlavička slučky pre pozostáva z troch častí:

pre (inicializácia ; stave ; prírastok) (operátory vykonávané v slučke)

Inicializácia sa vykoná ako prvá a iba raz. Zakaždým v slučke sa kontroluje podmienka, ak je pravdivá, vykoná sa blok príkazov a prírastok, potom sa podmienka skontroluje znova. Keď sa boolovská hodnota podmienky stane nepravdivou, cyklus sa skončí.

Príklad
// Stmievanie LED pomocou PWM pin int PWMpin = 10; // LED v sérii s 470 ohmovým odporom pre 10 pinov void setup() ( // nie je potrebné žiadne nastavenie) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cyklus pre C je oveľa flexibilnejší ako slučky pre v iných programovacích jazykoch, napríklad BASIC. Ktorýkoľvek alebo všetky tri prvky hlavičky môžu byť vynechané, hoci sú potrebné bodkočiarky. Tiež inicializácia slučky, podmienené a inkrementačné príkazy môžu byť ľubovoľným platným príkazom C s nezávislými premennými a môžu používať akýkoľvek typ údajov C vrátane plávajúcich. Tie sú pre cyklus nezvyčajné pre typy operátorov umožňujú poskytnúť softvérové ​​riešenie niektorých neštandardných problémov.

Napríklad použitie násobenia v operátori počítadla slučky vám umožňuje vytvoriť logaritmickú postupnosť:

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

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

Ďalší príklad, plynulé zníženie alebo zvýšenie úrovne signálu na LED pomocou jedného cyklu pre:

Void loop() ( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; // ovládanie spínania pri maximálnom oneskorení (10); ) )

“, sme sa naučili používať slučku „for“ na organizáciu činnosti ovládača. Tento typ slučky sa používa všade a viac než pokrýva „potrebu opakovaných operácií“. Existuje však aj iný typ slučky - "zatiaľ čo". Nie je to o nič lepšie ako cyklus for, len používa iné princípy.

Vo väčšine prípadov si môžete vybrať, ktorý z dvoch typov slučiek použijete. V rámci sme použili „kým“ na pozastavenie programu, kým používateľ nezadá požadované údaje. V tejto lekcii sa bližšie pozrieme na to, ako táto slučka funguje na príklade platformy Arduino.

Pokračujme v práci s obvodom pozostávajúcim z 2 LED diód.

Okrem toho budeme pokračovať v práci s kódom, ktorý sme dokončili v lekcii 14.

Späť do minulosti: regulátor vyzve užívateľa na zadanie údajov, čaká na vstup a výsledné hodnoty potom priradí premenným blinkNumberGreen A blinkNumberČervená. To umožňuje užívateľovi ovládať, koľkokrát každá z 2 LED blikne.

Ak chcete rozšíriť svetonázor programátora, stojí za to naučiť sa používať dva typy slučiek na implementáciu rovnakých úloh a v budúcnosti môžete preukázať sympatie k jednému alebo druhému typu.

Poďme zistiť, ako to funguje:

int z= 1; // deklarujeme premennú a priradíme jej hodnotu 1

zatiaľ čo (z<=10) { //запускаем цикл zatiaľ čo

Serial. println(z); //vypíše aktuálnu hodnotu premennejz cez sériový port

z= z+1 // zvýšenie hodnoty premennejzo 1

) // ukončenie cyklu

Cyklus while bude pokračovať vo vykonávaní príkazov, pokiaľ platí „podmienka“ opísaná v zátvorkách. Vo vyššie uvedenom príklade bude cyklus pokračovať vo vykonávaní príkazov, pokiaľ z bude menšie alebo rovné 10. Telo cyklu vykoná 2 príkazy:

  • Výstup hodnoty premennej cez sériový port;
  • Zvýšenie hodnoty premennej o 1 (odborne nazývané inkrementácia).

Zvýšením hodnoty premennej program nakoniec opustí cyklus. Ak si na chvíľu predstavíme, že sme zabudli špecifikovať tento riadok alebo dôjde k nejakému zlyhaniu, program sa veselo dostane do slučky (inými slovami, zamrzne).

Slučka začína svoju prácu kontrolou pravdivosti podmienky. Ak je z menšie alebo rovné 10, program spustí cyklus. Potom sa znova skontroluje stav atď. Keď hodnota premennej dosiahne z = 11, podmienka už nebude pravdivá. Program nevykoná slučku a prejde na ďalší riadok ihneď po slučke zloženej zloženej zátvorky.

Dosť bolo teórie, prejdime k praxi. Nahraďte cykly for v zdrojovom kóde cyklami while.

Blikanie vykonávané cyklom FOR:

pre (int i = 1; i<= blinkNumberGreen; i++) // spustiť cyklupre

{

Serial. vytlačiť("Zelená bliká");

Serial.println(i);

digitalWrite(zelená LED, VYSOKÝ); //zapnúť zelená Dióda vyžarujúca svetlo

delay(timeOnGreenLed); //čakáme

digitalWrite(zelená LED, NÍZKA); //vypnúť zelená Dióda vyžarujúca svetlo

delay(timeOffGreenLed); //čakáme

}

Blikačka v cykle WHILE:

int i=1; //deklarujte premennú a priraďte jej hodnotu 1

kým<= blinkNumberGreen)

{ // spustiť cykluzatiaľ čo

Serial.print("zelená zažmurkal «);

Serial.println(i);

digitalWrite(zelenáLed,HIGH); //zapnúť zelená Dióda vyžarujúca svetlo

delay(timeOnGreenLed); //čakáme

digitalWrite(zelenaLed,LOW); //vypnúť zelená Dióda vyžarujúca svetlo

delay(timeOffGreenLed); //čakáme

i= i+1 //zvýšenie hodnoty premennej o 1

}

Uložte program a nahrajte firmvér do ovládača. Pozrime sa na výsledok.

Slučky pomocou príkazov pre A zatiaľ čo sú jedným z najdôležitejších konštruktov jazyka C++, ktorý je základom Arduina. Nachádzajú sa úplne v každom náčrte, aj keď o tom neviete. V tomto článku sa bližšie pozrieme na slučky, zistíme, aký je rozdiel medzi for a while, ako si s ich pomocou môžete zjednodušiť písanie programu a akým chybám sa treba vyhnúť.

Ak ste stále začínajúcim programátorom a chcete pochopiť, čo je slučka a prečo je potrebná, pozrite si ďalšiu časť tohto článku s podrobným popisom.

Operátor WHILE sa používa v C++ a Arduine na opakovanie rovnakých príkazov ľubovoľne veľakrát. Cyklus WHILE vyzerá oproti cyklu FOR jednoduchšie, zvyčajne sa používa tam, kde nepotrebujeme počítať počet iterácií v premennej, ale stačí opakovať kód, kým sa niečo nezmení alebo nenastane nejaká udalosť.

Syntax WHILE

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

Ako podmienky možno použiť akúkoľvek jazykovú konštrukciu, ktorá vracia boolovskú hodnotu. Podmienky môžu byť porovnávacie operácie, funkcie, konštanty, premenné. Rovnako ako pri iných logických operáciách v Arduine, každá hodnota iná ako nula bude vnímaná ako pravda, nula – nepravda.

// Nekonečná slučka while(true)( Serial.println("Waiting..."); ) // Cyklus, ktorý beží, kým sa nezmení hodnota funkcie checkSignal() while(!checkSignal())( Serial.println ("Čakám..."); )

Všimnite si, že príkaz while možno použiť bez blokovania bloku zloženými zátvorkami, v takom prípade sa zopakuje prvý príkaz, s ktorým sa stretnete po slučke. Dôrazne sa neodporúča používať bez kučeravých strojčekov, pretože v tomto prípade je veľmi ľahké urobiť chybu. Príklad:

While(true) Serial.print("Čaká sa na prerušenie"); oneskorenie(1000);

V tomto prípade sa nápis zobrazí v nekonečnej slučke bez prestávok, pretože príkaz delay(1000) sa nebude opakovať. Chytaním takýchto chýb môžete stráviť veľa času - je oveľa jednoduchšie použiť kučeravé ortézy.

Príklad použitia pričom slučka

Najčastejšie sa while používa na čakanie na nejakú udalosť. Napríklad pripravenosť Sériového objektu na prácu.

Serial.begin(9600); while (!Serial) ( ; // Niektoré dosky Arduino vyžadujú, aby ste počkali, kým sa uvoľní sériový port)

Príklad čakania na príchod postavy z externých zariadení cez UART:

While(Serial.available())( int byteInput = Seria.read(); // Niektoré ďalšie akcie)

V tomto prípade budeme čítať hodnoty, pokiaľ Serial.available() vracia nenulovú hodnotu. Po vyčerpaní všetkých údajov vo vyrovnávacej pamäti sa slučka zastaví.

slučka FOR v Arduine

V slučke FOR máme možnosť nielen nastaviť okrajové podmienky, ale aj okamžite definovať premennú pre počítadlo a naznačiť, ako sa budú meniť jej hodnoty pri každej iterácii.

Syntax cyklu FOR

Tu bude dizajn trochu komplikovanejší:
pre (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

Najjednoduchší príklad:

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

Okamžite sme vytvorili premennú, inicializovali ju a naznačili, že na konci každého cyklu by sa mala hodnota počítadla zvýšiť o jednu. A to je všetko - teraz môžete použiť premennú vo vnútri slučky.

Variabilný krok môže byť odlišný. Tu sú príklady:

  • 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–) // Späť – z 10 na 1

urobiť while slučku

V niektorých prípadoch musíme zorganizovať slučku tak, aby sa inštrukcie bloku vykonali aspoň raz a potom sa vykonala kontrola. Pre takéto algoritmy môžete použiť konštrukciu do while. Príklad:

Do ( Serial.println("Working"); ) while (checkSomething());

Táto verzia cyklu nepredstavuje žiadne ťažkosti – jednoducho sme presunuli blok s podmienkami nadol, takže všetok obsah vo zložených zátvorkách po operátore do sa vykoná pred prvou kontrolou.

Pokračujte a prerušte vyhlásenia

Existujú situácie, keď potrebujete urýchlene prerušiť vykonávanie cyklu vo vnútri bloku slučky bez čakania na prechod do bloku kontroly stavu. Na tento účel môžete použiť operátora prestávka:

Kým (pravda) (​if (checkSomething()) (prestávka; ) )

Ak chceme jednoducho zastaviť priebeh aktuálnej iterácie, ale neopustiť slučku, ale prejsť do bloku kontroly stavu, musíme použiť operátor ďalej:

Kým (pravda) (neak (checkSomething()) (pokračovať; ) )

Príkazy continue a break možno použiť so všetkými variantmi cyklov FOR a WHILE.

Vnorené slučky v Arduine

Akékoľvek varianty slučiek sa dajú ľahko navzájom kombinovať, čím sa vytvárajú vnorené štruktúry. Premenné definované v bloku „prekrývajúcej“ slučky budú dostupné vo vnútornej. Najbežnejším príkladom tohto druhu slučky je prechádzanie dvojrozmernými poľami. V nasledujúcom príklade použijeme dvojitý cyklus: prvý bude iterovať cez riadky (premenná i), druhý, vnorený, bude prechádzať cez stĺpce (premenná j) poľa, ktoré sme definovali v premennej 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]); } } }

Viac o cykloch

Ak ste nikdy nepracovali so slučkami, ponorme sa trochu do sveta teórie a prídeme na to, čo sú slučky a prečo potrebujeme tieto tajomné jazykové konštrukty.

Prečo potrebujeme slučku?

V skutočnosti je hlavnou úlohou cyklu niekoľkokrát opakovať tie isté jazykové konštrukcie. Táto potreba vzniká takmer v každom programe a určite sa ani jeden náčrt Arduina nezaobíde bez slučky – funkcia loop() sa volá aj v nekonečnej slučke.

Pozrime sa na nasledujúci príklad. Potrebujete napájať súčasne 5 LED diód pripojených k doske Arduino z kolíkov 5 až 9. Najzrejmejšou možnosťou by bolo umiestniť päť pokynov za sebou:

digitalWrite(5, HIGH);

digitalWrite(6, HIGH);

digitalWrite(7, HIGH);

digitalWrite(8, HIGH);

digitalWrite(9, HIGH);

Nateraz ignorujme otázku rizikovosti takejto akcie, pretože súčasné zahrnutie takého počtu LED vytvára zvýšené zaťaženie napájacieho obvodu dosky. Pre nás je teraz hlavné, že sme vytvorili päť riadkov kódu, z ktorých každý sa od ostatných líši len jednou číslicou. Tento prístup má nasledujúce nevýhody:

  • Pri akejkoľvek zmene budete musieť vykonať zmeny na mnohých riadkoch súčasne. Napríklad, ak potrebujeme prepnúť LED na kolíky 2 až 6 alebo vypnúť napätie namiesto zapnutia, budeme musieť urobiť 5 zmien v kóde. Čo ak existuje viac pokynov a zmien?
  • Veľký kód s veľkým počtom podobných pokynov je nepohodlný a nepríjemný na čítanie. Päť rovnakých línií nie je veľmi desivých. Zvyk špinavého kódu však nakoniec povedie k desiatkam a stovkám stránok navyše vo výpise, čo vás aj vašich kolegov privedie do zúfalstva.
  • V procese „kopírovania a vkladania“ takmer identických pokynov sa môžete ľahko pomýliť, napríklad keď zabudnete zmeniť číslo PIN: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Môžete ľahko zlyhať na pohovore v akejkoľvek normálnej softvérovej spoločnosti, keď ukážete anketárovi tento kód.

Z toho všetkého môžeme vyvodiť záver, že opakovanému používaniu tých istých strún znova a znova sa treba takmer vždy vyhnúť a nahradiť ho slučkami. Navyše v mnohých situáciách sa bez cyklov nezaobídete, nič ich nenahradí. Počas spustenia programu nemôžete zmeniť počet opakovaní kódu. Napríklad musíte spracovať každý prvok dátové pole, prijaté z externých zariadení. Nikdy nepredpovedáte, koľko údajov tam bude, koľkokrát sa bude spracovanie opakovať, a preto v čase písania článku nestihnete vložiť potrebný počet inštrukcií.

A tu nám pomáhajú cykly.

Pravidlá syntaxe

Slučka v Arduine je špeciálny programový blok, ktorý bude počas vykonávania programu volaný niekoľkokrát. V rámci tohto bloku popisujeme samotné príkazy, ktoré sa budú volať a pravidlá, podľa ktorých bude ovládač určovať, koľkokrát ich treba volať.

V našom príklade vyššie by sme mohli povedať ovládaču nasledovné:

Opakujte príkaz digitalWrite 5-krát

V ideálnom svete s programátormi robotov by to asi stačilo, ale keďže hovoríme s počítačom v C++, musíme túto frázu preložiť do tohto jazyka:

Opakujte príkaz – musíte použiť špeciálne inštrukcie, ktoré ovládaču oznámia, že sa začne niečo zaujímavé s while alebo for slučkami

digitalWrite – nechajte to tak, ale napíšte to raz a vložte do zložených zátvoriek. Čo robiť s číslami PIN - nižšie.

5-krát – použite na to počítadlo, ktoré sa bude každým opakovaním zvyšovať. Na začiatku (alebo na konci) bloku môžete porovnať hodnotu tohto počítadla s limitnou hodnotou (v tomto prípade 5) pomocou porovnávacej operácie.

Pozrime sa na príklad takéhoto „preloženého“ príkazu cyklu s príkazom while:

Int counter = 0; // Premenná, ktorá bude uchovávať hodnotu počítadla // Požiadame procesor, aby opakoval konštrukciu v zložených zátvorkách, kým podmienka v zátvorkách nevráti hodnotu true. // V našom prípade je počítadlo naše počítadlo, 5 je limitná hodnota, podmienkou je, aby hodnota počítadla bola menšia ako 5. // Ale môžeme zadať úplne iné logické operátory while (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

Pre tých, ktorí si všimli chybu v danom kóde, dáme päťku a blok slučky napíšeme inak:

Kým (počítadlo< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

Rovnaký výsledok možno dosiahnuť pomocou cyklu FOR:

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

Ako vidíte, v tomto prípade okamžite umiestnime všetky potrebné operácie s počítadlom do jednej inštrukcie FOR - je to oveľa pohodlnejšie, ak potrebujete spočítať požadované množstvo.

Podrobné informácie o pravidlách používania slučiek nájdete v príslušných častiach tohto článku.

Záver

V tomto článku sme sa pozreli na veľmi dôležité konštrukcie jazyka Arduino: slučky FOR a WHILE. Tieto operátory môžete nájsť takmer v každom viac či menej komplexnom náčrte, pretože bez slučiek by mnohé operácie s dátami boli nemožné. V syntaxi slučiek nie je nič zložité - ľahko si na ne zvyknete a môžete ich aktívne využívať vo svojich projektoch.

/ /

Pre operátora

Dizajn pre používa sa na zopakovanie bloku príkazov uzavretých v zložených zátvorkách. Počítadlo prírastkov sa zvyčajne používa na zvýšenie a ukončenie slučky. Operátor pre Vhodné pre akúkoľvek opakujúcu sa činnosť a často sa používa v spojení s poliami zberu údajov/výstupov.

Hlavička slučky pre pozostáva z troch častí:

pre (inicializácia; stave; prírastok) (operátory vykonávané v slučke)

Inicializácia sa vykoná ako prvá a iba raz. Zakaždým v slučke sa kontroluje podmienka, ak je pravdivá, vykoná sa blok príkazov a prírastok, potom sa podmienka skontroluje znova. Keď sa boolovská hodnota podmienky stane nepravdivou, cyklus sa skončí.

Príklad

// Stmievanie LED pomocou PWM pin int PWMpin = 10; // LED v sérii s 470 ohmovým odporom pre 10 pinov void setup() ( // nie je potrebné žiadne nastavenie) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Cyklus pre C je oveľa flexibilnejší ako slučky pre v iných programovacích jazykoch, napríklad BASIC. Ktorýkoľvek alebo všetky tri prvky hlavičky môžu byť vynechané, hoci sú potrebné bodkočiarky. Tiež inicializácia slučky, podmienené a inkrementačné príkazy môžu byť ľubovoľným platným príkazom C s nezávislými premennými a môžu používať akýkoľvek typ údajov C vrátane plávajúcich. Tie sú pre cyklus nezvyčajné pre typy operátorov umožňujú poskytnúť softvérové ​​riešenie niektorých neštandardných problémov.

Napríklad použitie násobenia v operátori počítadla slučky vám umožňuje vytvoriť logaritmickú postupnosť:

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

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

Ďalší príklad, plynulé zníženie alebo zvýšenie úrovne signálu na LED pomocou jedného cyklu pre:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / ovládanie spínania pri maximálnom oneskorení(10); ) )