Arduino ide na početak programa prema uvjetu. Arduino petlje. Stanje i grananje u tekstu programa

Oblikovati za koristi se za ponavljanje bloka naredbi omeđenih u vitičaste zagrade. Brojač povećanja obično se koristi za povećanje i prekid petlje. Operater za Prikladno za sve aktivnosti koje se ponavljaju i često se koristi u kombinaciji s nizovima za prikupljanje podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija ; stanje ; prirast) (operatori se izvršavaju u petlji)

Inicijalizacija se izvodi prva i samo jednom. Svaki put u petlji se provjerava uvjet, ako je istinit, izvršava se blok naredbi i inkrement, zatim se uvjet ponovno provjerava. Kada Booleova vrijednost uvjeta postane lažna, petlja završava.

Primjer

// Prigušivanje LED-a pomoću PWM pina int PWMpin = 10; // LED u seriji s otpornikom od 470 ohma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Ciklus za C je mnogo fleksibilniji od petlji za u drugim programskim jezicima, na primjer, BASIC. Bilo koji ili sva tri elementa zaglavlja mogu se izostaviti, iako su točke i zarezi obavezni. Također, naredbe za inicijalizaciju petlje, uvjetne i inkrementalne naredbe mogu biti bilo koje važeće C naredbe s neovisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neuobičajeno za ciklus za vrste operatora omogućuju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućuje vam stvaranje logaritamske progresije:

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

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

Drugi primjer, glatko smanjenje ili povećanje razine signala na LED-u pomoću jednog ciklusa za:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / upravljanje prebacivanjem pri maksimalnom kašnjenju (10); ) )

Oblikovati za koristi se za ponavljanje bloka naredbi omeđenih u vitičaste zagrade. Brojač povećanja obično se koristi za povećanje i prekid petlje. Operater za Prikladno za sve aktivnosti koje se ponavljaju i često se koristi u kombinaciji s nizovima za prikupljanje podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija ; stanje ; prirast) (operatori se izvršavaju u petlji)

Inicijalizacija se izvodi prva i samo jednom. Svaki put u petlji se provjerava uvjet, ako je istinit, izvršava se blok naredbi i inkrement, zatim se uvjet ponovno provjerava. Kada Booleova vrijednost uvjeta postane lažna, petlja završava.

Primjer
// Prigušivanje LED-a pomoću PWM pina int PWMpin = 10; // LED u seriji s otpornikom od 470 ohma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Ciklus za C je mnogo fleksibilniji od petlji za u drugim programskim jezicima, na primjer, BASIC. Bilo koji ili sva tri elementa zaglavlja mogu se izostaviti, iako su točke i zarezi obavezni. Također, naredbe za inicijalizaciju petlje, uvjetne i inkrementalne naredbe mogu biti bilo koje važeće C naredbe s neovisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neuobičajeno za ciklus za vrste operatora omogućuju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućuje vam stvaranje logaritamske progresije:

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

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

Drugi primjer, glatko smanjenje ili povećanje razine signala na LED-u pomoću jednog ciklusa za:

Void loop() ( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; // upravljanje prebacivanjem uz maksimalno kašnjenje (10); ) )

", naučili smo kako koristiti "for" petlju za organiziranje rada kontrolera. Ova vrsta petlje se koristi posvuda i više nego pokriva "potrebu za operacijama petlje". Međutim, postoji još jedna vrsta petlje - "while". Nije ništa bolje od for petlje, samo koristi drugačija načela.

U većini slučajeva možete odabrati koju ćete od dvije vrste petlji koristiti. Koristili smo "while" za pauziranje programa dok korisnik ne unese potrebne podatke. U ovoj lekciji pobliže ćemo pogledati kako ova petlja radi koristeći Arduino platformu kao primjer.

Nastavimo raditi sa krugom koji se sastoji od 2 LED diode.

Osim toga, nastavit ćemo raditi s kodom koji smo finalizirali u lekciji 14.

Nazad u prošlost: kontroler traži od korisnika podatke, čeka unos, a zatim dodjeljuje rezultirajuće vrijednosti varijablama treperiBrojZeleno I treptajBrojCrveno. To korisniku omogućuje kontrolu broja treptaja svake od 2 LED diode.

Da biste proširili svjetonazor programera, vrijedi naučiti koristiti dvije vrste petlji za implementaciju istih zadataka, au budućnosti možete pokazati simpatije prema jednoj ili drugoj vrsti.

Shvatimo kako to funkcionira:

int z= 1; // deklarirajte varijablu i dodijelite joj vrijednost 1

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

Serijski. println(z); //ispis trenutne vrijednosti varijablez putem serijskog porta

z= z+1 // povećanje vrijednosti varijablezod 1

) // završetak petlje

