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

Dizajn za koristi se za ponavljanje bloka naredbi zatvorenih u vitičaste zagrade. Brojač inkrementa se obično koristi za povećanje i završetak petlje. Operater za Pogodno za bilo koju aktivnost koja se ponavlja i često se koristi u kombinaciji sa nizovima prikupljanja podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija ; stanje ; prirast) (operatori se izvode 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 ponovo provjerava. Kada logička vrijednost uvjeta postane lažna, petlja se završava.

Primjer

// Zatamnjenje LED pomoću PWM pina int PWMpin = 10; // LED u seriji sa otpornikom od 470 oma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( za (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 biti izostavljena, iako su tačke i zareze potrebne. Također, inicijalizacijski, uvjetni i inkrementni izrazi petlje mogu biti bilo koji važeći C izraz sa nezavisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neobično za ciklus za tipovi operatera omogućavaju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućava vam da kreirate logaritamsku progresiju:

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 nivoa signala na LED 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; / / kontrola prebacivanja pri maksimalnom kašnjenju (10); ) )

Dizajn za koristi se za ponavljanje bloka naredbi zatvorenih u vitičaste zagrade. Brojač inkrementa se obično koristi za povećanje i završetak petlje. Operater za Pogodno za bilo koju aktivnost koja se ponavlja i često se koristi u kombinaciji sa nizovima prikupljanja podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija ; stanje ; prirast) (operatori se izvode 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 ponovo provjerava. Kada logička vrijednost uvjeta postane lažna, petlja se završava.

Primjer
// Zatamnjenje LED pomoću PWM pina int PWMpin = 10; // LED u seriji sa otpornikom od 470 oma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( za (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 biti izostavljena, iako su tačke i zareze potrebne. Također, inicijalizacijski, uvjetni i inkrementni izrazi petlje mogu biti bilo koji važeći C izraz sa nezavisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neobično za ciklus za tipovi operatera omogućavaju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućava vam da kreirate logaritamsku progresiju:

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 nivoa signala na LED 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; // kontrola prebacivanja pri maksimalnom kašnjenju (10); ) )

", naučili smo kako koristiti "for" petlju za organizaciju rada kontrolera. Ova vrsta petlje se koristi svuda 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 različite principe.

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

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

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

Povratak u prošlost: kontroler traži od korisnika podatke, čeka na unos, a zatim dodjeljuje rezultirajuće vrijednosti varijablama blinkNumberGreen I blinkNumberRed. Ovo omogućava korisniku da kontroliše koliko puta svaka od 2 LED lampice treperi.

Da biste proširili pogled na svijet programera, vrijedi naučiti koristiti dvije vrste petlji za implementaciju istih zadataka, a u budućnosti možete pokazati simpatiju prema jednom ili drugom tipu.

Hajde da shvatimo kako to funkcionira:

int z= 1 ; // deklarisati varijablu i dodijeliti joj vrijednost 1

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

Serial. println(z); //izlaz trenutne vrijednosti varijablez preko serijskog porta

z= z+1 // povećava vrijednost varijablezod 1

) // završiti petlju

