Instrukcje warunkowe w Arduino
Instrukcje warunkowe: to niezwykle ważne konstrukcje w programowaniu, które pozwalają na wykonanie określonego kodu tylko wtedy, gdy spełnione są określone warunki, umożliwiając programowi podejmowanie decyzji na podstawie danych.
Instrukcja IF
Instrukcję warunkową w Arduino wpisujemy jako komendę if (co w języku polskim oznacza “jeżeli“). Dokonuje ona porównania i rozstrzyga, czy dany warunek jest prawdziwy (true) lub fałszywy (false). W zależności od tego wyniku, uruchamia ona określony fragment kodu, ale tylko w przypadku, gdy warunek zostaje spełniony. Po komendzie if wpisujemy otwarcie i zamknięcie okrągłego nawiasu, w którym wpisujemy warunek. Za nawiasem warunku dodajemy klamry {}, jeśli ma zostać zrealizowana więcej niż jedna instrukcja.
Przykład użycia (Kod_001):
Warunek zawiera najczęściej po lewej stronie zmienną, na środku operator porównania (np. ==), a na końcu wartość lub inną zmienną. Na przykład, jeśli chcemy sprawdzić, czy zmienna jest równa wartości warunek zapiszemy w sposób (Kod_002):
Załóżmy, że nasza zmienna nazwana została “temperatura“, a wartość wynosi 25 stopni Celsjusza, wtedy warunek zapiszemy (Kod_003):
W przypadku, kiedy chcemy wyświetlić komunikat na porcie szeregowym, gdy temperatura przekroczy 25oC, możemy użyć instrukcji if w następujący sposób (Symulacja_1):
W zaprezentowanej powyżej symulacji, wyrażenie (temperatura > 25) stanowi kluczowy warunek poddany ocenie. Program bada, czy wartość przechowywana w zmiennej temperatura przewyższa wartość 25. Mając na uwadze, że zmienna temperatura została wcześniej zainicjowana wartością 30, warunek ten zostaje zinterpretowany jako spełniony (true), gdyż wartość 30 jest większa od wartości 25.
Porównywać ze sobą możemy również dwie zmienne np. o nazwach “temperatura1” oraz “temperatura2“, zapiszemy wtedy (Kod_004):
Teraz, podobnie jak w poprzednim przykładzie (Symulacja_1), gdzie porównywana była zmienna z wartością, wykonamy analogiczne porównanie między dwiema zmiennymi: temperatura1 i temperatura2 – (Symulacja_2):
W powyższym przykładzie wyrażenie (temperatura1 > temperatura2) stanowi kluczowy warunek sprawdzany przez program. Ocenia ono, czy wartość zmiennej temperatura1 jest większa od wartości zmiennej temperatura2. Ponieważ temperatura1 została ustawiona na 30, a temperatura2 na 25, warunek jest spełniony (true), gdyż 30 jest większe od 25. Na monitorze portu szeregowego pojawi się w tym przypadku komunikat “Temperatura1 przekroczyla 25 stopni.“.
Ciekawostka
Sprawdź jeszcze co się stanie jeśli nie podamy żadnego operatora i wartości do porównania (zmienna musi być typu boolean) – Kod_005:
Poniżej przedstawiono przykład symulacji, w której nie zastosowano operatora porównania (Symulacja_3):
Gdy w instrukcji if nie użyjemy operatora porównania ani wartości/zmiennej do porównania, wykonanie bloku kodu zależeć będzie wyłącznie od tego, czy wyrażenie test samo w sobie jest oceniane jako prawdziwe true lub fałszywe false – zamiast true i false możemy też użyć wartość 0 lub 1.
W powyższych symulacjach, gdy warunek nie był spełniony, program nie wykonywał kodu znajdującego się w nawiasach klamrowych instrukcji warunkowej, co oznaczało brak jakiegokolwiek komunikatu na monitorze portu szeregowego. Tylko w przypadku, gdy warunek był true, program wyświetlał odpowiedni komunikat. Aby zapewnić działanie także w sytuacji, gdy warunek nie jest spełniony, stosuje się instrukcję else, która zostanie omówiona w kolejnym podrozdziale.
Instrukcja ELSE
Instrukcja else w programowaniu służy do wykonania bloku kodu, gdy warunek w poprzedzającej instrukcji if nie zostaje spełniony. Jest to rodzaj “planu zapasowego” lub alternatywnej ścieżki, którą program może podążyć, gdy główny warunek logiczny nie prowadzi do wykonania bloku kodu w if.
Instrukcja else zatem zapewnia mechanizm do obsługi różnych scenariuszy w przepływie programu, umożliwiając realizację różnych akcji w zależności od spełnienia lub niespełnienia określonego warunku. Stosując instrukcję if łącznie z instrukcją else, mamy pewność, że na pewno któryś z bloku kodu zostanie wykonany – Kod_006.
Instrukcja else zawsze występuje w parze z instrukcją if i nie może być używana samodzielnie. Blok kodu umieszczony wewnątrz else zostanie wykonany tylko wtedy, gdy warunek w instrukcji if oceniony zostanie jako fałszywy (false).
Załóżmy, że piszemy program kontrolujący system oświetlenia, który włącza światła, gdy jest ciemno (Symulacja_4):
W tym przykładzie program kontroluje system oświetlenia na podstawie zmiennej jestCiemno. Jeśli jestCiemno jest ustawione na true, program wyświetli komunikat o włączeniu świateł (ponieważ gdy jest ciemno, światła powinny się włączyć). W przeciwnym razie (false), światła pozostaną wyłączone. To prosty model automatycznego sterowania oświetleniem w zależności od warunków otoczenia.
Sprawdź, jak powyższy przykład zadziała, jeśli zmienna jestCiemno zainicjowana zostanie wartością true zamiast false.
Instrukcja ELSE IF
Instrukcja else if pozwala na tworzenie bardziej złożonych i elastycznych warunków decyzyjnych w programie. Działa jako pośredni element między if a else, umożliwiając sprawdzenie wielu różnych warunków jeden po drugim w ramach tego samego bloku kodu. Dzięki temu program może obsługiwać różne scenariusze w zależności od spełnienia określonych kryteriów.
Instrukcja else if zawsze występuje po if i przed ewentualnym else. Pozwala na sprawdzenie kolejnego warunku, jeśli poprzedni nie został spełniony. Można stosować wiele instrukcji else if w jednym bloku, aby przeanalizować kilka różnych przypadków przed wykonaniem kodu w else – Kod_007.
Przykład użycia: Załóżmy, że piszemy program do określania pory dnia na podstawie godziny (Symulacja_5):
W tym przykładzie, jeśli godzina jest wcześniejsza niż 10, program wyświetla komunikat “Dobry poranek!“. Gdy godzina wynosi co najmniej 10, ale jest mniejsza niż 20, wykonywana jest instrukcja else if, która wyświetla “Milego dnia!”. Jeśli żaden z tych warunków nie jest spełniony, czyli godzina wynosi 20 lub więcej, program przechodzi do bloku else i wypisuje “Dobranoc!“.
Jeszcze jeden przykład użycia instrukcji else if (Symulacja_6):
W tym przykładzie program sprawdza wartość temperatury i wyświetla odpowiedni komunikat w zależności od jej zakresu. Jeśli temperatura wynosi 20 lub mniej, program wyświetli “Zimno“. Dla wartości od 21 do 30 pojawi się komunikat “Umiarkowanie“, a w przedziale 31–40 – “Goraco“. Gdy temperatura przekroczy 40, program wypisze “Upal“. Dzięki instrukcjom if…else if…else możliwe jest precyzyjne dopasowanie reakcji programu do różnych warunków.
Zastosowanie operatorów logicznych w instrukcjach warunkowych
Operatory logiczne pozwalają na łączenie kilku warunków w jednym wyrażeniu, ułatwiając implementację złożonych decyzji logicznych. W tym rozdziale omówimy podstawowe zasady stosowania operatorów logicznych w instrukcjach warunkowych, skupiając się na trzech podstawowych operatorach: AND (&&), OR (||) oraz NOT (!).
Operator AND (&&): stosuje się, gdy konieczne jest jednoczesne spełnienie dwóch lub więcej warunków. Wyrażenie zawierające AND oceniane jest jako prawdziwe tylko wtedy, gdy wszystkie pojedyncze warunki są prawdziwe. Na przykład (Kod_008):
W powyższym przykładzie, kod wewnątrz bloku if zostanie wykonany tylko, gdy temperatura będzie jednocześnie większa niż 20 i mniejsza niż 30 stopni Celsjusza.
Operator OR (||): jest stosowany, gdy wystarczy, że przynajmniej jeden z wielu warunków zostanie spełniony, aby całe wyrażenie zostało uznane za prawdziwe. Na przykład (Kod_009):
Tutaj, kod zostanie wykonany, jeśli spełniony jest przynajmniej jeden z warunków: pada deszcz lub temperatura jest mniejsza niż 5 stopni.
Operator NOT (!): jest używany do odwracania wartości logicznej warunku; z true na false lub z false na true. Umożliwia to wykonanie kodu w przypadku, gdy dany warunek nie jest spełniony. Na przykład (Kod_010):
W tym przykładzie, kod wewnątrz if zostanie wykonany tylko, gdy deszcz jest fałszywy, czyli gdy nie pada.
Przykład - operatory logiczne
Rozważmy przykład systemu alarmowego, który aktywuje alarm tylko wtedy, gdy wszystkie okna w domu są zamknięte. Załóżmy, że mamy trzy zmienne reprezentujące stan trzech okien: 'okno1', 'okno2', 'okno3', gdzie wartość true oznacza, że okno jest zamknięte, a false oznacza, że okno jest otwarte (Symulacja_7):
W tym przykładzie instrukcja if sprawdza, czy wszystkie trzy zmienne (okno1, okno2 i okno3) mają wartość true, co oznacza, że wszystkie okna są zamknięte. Jeśli warunek jest spełniony, program wykonuje kod wewnątrz bloku if, wyświetlając komunikat o włączeniu alarmu. W przeciwnym razie, jeśli przynajmniej jedno okno jest otwarte (czyli przynajmniej jedna zmienna ma wartość false), wykonywany jest blok else, informujący o wyłączeniu alarmu.
Rola nawiasów w instrukcjach warunkowych
Gdy warunki logiczne stają się bardziej złożone, priorytety operatorów mogą okazać się niewystarczające, ponieważ nie zawsze zapewniają pełną kontrolę nad kolejnością ich oceny. W takich przypadkach stosujemy nawiasy, które jednoznacznie definiują sposób analizowania poszczególnych części wyrażenia. Dzięki temu program działa zgodnie z zamierzoną logiką, eliminując ryzyko błędnej interpretacji i nieoczekiwanych rezultatów, a jednocześnie poprawia się jego czytelność i przewidywalność.
Przeanalizujmy prosty przykład znany ze szkolnej matematyki, pokazujący, że kolejność operacji ma znaczenie: 2 + 2 * 2 = 6
W powyższym równaniu, dodanie nawiasów zmienia wynik: (2 + 2) * 2 = 8.
Analizowany przykład ilustruje, jak nawiasy wpływają na kolejność wykonywania działań, prowadząc na końcu do różnych rezultatów.
Załóżmy, że chcemy sprawdzić, czy dana osoba może oglądać film na podstawie jej wieku, zgody rodziców i pory dnia.
Warunki są następujące:
- Osoba musi mieć więcej niż 12 lat lub mieć zgodę rodziców.
- Film można oglądać tylko przed 22:00.
Wyrażenie warunkowe może wyglądać następująco (Symulacja_8):
W tym przypadku, używamy nawiasów do grupowania pierwszych dwóch warunków (wiek > 12 || zgodaRodzicow), co oznacza, że osoba musi mieć więcej niż 12 lat lub musi mieć zgodę rodziców, aby móc dalej kwalifikować się do oglądania filmu. Dopiero po spełnieniu tego zgrupowanego warunku, sprawdzamy, czy aktualna godzina jest wcześniejsza niż 22.
Podsumowując, użycie nawiasów w złożonych wyrażeniach warunkowych jest kluczowe dla zapewnienia, że warunki są oceniane w odpowiedniej kolejności, co pozwala na budowanie precyzyjnych i zrozumiałych logik decyzyjnych. Pomagają one w klarownym zdefiniowaniu priorytetów oceny warunków, co jest szczególnie ważne, gdy łączymy różne operatory logiczne w jednym wyrażeniu.
Dobra praktyka - klamry
W środowisku programistycznym Arduino, klamry w instrukcjach warunkowych nie są potrzebne, gdy blok kodu, który ma zostać wykonany po spełnieniu warunku, składa się tylko z jednej instrukcji.
Oznacza to, że jeśli po instrukcji if, else if lub else następuje tylko jedno działanie, klamry można pominąć (Kod_011):
Klamry jednoznacznie określają, które instrukcje należą do danego bloku warunkowego i są obowiązkowe, gdy blok zawiera więcej niż jedną instrukcję. W prostych przypadkach można je pominąć, jednak ich stosowanie nawet dla pojedynczych instrukcji jest dobrą praktyką, która poprawia czytelność kodu i ułatwia jego modyfikację w przyszłości (Kod_012):
Asystent Arduinowo_AI

Asystent Arduinowo_AI zgłębił powyższy zakres wiedzy i z przyjemnością wszystko Ci wyjaśni.
Zdobądź więcej wiedzy!
Przejdź do kolejnych materiałów naszego kursu: Instrukcje switch…case, enum oraz operator (?:).