Dok petlja nastavit će izvršavati naredbe sve dok je "uvjet" opisan u zagradama istinit. U gornjem primjeru, petlja će nastaviti izvršavati naredbe sve dok je z manji ili jednak 10. Tijelo petlje izvršava 2 naredbe:

  • Izlaz vrijednosti varijable putem serijskog porta;
  • Povećanje vrijednosti varijable za 1 (znanstveno nazvano inkrementiranje).

Povećanjem vrijednosti varijable, program će na kraju izaći iz petlje. Ako na trenutak zamislimo da smo zaboravili navesti ovu liniju ili se dogodi neka vrsta kvara, tada će program sretno otići u petlju (drugim riječima, zamrznut će se).

Petlja počinje svoj rad provjerom istinitosti uvjeta. Ako je z manji ili jednak 10, tada program pokreće petlju. Zatim se ponovno provjerava stanje itd. Kada vrijednost varijable dosegne z = 11, uvjet više neće biti istinit. Program neće izvršiti petlju i otići će na sljedeći red odmah nakon vitičaste zagrade petlje.

Dosta teorije, idemo na praksu. Zamijenimo for petlje u izvornom kodu s while petljama.

Flasher izveden ciklusom FOR:

za (int i = 1; i<= blinkNumberGreen; i++) // lansirati ciklusza

{

Serijski. ispisati("Zeleno bljeskalo");

Serial.println(i);

digitalWrite(greenLed, HIGH); //upaliti zelena Dioda koja emitira svjetlo

odgoda(vrijemeOnGreenLed); //čekamo

digitalWrite(greenLed, LOW); //isključiti zelena Dioda koja emitira svjetlo

odgoda(timeOffGreenLed); //čekamo

}

Flasher u WHILE ciklusu:

int ja=1; //deklarirajte varijablu i dodijelite joj vrijednost 1

dok ja<= blinkNumberGreen)