while petlja će nastaviti da izvršava komande sve dok je „uslov“ opisan u zagradama tačan. U gornjem primjeru, petlja će nastaviti da izvršava naredbe sve dok je z manje ili jednako 10. Tijelo petlje izvršava 2 naredbe:

  • Izlaz vrijednosti varijable preko serijskog porta;
  • Povećanje vrijednosti varijable za 1 (naučno 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 rado ući u petlju (drugim riječima, zamrznut će se).

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

Dosta teorije, pređimo na praksu. Zamijenimo for petlje u izvornom kodu sa while petljama.

Bljeskalica izvedena po ciklusu FOR:

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

{

Serial. print("Zeleno treperi");

Serial.println(i);

digitalWrite(greenLed, HIGH); //uključiti zeleno Dioda koja emituje svetlost

kašnjenje(vrijemeOnGreenLed); //čekamo

digitalWrite(greenLed, LOW); //ugasiti zeleno Dioda koja emituje svetlost

kašnjenje(vrijemeOffGreenLed); //čekamo

}

Bljeskalica u ciklusu WHILE:

int i=1; //deklariramo varijablu i dodijelimo joj vrijednost 1

dok (i<= blinkNumberGreen)

{ // lansirati ciklusdok

Serial.print("Zeleno trepnuo «);

Serial.println(i);

digitalWrite(greenLed,HIGH); //uključiti zeleno Dioda koja emituje svetlost

kašnjenje(vrijemeOnGreenLed); //čekamo

digitalWrite(greenLed,LOW); //ugasiti zeleno Dioda koja emituje svetlost

kašnjenje(vrijemeOffGreenLed); //čekamo

i= i+1 //povećavamo vrijednost varijable za 1

}

Sačuvajte program i učitajte firmver u kontroler. Pogledajmo rezultat.

Petlje koristeći iskaze za I dok su jedna od najvažnijih konstrukcija jezika C++ koja leži u osnovi Arduina. Nalaze se u apsolutno svakoj skici, čak i ako je ne znate. U ovom članku ćemo detaljnije pogledati petlje, saznati koja je razlika između for i while, kako možete pojednostaviti pisanje programa uz njihovu pomoć i koje greške treba izbjegavati.

Ako ste još uvijek 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 se koristi u C++ i Arduinu za ponavljanje istih komandi proizvoljan broj puta. U poređenju sa petljom FOR, petlja WHILE izgleda jednostavnije; obično se koristi tamo gde ne treba da računamo broj iteracija u promenljivoj, već jednostavno treba da ponavljamo kod dok se nešto ne promeni ili ne dođe do nekog događaja.

WHILE sintaksa

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

Bilo koja jezička konstrukcija koja vraća Booleovu vrijednost može se koristiti kao uvjet. Uslovi mogu biti operacije poređenja, funkcije, konstante, varijable. Kao i kod svih drugih logičkih operacija u Arduinu, bilo koja vrijednost osim nule će se percipirati kao istinita, nula – lažna.

// Beskonačna petlja while(true)( Serial.println("Waiting..."); ) // Petlja koja se pokreće 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 kom slučaju će se ponoviti prva naredba nakon petlje. Jako se ne preporučuje koristiti dok bez vitičastih zagrada, jer u ovom slučaju vrlo je lako napraviti grešku. primjer:

While(true) Serial.print("Čeka se prekid"); 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 dosta vremena na otkrivanje takvih grešaka - mnogo je lakše koristiti vitičastu zagradu.

Primjer upotrebe while petlja

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

Serial.begin(9600); dok (!Serial) ( ; // Neke Arduino ploče zahtijevaju od vas da pričekate dok se serijski port ne oslobodi)

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

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

U ovom slučaju, čitat ćemo vrijednosti ​​sve dok Serial.available() vraća vrijednost različitu od nule. Kada ponestane svih podataka u baferu, petlja će se zaustaviti.

FOR petlja u Arduinu

U FOR petlji imamo priliku ne samo da postavimo granične uslove, već i da odmah definišemo varijablu za brojač i naznačimo kako će se njene vrednosti menjati na svakoj iteraciji.

FOR sintaksa petlje

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

Najjednostavniji primjer:

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

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

Varijabilni korak može biti različit. 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 – od 10 do 1

uradi while petlju

U nekim slučajevima trebamo organizirati petlju na takav način da se instrukcije bloka izvrše barem jednom, a zatim se izvrši provjera. Za takve algoritme možete koristiti do while konstrukciju. primjer:

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

Ova verzija petlje ne predstavlja nikakve poteškoće - jednostavno smo pomerili blok sa uslovima nadole, tako da će sav sadržaj unutar vitičastih zagrada nakon do operatora biti izvršen pre prve provere.

Nastavak i prekid izjava

Postoje situacije kada morate hitno prekinuti izvođenje petlje unutar bloka petlje, bez čekanja da pređete na blok za provjeru stanja. Da biste to učinili, možete koristiti operatera break:

Dok (tačno) ( if (checkSomething()) (prekid; ) )

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

Dok (tačno) (ako (checkSomething()) (nastavi; ) )

Naredbe nastavljanja i prekida mogu se koristiti sa svim varijantama FOR i WHILE petlji.

Ugniježđene petlje u Arduinu

Bilo koje varijante petlji mogu se lako kombinirati jedna s drugom, čineći ugniježđene strukture. Varijable definirane u bloku petlje koja se nalazi iznad bit će dostupne u unutrašnjoj. Najčešći primjer ove vrste petlje je prelazak preko dvodimenzionalnih nizova. U sljedećem primjeru koristimo dvostruku petlju: prva će iterirati kroz redove (varijabla i), druga, ugniježđena, petlju kroz kolone (varijabla j) niza, koju smo definirali u varijabli arr.

Int arr; void setup() ( za (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 sa petljama, hajde da zaronimo malo u svet teorije i shvatimo šta su petlje i zašto su nam potrebne ove misteriozne jezičke konstrukcije.

Zašto nam je potrebna petlja?

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

Pogledajmo sljedeći primjer. Napajanje je potrebno istovremeno za 5 LED dioda povezanih na Arduino ploču od pinova 5 do 9. Najočiglednija opcija za ovo bi bila postavljanje pet instrukcija za redom:

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 takvog broja LED dioda stvara povećano opterećenje na strujnom krugu ploče. Sada nam je najvažnije da smo kreirali pet linija koda, od kojih se svaki razlikuje od ostalih samo po jednoj cifri. Ovaj pristup ima sljedeće nedostatke:

  • Sa bilo kojom promjenom, morat ćete unijeti izmjene na više linija 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 u kodu. Š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 linija nije mnogo strašno. Ali navika prljavog koda će na kraju dovesti do desetina i stotina dodatnih stranica na listi, što će i vas i vaše kolege učiniti očajnim.
  • U procesu “copy-pasting” gotovo identičnih instrukcija, lako možete pogriješiti, na primjer, zaboravite promijeniti pin broj: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Možete lako propasti na intervjuu u bilo kojoj normalnoj softverskoj kompaniji tako što ćete ispitaniku pokazati ovaj kod.

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

I tu nam ciklusi priskaču u pomoć.

Pravila sintakse

Petlja u Arduinu je poseban programski blok koji će biti pozvan određeni broj puta tokom izvršavanja programa. Unutar ovog bloka opisujemo same komande koje će biti pozvane i pravila po kojima će kontroler odrediti koliko puta ih treba pozvati.

U našem primjeru iznad, mogli bismo reći kontroloru sljedeće:

Ponovite naredbu digitalWrite 5 puta

U idealnom svetu sa programerima robota, ovo bi verovatno bilo dovoljno, ali pošto razgovaramo sa računarom na C++, moramo ovu frazu prevesti na ovaj jezik:

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

digitalWrite – ostavite kako jeste, ali napišite jednom i stavite u vitičaste zagrade. Šta učiniti sa pin brojevima - odmah ispod.

5 puta – za to koristite brojalicu, koja će se povećavati sa svakim ponavljanjem. Na početku (ili na kraju) bloka možete uporediti vrijednost ovog brojača sa graničnom vrijednošću (u ovom slučaju 5) koristeći operaciju poređenja.

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

Int brojač = 0; // Varijabla koja će pohraniti vrijednost brojača // Tražimo od procesora da ponovi konstrukciju u vitičastim zagradama sve dok uvjet u zagradama ne vrati true. // 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 specificirati potpuno različite logičke operatore while (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

Za one koji su uočili grešku u datom kodu, dajemo peticu i drugačije pišemo blok petlje:

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

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

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

Kao što vidite, u ovom slučaju sve potrebne operacije sa brojačem odmah stavljamo u jednu FOR instrukciju - to je mnogo praktičnije ako trebate izbrojati potrebnu količinu.

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

Zaključak

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

/ /

Za operatera

Dizajn za koristi se za ponavljanje bloka naredbi zatvorenih u vitičaste zagrade. Brojač inkrementa se obično koristi za povećanje i završetak petlje. Operater za Pogodno za bilo koju aktivnost koja se ponavlja i često se koristi u kombinaciji sa nizovima prikupljanja podataka/izlaza.

Zaglavlje petlje za sastoji se od tri dijela:

za (inicijalizacija; stanje; prirast) (operatori se izvode 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 ponovo provjerava. Kada logička vrijednost uvjeta postane lažna, petlja se završava.

Primjer

// Zatamnjenje LED pomoću PWM pina int PWMpin = 10; // LED u seriji sa otpornikom od 470 oma za 10 pinova void setup() ( // nije potrebno podešavanje) void loop() ( za (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 biti izostavljena, iako su tačke i zareze potrebne. Također, inicijalizacijski, uvjetni i inkrementni izrazi petlje mogu biti bilo koji važeći C izraz sa nezavisnim varijablama i koristiti bilo koji C tip podataka, uključujući float. Ovo je neobično za ciklus za tipovi operatera omogućavaju pružanje softverskog rješenja za neke nestandardne probleme.

Na primjer, korištenje množenja u operatoru brojača petlje omogućava vam da kreirate logaritamsku progresiju:

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 nivoa signala na LED 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; / / kontrola prebacivanja pri maksimalnom kašnjenju (10); ) )