Kako se koristi Naredba IF i MAP
Najbolji način da se shvati neka naredba je kroz praktičan primjer.
U prethodnoj lekciji napravili smo naš prvi projekat, tačnije, naučili smo kako koristiti fotootpornik i dobiti očitanje intenziteta svjetlosti tj. koliko svjetla pada na senzor.
U ovoj lekciji ćemo objasniti:
- Šta je to naredba if i kako se koristi,
- Šta je to naredba map i kako se koristi,
- Šema povezivanja i kod za očitanje i upravljanje indikatorima,
- Specifikacija materijala
Šta je to naredba if i kako se koristi:
Zbog svoje praktičnosti i jednostavnosti sintakse, skoro u svakom Vašem projektu će se postavljati barem jedan “if” uslov. Naravno, pored “if” postoje i druge slične naredbe kao što npr. “switch-case“. Naredba “if” se u svakom programskom jeziku jednako koristi, tako da je obavezno da shvatite način na koji se izvršava i kojim redoslijedom.
Siguran sam da većina Vas zna šta na engleskom znači “if”, ali ipak da pojasnimo za one koji ne znaju. Prevod engleske riječi “if“, značilo bi “ako“, iz čega možemo odmah na početku zaključiti da se radi o nekim provjerama ili uporedbama. Grubo značenje naredbe “if”, bilo bi da ona provjerava da li je neko stanje istinito (True) ili ne (False).
Najjednostavniji primjer naredbe “if” možete vidjeti na slici. U našem primjeru smo prikazali samo jedan “if” uslov. Bitno je naglasiti da kod teče svojim tokom sve dok ne dođe do if-a, nakon čega se vrši provjerava da li je uslov ispunjen.
U slučaju da uslov nije ispunjen (false) kod nastavlja dalje da se izvršava po zadatku.
U slučaju da je uslov ispunjen, kod se nastavlja izvršavati unutar naredve “if”. Nakon što se završe svi zadaci unutar if-a, kod nastavlja da sa izvršava.
Sintaksa:
if (uslov) {
// izvrši narede
}
Primjer:
if (x > 120) {
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
}
Kao što možete vidjeti iz gore navedenog primjera postavili smo uslov i koristili relacioni operator, tj. tražili smo da se provjeri vrijednost x i u slučaju da je vrijednost veća od 120 da se upale led diode pod nazivom LEDpin1 i LEDpin2.
U nastavku ćemo prikazati koji su to relacioni operatori i šta znače:
x == y (da li je x jednak y)
x != y (da li je x nejednak y)
x < y (da li je x manji od y)
x > y (da li je x veći od y)
x <= y (da li je x manji ili jednak y)
x >= y (da li je x veći ili jednak y)
Nakon što smo naučili najjednostavniji oblik naredbe “if”, istu je moguće proširiti i logičkim operatorima tj. moguće je postaviti više uslova unutar jednog if-a. U nastavku ćemo objasniti šta su to logički operatori, tablicu stanja operatora i navest ćemo jedan paktičan primjer.
Logički operatori:
! (Negacija - operator 1 pretvara u 0 i obrnuto)
&& (Logički AND - I )
|| (Logički OR - ILI)
Operator ILI zapisuje se simbolima || (kombinacija tipki Alt Gr+W).
Tablica stanja operatora:
Kako bi do kraja shvatili proširenu naredu “if” moramo shvatiti stanja operatora.
U nastavku ćemo prikazati tablicu za sva tri logička operatora:
Primjer ( Logical AND rezultira istinom, samo ako su oba operatora istinita (True):
if (digitalRead(2) == HIGH && digitalRead(3) == HIGH) {
// ako su obadva uslova ispunjana tj. istinita (HIGH) //
// izvrši narede
}
Kao što možemo vidjeti u našem primjeru proširena “if” naredba je odlična kada npr. provjeravamo stanje dva ili više senzora kako bi zadovoljili “if”
Broj naredbi “if” unutar jednog projekta nije ograničen, tj. možete postaviti koliko god želite uslova unutar jednog projekta!
Više informacija o naredbi “if” na linku:
https://www.arduino.cc/reference/en/language/structure/control-structure/if/
Šta je to naredba map i kako se koristi:
Očitane vrijednosti koje dobivamo sa senzora kao što su senzor temperature, senzor vlažnosti zemlje, senzor za intenzitet svjetlosti, senzor vlažnosti zraka, nama koji pravimo projekte znače sasvim dovoljno, ali šta je sa onima kojima ćemo isporučiti gotovi projekat?
Iz gore navedenog primjera nastala je potreba da se napravi naredba map.
Naredba map je odlična kada želimo broj iz jednog raspona pretvoriti u drugi. Ova naredba je odlična i za kalibrisanje samog senzora.
Kako bi lakše shvatili kako funkcioniše naredba pogledajmo sintaksu:
map(value, fromLow, fromHigh, toLow, toHigh)
Paramteri:
value: vrijednost sa senzora koja se mapira.
fromLow: najmanji broj koji se može izmeriti na senzoru.
fromHigh: najveći broj koji se može izmeriti na senzoru.
toLow: najmanja željena vrijednost.
toHigh: najveća željena vrijednost.
Kada kažemo ” raspon “, to se obično odnosi da raspon vrijednost od 0 do 1023 pretvorimo u raspon vrijednosti od 0 do 100 (neki senzori imaju raspon od 0 do 100.000+).
BH1750FVI Digital Light intensity Sensor je idealan za očitanje intenziteta svjetlosti. Može biti od velike pomoći kada želite da uzgajate vlastito povrće i bilje. Raspon mjerenja senzora je od 0 do 65.5351.
Iz primjera sintakse možemo uočiti da je naredba map idealna za pretvaranje u očitanih vrijednosti sa senzora u postotke ili procente.
U našem primjeru, očitanja senzora koje smo mogli vidjeti na slici u Lekciji 1.0, kretala su se u rasponu od 11 do 627. Naš zadatak je da koristeći naredbu map vrjednosti od 11 do 627 pretvorimo od raspon 0 do 100 i postavit ćemo dva “if” uslova.
Više informacija o naredbi map na linku:
https://www.arduino.cc/reference/en/language/functions/math/map/
Šema povezivanja i kod za očitanje i upravljanje indikatorima:
Kako bi naš projekat učinili još interesantnijim, u ovom dijelu ćemo praktično primjeniti znanje koje smo stekli iz prethodnih tačaka ove lekcije tj. map-irat ćemo vrijednost preuzetu sa senzora i naš projekat ćemo obogatiti za tri uslova (if).
Šema povezivanja fotootpornika sa Arduino Unom i dvije led diode kao indikatore stanja
Značenje boja:
Crvena = 5v (+) -> 10kΩ otpornik
10kΩ otpornik -> jedan pin fotootpornika
Zelena = A0 -> u isti pin fotootpornika
Crna = GND (-) -> iz zajedničke linije minusa u drugi pin fotootpornika i katode led dioda
Plava = pin 11 i pin 12 -> u 220Ω otpornik
220Ω otpornik -> u anodu led diode
220Ω otpornik -> u anodu led diode
Ubacit ćemo dvije led diode kao indikatore i naš kod ćemo izmjeniti tako što ćemo postaviti tri “if” uslova. U prethodnoj lekciji uočili smo kada je fotootpornik izložen većoj svjetlosti, vrijednost očitanja je manja. To znači da vrijednost senzora raste kako se smanjuje količina svjetlosti koja pada na senzor.
Obzirom da je ova lekcija nastavak Lekcije 1.0. (Kako se koristi Arduino fotootpornik (LDR) senzor), iskoristit ćemo kod iz navdene lekcije i obogatit ćemo kod sa tri “if” naredbe i jednom “map” naredbom :
Kod:
int senzorPin = A0;
int vrijednostSenzora = 0;
int Led1 = 10; // zelena dioda
int Led2 = 11; // crvena dioda
const int fromLow = 5;
const int fromHigh = 630;
const int toLow = 0;
const int toHigh = 100;
void setup() {
pinMode(senzorPin, INPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
Serial.begin(9600);
}
void loop() {
vrijednostSenzora = analogRead(senzorPin);
vrijednostSenzora = map(vrijednostSenzora, fromLow, fromHigh, toLow, toHigh);
Serial.println(vrijednostSenzora);
if(vrijednostSenzora < 20){
digitalWrite(Led2, LOW);
digitalWrite(Led1, LOW);
}
if(vrijednostSenzora >= 20 && vrijednostSenzora <= 50){
digitalWrite(Led1, HIGH);
digitalWrite(Led2, LOW);
}
if(vrijednostSenzora > 50){
digitalWrite(Led2, HIGH);
digitalWrite(Led1, LOW);
}
delay(1000);
}
Opis koda:
U prvom dijelu koda pored imenovanja varijabli za očitanje i preuzimanje vrijednosti sa senzora, možemo vidjeti i nazive led dioda, kao i pinove pereko kojih se iste kontrolišu.
Iz prethodne lekcije znamo da se očitanje senzora (fotootpornika) kretalo od 11 do 627. Navedene vrijednosti ćemo iskoristiti za naredbu “map”, tako što ćemo kreiranim varijablama (fromLow ,fromHigh, toLow, toHigh) dodijeliti stalne (const int) vrijednosti.
Kako bi izbjegli pretvorenu vrijednost ispod nule (0), tj. kako vrijednost ne bi bila u minusu(-) i preko stotinu (100), stavit ćemo mala odpstupanja:
Minimalnu vrijednost 5 ćemo staviti kao 11, a maksimalnu vrijedno 627 ćemo staviti kao 630 i time ćemo dobiti mjerenje od 1 do 99%. Ipak mjerenje 101% ili -1% nije prirodno, a u rijetko kojim trenucima će nam trebati baš tolika preciznost. Smatram da je za naredbu “map“, imenovanje varijabli i dodjeljivanje vrijednosti u prvom dijelu koda puno bolje, praktičnije i preglednije nego rad sa čistim brojevima.
Vaš program bi bio kraći i jednako bi radio i da ste u naredbi “map” upisali samo vrijednosti ( npr.: vrijednostSenzora = map(vrijednostSenzora, 5, 630, 0, 100); ). Praksa pisanja brojeva je loša, a to ćete najbolje shvatiti kada budete radili sa više senzora u jednom projektu.
U setup dijelu smo deklarisali senzor pin kao INPUT, a dvije led diode kao OUTPUT.
U loop dijelu smo kreirali varijablu “vrijednostSenzora” u koju smo pohranili očitanu vrijednost sa senzora, nakon čega smo map-irali preuzete vrijednosti u raspon od 0 do 100.
U nastavku koda postavili smo sljedeće uslove (naredba if):
prvi uslov: ako je očitana vrijednost manja od 20 -> Zelena i Crvena dioda su ugašene,
drugi uslov: ako je očitana vrijednost veća ili jednaka 20 i manja ili jednaka od 50 -> upali Zelenu diodu (ugasi crvenu diodu),
treći uslov: ako je očitana vrijednost veća od 50 -> upali Crvenu diodu (ugasi zelenu diodu),
Ovakav pogled na kod će definitivno raditi, ali smatram da je bolje odmah na početku naučiti koristiti punu if naredbu. Puno ljepši, pregledniji kod bi bio kada bi promjenili uslove na sljedeći način:
if(vrijednostSenzora >= 20 && vrijednostSenzora <= 50) {
digitalWrite(Led1, HIGH);
digitalWrite(Led2, LOW);
}
else if(vrijednostSenzora > 50) {
digitalWrite(Led2, HIGH);
digitalWrite(Led1, LOW);
} else {
digitalWrite(Led2, LOW);
digitalWrite(Led1, LOW);
}
Rezultat programa će ostati isti, ali na ovaj način smo tražili povratnu informaciju dva uslova koja smo tražili i rekli da u svakom trećem slučaju obadvije diode budu ugašene. Logika drugog primjera koda je da kontroler prođe kroz glavni if, u slučaju da uslov nije ispunjen prelazi na drugi uslov else if i na kraju ako ni else if uslov nije ispunjen postupa po naredbi else. Prednost ovakvog postavljanja uslova je ta da se ne moramo brinuti o ostalim vrijednostima kao sto je, u našem prvom slučaju, vrijednost ispod 20. Ovakvim pristupom upravljamo samo vrijednostima koje nas interesuju, a sve ostale vrijednosti prelaze u naredbu else. Broj else if naredbi unutar jedne if naredbe nije ograniče.
Sintaksa:
if (uslov) {
// izvrši narede
}
else if (uslov) {
// izvrši narede
}
else {
izvrši narede
}
Specifikacija materijala:
1x Arduino Uno
1x Breadboard
2x led diode (3 ili 5mm)
1x Fotootpornik
8x Komunikacijski kablovi (M-M)
2x Otpornik 220Ω
1x Otpornik 10kΩ
U ovoj lekciji naučili smo kako se koristi naredba map i if !
Uspješno smo dobili očitanje intenziteta svjetlosti, dobijenu vrijednost smo map-irali i postavili čak tri uslova.