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); ) )