{ // lansirati ciklusdok

Serial.print("zelena trepnuo «);

Serial.println(i);

digitalWrite(greenLed,HIGH); //upaliti zelena Dioda koja emitira svjetlo

odgoda(vrijemeOnGreenLed); //čekamo

digitalWrite(greenLed,LOW); //isključiti zelena Dioda koja emitira svjetlo

odgoda(timeOffGreenLed); //čekamo

ja= ja+1 //povećaj vrijednost varijable za 1

}

Spremite program i učitajte firmware u kontroler. Pogledajmo rezultat.

Petlje pomoću naredbi za I dok jedan su od najvažnijih konstrukata jezika C++ koji je u osnovi Arduina. Nalaze se u apsolutno svakoj skici, čak i ako to ne znate. U ovom ćemo članku pobliže pogledati petlje, saznati koja je razlika između for i while, kako uz njihovu pomoć možete pojednostaviti pisanje programa i koje pogreške treba izbjegavati.

Ako ste još programer početnik i želite razumjeti što je petlja i zašto je potrebna, pogledajte sljedeći odjeljak ovog članka s detaljnim opisom.

Operator WHILE koristi se u C++ i Arduinu za ponavljanje istih naredbi proizvoljan broj puta. U usporedbi s FOR petljom, WHILE petlja izgleda jednostavnije, obično se koristi tamo gdje ne trebamo brojati broj ponavljanja u varijabli, već jednostavno trebamo ponavljati kod dok se nešto ne promijeni ili ne dogodi neki događaj.

WHILE sintaksa

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

Bilo koja jezična konstrukcija koja vraća Booleovu vrijednost može se koristiti kao uvjet. Uvjeti mogu biti operacije usporedbe, funkcije, konstante, varijable. Kao i kod bilo koje druge logičke operacije u Arduinu, svaka vrijednost osim nule bit će percipirana kao istinita, a nula kao lažna.

// Beskonačna petlja while(true)( Serial.println("Čeka se..."); ) // Petlja koja radi dok se vrijednost funkcije checkSignal() ne promijeni while(!checkSignal())( Serial.println ("Čekam..."); )

Imajte na umu da se naredba while može koristiti bez blokiranja bloka vitičastim zagradama, u kojem slučaju će se ponoviti prva naredba na koju se naiđe nakon petlje. Izuzetno se ne preporučuje korištenje bez vitičastih zagrada jer u ovom slučaju vrlo je lako pogriješiti. Primjer:

While(true) Serial.print("Čekanje prekida"); kašnjenje (1000);

U tom slučaju, natpis će biti prikazan u beskonačnoj petlji bez pauza, jer se naredba delay(1000) neće ponavljati. Možete potrošiti puno vremena hvatajući takve pogreške - puno je lakše koristiti vitičastu zagradu.

Primjer upotrebe while petlja

Najčešće se dok koristi za čekanje nekog događaja. Na primjer, spremnost serijskog objekta za rad.

Serial.begin(9600); while (!Serial) ( ; // Neke Arduino ploče zahtijevaju da pričekate dok se serijski priključak ne oslobodi)

Primjer čekanja da znak stigne s vanjskih uređaja putem UART-a:

While(Serial.available())( int byteInput = Seria.read(); // Neke druge akcije)

U ovom slučaju, čitat ćemo vrijednosti sve dok Serial.available() vraća vrijednost koja nije nula. Nakon što ponestane svih podataka u međuspremniku, petlja će se zaustaviti.

FOR petlja u Arduinu

U FOR petlji imamo priliku ne samo postaviti granične uvjete, već i odmah definirati varijablu za brojač i naznačiti kako će se njegove vrijednosti mijenjati pri svakoj iteraciji.

FOR sintaksa petlje

Ovdje će dizajn biti malo kompliciraniji:
za (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

Najjednostavniji primjer:

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

Odmah smo stvorili varijablu, inicijalizirali je i naznačili da se na kraju svakog ciklusa vrijednost brojača treba povećati za jedan. I to je to – sada možete koristiti varijablu unutar petlje.

Promjenjivi korak može biti drugačiji. Evo primjera:

  • 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–) // Vrati se nazad – od 10 do 1

do while petlja

U nekim slučajevima moramo organizirati petlju na takav način da se instrukcije bloka izvode barem jednom, a zatim se provodi provjera. Za takve algoritme možete koristiti do while konstrukciju. Primjer:

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

Ova verzija petlje ne predstavlja nikakve poteškoće - jednostavno smo pomaknuli blok s uvjetima prema dolje, tako da će se svi sadržaji unutar vitičastih zagrada nakon do operatora izvršiti prije prve provjere.

Nastavi i prekini izjave

Postoje situacije kada morate hitno prekinuti izvođenje petlje unutar bloka petlje, bez čekanja da prijeđete na blok provjere uvjeta. Da biste to učinili, možete koristiti operator pauza:

Dok (true) ( ​​​​if (checkSomething()) ( break; ) )

Ako jednostavno želimo zaustaviti napredak trenutne iteracije, ali ne izaći iz petlje, već otići do bloka za provjeru uvjeta, tada moramo koristiti operator nastaviti:

Dok (true) ( ​​​​if (provjeri Nešto()) (nastavi; ) )

Naredbe continue i break mogu se koristiti sa svim varijantama petlji FOR i WHILE.

Ugniježđene petlje u Arduinu

Sve varijante petlji mogu se lako međusobno kombinirati, stvarajući ugniježđene strukture. Varijable definirane u bloku "prekomjerne" petlje bit će dostupne u unutarnjem bloku. Najčešći primjer ove vrste petlje je prelaženje dvodimenzionalnih nizova. U sljedećem primjeru koristimo dvostruku petlju: prva će iterirati kroz retke (varijabla i), druga, ugniježđena, će kružiti kroz stupce (varijabla j) niza, koji smo definirali u varijabli 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]); } } }

