Osnove programiranja u C++ za Arduino
Osnovna struktura Arduino programa
Arduino skica (program) uvijek ima dvije osnovne funkcije: setup() i loop().
Kod funkcije se može nalaziti u tvom korisničkom programu, a može i biti skriven u pozadinskoj programskoj biblioteci (knjižnici) koju koristi Arduino. To znači da, kad u svojem kodu pozoveš npr. digitalWrite(pin, vrijednost);, zapravo koristiš gotovu funkciju iz Arduino core biblioteke, koja je dio svakog Arduino projekta – ova knjižnica kontrolira mikrokontroler na niskoj razini.
- setup(): Ova funkcija se izvršava samo jednom, odmah nakon što se mikrokontroler uključi ili resetira. U njoj postavljaš početna podešavanja, npr. koji su pinovi ulazi, a koji izlazi.
// C++
void setup() {
pinMode(13, OUTPUT); // Pin 13 postavi kao izlaz
}
Blokovi olakšavaju organizaciju i preglednost koda, omogućuju ugniježđivanje (blok unutar bloka), te odvajanje pojedinih dijelova programa u manje, samostalne cjeline koje je lakše testirati i održavati.
- loop(): Ova funkcija se ponavlja neprekidno dokle god je Arduino uključen. U njoj pišemo glavni dio programa koji se stalno izvršava.
void loop() {
digitalWrite(13, HIGH); // Uključi LED na pinu 13
delay(1000); // Čekaj 1 s (1000 ms)
digitalWrite(13, LOW); // Isključi LED
delay(1000); // Čekaj opet 1 s
}
Točka-zarez služi kao *kraj rečenice* u C++. Računaru je to signal da je naredba gotova. Ako ga izostaviš, program će javiti grešku, jer ne zna gdje završava neka naredba ili gdje počinje druga. Zanimljivo, baš kao što ne možemo sastaviti više rečenica bez točke, ni kod ne može raditi bez točke-zareza – sustavu treba jasna struktura.
Promjenjive (varijable) i tipovi podataka
Varijable su spremnici u kojima program privremeno sprema podatke, npr. brojeve, tekst ili stanja.
- int – cijeli brojevi (npr. 15, -4)
- float – decimalni brojevi (npr. 3.14, -0.9)
- char – jedan znak (npr. ‘a’)
- bool – logička vrijednost (true ili false)
Deklaracija i korištenje varijable:
int x = 5; // Cijeli broj
float y = 3.14; // Decimalni broj
bool ledOn = true; // Logička vrijednost
Ime varijable treba ukazivati na njezinu namjenu – na primjer, broj_pokusaja umjesto samo b – jer tada kod govori sam za sebe i programi su jednostavniji za objašnjavanje i suradnju, pogotovo u timskom radu ili edukacijskim projektima.
Grananje programa (if uvjet)
Ponekad želimo da se neki dio programa izvrši samo pod određenim uvjetom. Za to koristimo if naredbu.
int broj = 7;
if (broj > 5) {
// Ovaj dio će se izvršiti jer je broj veći od 5
digitalWrite(13, HIGH);
}
Alternativa je naredba else, ako želimo uraditi nešto drugo, kada uvjet nije ispunjen:
if (broj < 5) {
digitalWrite(13, LOW);
}
else {
digitalWrite(13, HIGH);
}
Petlje
Petlje omogućuju da se neki dio koda izvršava više puta.
- for petlja: Kad znamo točno koliko puta želimo ponavljati nešto
for (int i = 0; i < 10; i++) {
// Ovaj kod se izvršava 10 puta – i ide od 0 do 9
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
For petlja ima tri osnovna parametra koji se pišu unutar okruglih zagrada, i zajedno kontroliraju koliko puta i kada će se naredbe unutar petlje izvršiti:
-
Inicijalizacija (početna vrijednost) – postavlja početnu vrijednost varijable koja se koristi u petlji (najčešće brojač).
Primjer:int i = 0 -
Uvjet (test) – određuje dokle će se petlja izvršavati; provjerava da li treba pokrenuti još jedan krug, npr. dok je brojač manji od neke vrijednosti.
Primjer:i < 10 -
Promjena (korak) – uvijek se izvršava na kraju svakog prolaza petljom; obično povećava ili smanjuje vrijednost brojača.
Primjer:i++ -
while petlja: Uvjet se provjerava prije svakog ponavljanja
int brojac = 0;
while (brojac < 5) {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
brojac += 1;
}
Operatori
Operatori su posebni simboli u programiranju na Arduinu (i C++) koji omogućuju razne matematičke i logičke operacije. Bez operatora, program ne može dodjeljivati vrijednosti, računati niti uspoređivati podatke.
- Operator dodjeljivanja (=)
Operator = se koristi za dodjeljivanje vrijednosti varijabli. S desne strane pišemo što želimo pohraniti, a lijevo je ime varijable.
int broj = 5; // broj iznosi 5
float rezultat = 3.14; // rezultat iznosi 3.14
Operator dodjeljivanja služi za pohranu rezultata ili podatka u varijablu.
- Aritmetički operatori (+, -, *, /, %, ++, –)
Ovi operatori omogućuju osnovne matematičke računice.
int a = 10, b = 3;
int zbroj = a + b; // zbroj = 13
int razlika = a - b; // razlika = 7
int umnozak = a * b; // umnozak = 30
int kolicnik = a / b; // kolicnik = 3
int ostatak = a % b; // ostatak = 1 (ostatak dijeljenja)
a++; // a se povećava za 1, sada je 11
b--; // b se smanjuje za 1, sada je 2
a += 10; // a se povećava za 10, sada je 21
Operatori kao ++ i – najčešće se koriste u petljama za brojanje.
Operatori kao +=, -=, *=, /= i %= odrađuju aritmetičku operaciju i rezultat upisuju u varijablu sa lijeve strane.
- Operator usporedbe (==, !=, >, <, >=, <=)
Operatora usporedbe je uvjet koji vraća true (točno) ili false (netočno). Najčešće ga koristiš unutar grananja (if) ili petlji.
int temperatura = 25;
if (temperatura == 25) { // jednako
// Kod se izvršava jer je uvjet istinit
}
if (temperatura != 30) { // nije jednako
// Ovo je također istinito
}
if (temperatura > 10) { // veće
// ...
}
if (temperatura < 100) { // manje
// ...
}
if (temperatura >= 25) { // veće ili jednako
// ...
}
if (temperatura <= 25) { // manje ili jednako
// ...
}
Ovi operatori su ključni za reakciju programa ovisno o uvjetima.
Operator usporedbe == ima dva znaka jednakosti, kako bi se razlikovao od operatora dodjeljivanja =.
- Logički operatori (&&, ||, !)
Koriste se za spajanje više uvjeta:
- && znači i
- || znači ili
- ! znači ne
if (temperatura > 10 && temperatura < 30) {
// Uvjet je ispunjen samo ako su oba uvjeta točna
}
if (temperatura == 25 || temperatura == 30) {
// Kod se izvršava ako je temperatura 25 ili 30
}
if (!(temperatura < 20)) {
// Kod se izvršava ako temperatura NIJE manja od 20
}
Funkcije
Pisanje vlastitih funkcija čini program organiziranijim, preglednijim, te omogućuje višekratnu upotrebu istog koda, čime se pojednostavljuje rad na većim projektima.
Vlastite funkcije za Arduino (i C++ općenito) pišu se tako da prvo definiraš tip vrijednosti koju funkcija vraća (najčešće void ako ne vraća ništa), zatim ime funkcije, okrugle zagrade za parametre, te tijelo funkcije unutar vitičastih zagrada.
Evo osnovnog formata:
void mojaFunkcija() {
// ovdje pišeš naredbe koje želiš da se izvrše kada se funkcija pozove
}
int zbroj(int a, int b) {
int rezultat = a + b;
return rezultat; // funkcija vraća vrijednost
}
- Funkcija može primati parametre (ulazne vrijednosti), ali i ne mora – ako zagrade ostanu prazne.
- Svojim funkcijama daješ smisleno i opisno ime.
- Sve naredbe koje želiš izvršiti stavljaš unutar tijela funkcije, između { }.
Funkciju pozivaš upisivanjem njenog imena, npr. mojaFunkcija();.
Primjer korištenja vlastite funkcije u loop():
void blinkajLED(int pin, int trajanje) {
digitalWrite(pin, HIGH);
delay(trajanje);
digitalWrite(pin, LOW);
delay(trajanje);
}
void loop() {
blinkajLED(13, 1000); // pali i gasi LED na pinu 13 svake sekunde
}
Kako bi funkcija bila vidljiva kodu u kojem se poziva, mora biti navedena prije tog koda – u cijelosti ili samo njena deklaracija. Npr. gornji kod se može napisati i ovako:
void blinkajLED(int pin, int trajanje); // ovo je deklaracija funkcije, navode se tip funkcije i parametri
void loop() {
blinkajLED(13, 1000); // pali i gasi LED na pinu 13 svake sekunde
}
void blinkajLED(int pin, int trajanje) {
digitalWrite(pin, HIGH);
delay(trajanje);
digitalWrite(pin, LOW);
delay(trajanje);
}
Što smo naučili?
- Arduino se programira pomoću prilagođene verzije C++ jezika u Arduino IDE-u, pri čemu je program podijeljen u dvije važne funkcije: setup() za inicijalizaciju i loop() za beskonačno ponavljanje glavnog dijela programa.
- Osnovni pojmovi C++ uključuju varijable (spremnike za podatke), tipove podataka (int, float, bool…), operatore (npr. za zbrajanje, usporedbu, dodjeljivanje), programsko grananje (if, else) i petlje (for, while).
- Razumjeli smo važnost pravilnog imenovanja varijabli, jer jasno ime olakšava razumijevanje i suradnju s drugim programerima.
- Upoznali smo što su funkcije: posebni dijelove koda koji izvršavaju zadatak, primaju podatke kroz zagrade, a tijelo se piše unutar vitičastih zagrada. Funkcije se mogu pozivati više puta, a kod gotovih funkcija (npr. digitalWrite()) zapravo radimo s gotovim blokovima iz Arduino knjižnice.
- Proučili smo blokove naredbi – skup naredbi unutar vitičastih zagrada – te razumjeli kako se koriste za organizaciju koda (funkcija, petlji, grananja).
- Pisanjem vlastitih funkcija vlastitom logikom olakšavamo izradu složenih i preglednih programa.
- Kod for-petlje, upoznali smo parametre: inicijalizaciju brojača, uvjet ponavljanja i promjenu brojača, što omogućuje automatizirano ponavljanje zadataka u kodu.
Sve ove osnove omogućuju ti da samostalno pišeš, testiraš i proširuješ svoje Arduino projekte, razumiješ kako program razmišlja i kako možeš raditi kreativne i funkcionalne elektroničke uređaje.
◀ 3. Arduino programiranje ☸ Metronom ▶