U toku testiranja ispravnosti vaše Arduino ploče verovatno ste koristili „Blink“ program iz ponuđenih primera koji dolaze zajedno sa Arduino IDE. Kako bismo pojasnili neke osnovne stvari koristićemo isti taj program i malo ga proanalizirati.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
Ono što je već na prvi pogled uočljivo to su dva bloka koda. Isto možete primetiti i u svim ostalim primerima da svaki ima barem ova dva bloka.
Konkretno, ono što se ovde nalazi su dva bloka naredbi koja pripadaju funkcijama setup() i loop(). Blok neke funkcije predstavlja skup svih naredbi koje se nalaze između vitičasnih {} zagrada te funkcije.
Takođe, u ovom programu nailazimo i na funkcije pinMode(), digitalWrite(), kao i na delay() funkciju, počnimo od dve najbitnije.
Prva funkcija na koju nailazimo je setup() funkcija. To je funkcija koja će se po pokretanju programa izvršiti samo jednom. Ona služi da se u njoj inicijalizuju neke početne informacije koje su nam neophodne za ispravno funkcionisanje programa.
Glavna funkcija u svakom programu pisanom za Arduino jeste funkcija loop(). U ovoj funkciji napisaćemo sve naredbe koje želimo da naš mikrokontroler ponavlja. Ono što treba napomenuti je to da se ova funkcija za razliku od setup() funkcije ponavlja beskonačno mnogo puta, tačnije dokle god je naša ploča pod naponom, dok se setup() izvrši samo po uključivanju mikrokontrolera.
Ono našta se treba obratiti pažnja su zagrade, svaki blok je potrebno zatvoriti, što vrlo lako može promaći ukoliko imamo unutar bloka još jedan blok, pa unutar njega još nekoliko itd, ako se propusti zagrada javiće se greška u prevođenju koda.
setup() { …telo funkcije koja se izvršava samo jednom... } loop() { …telo funkcije koja se izvršava neprestano... }
U „Blink“ primeru ispred ovih funkcija možemo videti i reč „void“. Ova reč označava tip promenljive o čemu ćemo pisati uskoro, a takođe biće još reči uopšteno o funkcijama u nekom od narednih tekstova.
Unutar bloka funkcije setup() nalazi se funkcija pinMode(), konkretno pinMode(13,OUTPUT) kojom inicijalizujemo pin 13 kao izlazni pin. To radimo kada želimo da nam taj pin služi za uključivanje neke periferije ili slanje nekog izlaznog signala, u našem slučaju to je uključivanje LED diode. Mogli smo napisati i pinMode(2,OUTPUT) u slučaju da smo hteli da uključujemo LED putem pina 2, a ne 13.
Umesto podatka „OUTPUT“ može stajati i „INPUT“ kada želimo da taj pin koristimo kao ulazni pin, tačnije, kada očekujemo neki signal na njemu koji bismo kasnije želeli da očitamo. Inicijalizovanje ulaznih pinova nije neophodno zato što svaki I/O pin podrazumevano radi u „INPUT“ režimu, ali najbolje je svaki put uraditi ovu inicijalizaciju, bilo da koristimo pin za ulaz ili izlaz.
pinMode(pin,REŽIM);
Gde „pin“ predstavlja broj pina (ili ime) koji želimo inicijalizovati, a „REŽIM“ predstavlja ulazni ili izlazni režim rada tog pina.
Da li vas je zbunilo kada ste pročitali „ime“ pina? Evo primera:
int ledPin = 2; pinMode(ledPin,OUTPUT);
U ovom primeru uveli smo jednu promenljivu „ledPin" koja ima vrednost „2“, nakon čega je koristimo kao „ime“ pina unutar funkcije pinMode() koja će u ovom primeru inicijalizovati pin 2 kao izlazni. Uskoro ćemo pisati i o promenljivima, koje su takođe nezaobilazne.
Ovaj način koji smo koristili sa dodeljivanjem imena je mnogo praktičniji nego da pišemo broj pina, jer, zamislite neki kod koji ima 200,500 ili 1000 linija koda, a slučajno ste prevideli da pin 2 mora da vam služi za nešto drugo i da morate na svakom mestu gde ste upisali pin 2 da prepravljate u neki drugi... Trajalo bi satima i izgubili biste živce. Zato je primer koji smo naveli mnogo praktičniji i pregledniji, ako biste koristili ovaj način onda biste morali samo na jednom mestu da izvršite izmenu, a to je u naredbi int ledPin = 2; nakon čega će na svakom mestu u kodu gde piše „ledPin“ ta promenljiva sadržati novu ispravljenu vrednost, a ne više „2“.
Još jedna veoma bitna stvar jeste znak „;“ koji mora da se nalazi na kraju svake naredbe. Ovaj znak prevodiocu označava da je to kraj naredbe i ukoliko se negde izostavi ovaj znak pojaviće se greška u prevođenju. Kod blokova naredbi gde se koriste vitičaste zagrade ne treba pisati znak „;“ – koji se zove „semicolon“.
Sledeća funkcija na koju nailazimo je digitalWrite(). Ova funkcija ima ulogu da neki pin postavi na visoki ili niski naponski nivo, tačnije, da se postavi na 5V ili na 0V, što predstavlja uključivanje i isključivanje LED diode.
Da smo hteli da napišemo Blink program ali za LED koju bismo povezali sa pinom 2 onda bismo napisali digitalWrite(2,HIGH) za uključivanje i digitalWrite(2,LOW) za isključivanje LED na pinu 2. Takođe, u slučaju da smo nazvali pin, kao što smo naveli malopre, recimo „ledPin“, onda bismo pisali digitalWrite(ledPin,HIGH) za uključivanje, ali pre toga bismo definisali promenljivu int ledPin = 2.
digitalWrite(pin,STANJE);
Gde „pin“ predstavlja broj ili ime pina, a „STANJE“ predstavlja aktivno ili neaktivno stanje, tačnije HIGH (5V) ili LOW (0V).
Da bismo blinkali (treptali) nekom od LED potrebno je između uključivanja i isključivanja napraviti kratku pauzu. Za tu namenu postoji nekoliko funkcija, ali u ovom slučaju (i najčešće) koristićemo funkciju delay(). Ona se može bukvalno predstaviti u obliku: čekaj(1000milisekundi). Dakle, unutar zagrada kao parametar upisuje se broj milisekundi koliko želimo da nam traje ta pauza.
Treba odmah napomenuti da ove funkcije za vreme nemaju veliku tačnost, ukoliko želite da napravite neki projekat gde je potrebna tačnost u vremenu morate koristiti „Real-time clock“ modul. Ono kako je realizovana funkcija čekanja je zapravo „vrtenje“ mikroprocesora u prazno toliko puta dok ne prođe zadati broj milisekundi, nakon čega se nastavlja sa izvršavanjem programa.
Ukoliko bismo koristili promenljive mogli smo napisati i:
int vreme = 1000; nakon čega bismo koristili ime promenljive umesto broja 1000 delay(vreme);
U ovom slučaju funkcija delay() uzima vrednost promenljive „vreme“ koja u sebi skladišti brojevnu vrednost „1000“.
delay(vrednost);
Gde „vrednost“ predstavlja neku vrednost koja je uneta direktno kao broj ili koja predstavlja vrednost neke promenljive, tj. vreme čekanja.
Ako se vratimo na naš Blink program sada kada smo upoznati sa svakom od funkcija koje se koriste za realizaciju ovog programa možemo primetiti da se u loop() funkciji zapravo odvija:
Pošto se loop() funkcija izvršava beskrajno isto tako će se i ove naredbe vrteti u krug i izvršavati iznova i iznova dokle god nam je uključen Arduino i dok ne učitamo novi program.
Ovaj Blink primer može se isprobati odmah ukoliko imate Arduino Uno ploču, koja na sebi ima već ugrađenu LED koja je povezana sa pinom 13, dakle ne treba vam nikakvo povezivanje, elektronika i slično.
Uskoro će biti i objašnjeno i povezivanje i malo elektronike kako biste mogli sami da napravite neki vaš projekat sa LED.