Više o ciklusima

Ako nikada niste radili s petljama, zaronimo malo u svijet teorije i shvatimo što su petlje i zašto su nam potrebne ove misteriozne jezične konstrukcije.

Zašto nam treba petlja?

Zapravo, glavni zadatak petlje je ponavljanje istih jezičnih konstrukcija nekoliko puta. Ova potreba javlja se u gotovo svakom programu, a sigurno niti jedna Arduino skica ne može bez petlje - funkcija loop() također se poziva u beskonačnoj petlji.

Pogledajmo sljedeći primjer. Morate napajati istovremeno 5 LED dioda spojenih na Arduino ploču od pinova 5 do 9. Najočitija opcija za to bila bi postaviti pet uputa u nizu:

digitalWrite(5, HIGH);

digitalWrite(6, HIGH);

digitalWrite(7, HIGH);

digitalWrite(8, HIGH);

digitalWrite(9, HIGH);

Zanemarimo za sada pitanje rizičnosti takve akcije, jer istovremeno uključivanje tolikog broja LED dioda stvara povećano opterećenje strujnog kruga ploče. Sada nam je najvažnije da smo kreirali pet redaka koda, od kojih se svaki razlikuje od ostalih samo jednom znamenkom. Ovaj pristup ima sljedeće nedostatke:

  • Uz bilo koju promjenu, morat ćete izvršiti promjene u više redaka istovremeno. Na primjer, ako trebamo prebaciti LED diode na pinove 2 do 6 ili isključiti napon umjesto da ga uključimo, morat ćemo napraviti 5 promjena koda. Što ako ima više uputa i promjena?
  • Veliki kod s velikim brojem sličnih uputa je nezgodan i neugodan za čitanje. Pet identičnih redaka nije jako strašno. Ali navika prljavog koda na kraju će dovesti do desetaka i stotina dodatnih stranica u popisu, što će vas i vaše kolege učiniti malodušnima.
  • U procesu "copy-paste" gotovo identičnih uputa, lako možete pogriješiti, na primjer, zaboraviti promijeniti pin broj: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Možete lako pasti na intervjuu u bilo kojoj normalnoj softverskoj tvrtki tako da ispitivaču pokažete ovaj kod.

Iz svega ovoga možemo zaključiti da ponovnu upotrebu istih nizova uvijek iznova treba gotovo uvijek izbjegavati i zamijeniti petljama. Štoviše, u mnogim je situacijama nemoguće bez ciklusa, ništa ih ne može zamijeniti. Ne možete promijeniti broj ponavljanja koda dok program radi. Na primjer, morate obraditi svaki element niz podataka, primljene od vanjskih uređaja. Nikada nećete predvidjeti koliko će podataka biti, koliko će se puta obrada ponoviti, pa stoga nećete moći ubaciti potreban broj instrukcija u trenutku pisanja članka.

I tu nam u pomoć priskaču ciklusi.

Pravila sintakse

Petlja u Arduinu je poseban programski blok koji će biti pozvan određeni broj puta tijekom izvođenja programa. Unutar ovog bloka opisujemo same naredbe koje će se pozivati ​​te pravila po kojima će kontroler određivati ​​koliko ih puta treba pozvati.

U našem gornjem primjeru mogli bismo reći kontroleru sljedeće:

Ponovite naredbu digitalWrite 5 puta

U idealnom svijetu s robotskim programerima, ovo bi vjerojatno bilo dovoljno, ali budući da s računalom razgovaramo u C++-u, moramo prevesti ovu frazu na ovaj jezik:

Ponovite naredbu – trebate koristiti posebne upute koje govore kontroleru da će nešto zanimljivo započeti s while ili for petljama

digitalWrite – ostavite kako jest, ali napišite jednom i stavite u vitičastu zagradu. Što učiniti s pin brojevima - ispod.

5 puta – za to koristite brojač koji će se povećavati sa svakim ponavljanjem. Na početku (ili kraju) bloka možete usporediti vrijednost ovog brojača s graničnom vrijednošću (u ovom slučaju 5) pomoću operacije usporedbe.

Pogledajmo primjer takve "prevedene" naredbe petlje s naredbom while:

Int brojač = 0; // Varijabla koja će pohraniti vrijednost brojača // Tražimo od procesora da ponavlja konstrukciju u vitičastim zagradama dok se uvjet u zagradama ne vrati kao istinit. // U našem slučaju, brojač je naš brojač, 5 je granična vrijednost, uvjet je da je vrijednost brojača manja od 5. // Ali možemo navesti potpuno različite logičke operatore dok (brojač< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

Za one koji su primijetili grešku u zadanom kodu, dajemo pet i pišemo blok petlje drugačije:

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

Isti rezultat može se postići korištenjem FOR petlje:

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

Kao što vidite, u ovom slučaju odmah stavljamo sve potrebne operacije s brojačem u jednu FOR instrukciju - ovo je mnogo prikladnije ako trebate prebrojati potrebnu količinu.

Detaljne informacije o pravilima za korištenje petlji možete dobiti u relevantnim odjeljcima ovog članka.

Zaključak

U ovom smo članku pogledali vrlo važne konstrukcije Arduino jezika: FOR i WHILE petlje. Ove operatore možete pronaći u gotovo svakoj više ili manje složenoj skici, jer bi bez petlji mnoge operacije nad podacima bile nemoguće. Nema ništa komplicirano u sintaksi petlji - lako se možete naviknuti na njih i možete ih aktivno koristiti u svojim projektima.

/ /

Za operatera

Oblikovati za koristi se za ponavljanje bloka naredbi omeđenih u vitičaste zagrade. Brojač povećanja obično se koristi za povećanje i prekid petlje. Operater za Prikladno za sve aktivnosti koje se ponavljaju i često se koristi u kombinaciji s nizovima za prikupljanje podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija; stanje; prirast) (operatori se izvršavaju u petlji)

Inicijalizacija se izvodi prva i samo jednom. Svaki put u petlji se provjerava uvjet, ako je istinit, izvršava se blok naredbi i inkrement, zatim se uvjet ponovno provjerava. Kada Booleova vrijednost uvjeta postane lažna, petlja završava.

Primjer

// Prigušivanje LED-a pomoću PWM pina int PWMpin = 10; // LED u seriji s otpornikom od 470 ohma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Ciklus za C je mnogo fleksibilniji od petlji za u drugim programskim jezicima, na primjer, BASIC. Bilo koji ili sva tri elementa zaglavlja mogu se izostaviti, iako su točke i zarezi obavezni. Također, naredbe za inicijalizaciju petlje, uvjetne i inkrementalne naredbe mogu biti bilo koje važeće C naredbe s neovisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neuobičajeno za ciklus za vrste operatora omogućuju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućuje vam stvaranje logaritamske progresije:

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

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

Drugi primjer, glatko smanjenje ili povećanje razine signala na LED-u pomoću jednog ciklusa za:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; / / upravljanje prebacivanjem pri maksimalnom kašnjenju (10); ) )