Instrukcja warunkowa IF to podstawowy mechanizm podejmowania decyzji w Arduino, który uruchamia różne bloki kodu w zależności od spełnienia warunku.
Umożliwia to tworzenie inteligentnych systemów, w których mikrokontroler dynamicznie reaguje na zmiany stanów sensorów, przycisków i zmiennych – kluczowe w elektronice i automatyce.
Podstawowa składnia instrukcji IF
Najprostsza forma instrukcji if sprawdza warunek w nawiasach okrągłych i wykonuje blok w klamrach {}, jeśli wynik to true. Składnia wygląda następująco:
if (warunek) {
// kod wykonywany, gdy warunek jest spełniony
}
Przykładowo, jeśli sprawdzamy, czy liczba 5 jest większa od 2:
if (5 > 2) {
// ten blok się wykona, bo warunek jest prawdziwy
}
Warunek musi być wyrażeniem logicznym zwracającym true lub false.
Nigdy nie stawiaj średnika po nawiasie warunku (np. if (x > 0);), bo zablokuje to poprawne działanie bloku.
Rozszerzenie o ELSE – obsługa przypadku przeciwnego
Aby obsłużyć sytuację, gdy warunek if nie jest spełniony, dodaj blok else. Pełna struktura wygląda tak:
if (warunek) {
// kod dla warunku prawdziwego
} else {
// kod dla warunku fałszywego
}
W praktyce, w projektach Arduino, taki kod może sterować diodą LED: zapalić ją, gdy przycisk jest wciśnięty (stan HIGH), a zgasić w przeciwnym razie. Przykładowy kod dla pinu 9 jako wejścia przycisku i pinów 10/11 jako wyjść:
if (digitalRead(9) == HIGH) {
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
} else {
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
}
Else jest opcjonalne – jeśli go nie dodasz, program po prostu pominie blok i przejdzie dalej.
Złożone warunki z ELSE IF
Gdy chcesz rozróżnić wiele stanów, użyj łańcucha else if, który sprawdza kolejne warunki tylko wtedy, gdy poprzednie nie zostały spełnione. Składnia:
if (warunek1) {
// kod dla warunku1
} else if (warunek2) {
// kod dla warunku2 (jeśli !warunek1)
} else if (warunek3) {
// kod dla warunku3 (jeśli !warunek1 && !warunek2)
} else {
// kod domyślny (wszystkie warunki fałszywe)
}
To idealne rozwiązanie do klasyfikacji odczytów z sensora odległości: blisko – cofnij robota, daleko – jedź do przodu, średnio – zatrzymaj się.
Operatory porównania i logiczne – budowa warunków
Warunki opierają się na operatorach porównania i logicznych. Najważniejsze operatory porównania:
| Operator | Opis | Przykład |
|---|---|---|
== |
Równe | zmienna == 1 |
!= |
Różne | zmienna != 0 |
> |
Większe | 5 > 2 |
< |
Mniejsze | 4 < 10 |
>= |
Większe lub równe | x >= 10 |
<= |
Mniejsze lub równe | x <= 5 |
Uwaga: używaj operatora == do porównania, nigdy pojedynczego = (to przypisanie), bo kod zadziała nieoczekiwanie.
Operatory logiczne łączą warunki i pozwalają tworzyć bardziej złożone reguły:
- && – prawdziwe, gdy oba warunki są spełnione, np.
if (5 > 2 && 4 < 10); - || – prawdziwe, gdy przynajmniej jeden warunek jest spełniony, np.
if (5 > 2 || 10 < 5); - ! – negacja warunku, np.
if (!digitalRead(3))(stan niski na pinie 3).
Przykład w kontekście sensorów: if (digitalRead(3) && digitalRead(4)) – oba przyciski wciśnięte.
Praktyczne przykłady w projektach Arduino
Przykład 1 – sterowanie LED na podstawie przycisku
Podstawowy obwód z przyciskiem na pinie 2 i diodą LED na pinie 13 działa następująco:
void setup() {
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (digitalRead(2) == HIGH) {
digitalWrite(13, HIGH); // zapal LED
} else {
digitalWrite(13, LOW); // zgaś LED
}
}
Przykład 2 – odczyt z portu szeregowego i warunki
Użyj Serial.parseInt() do odczytu liczb lub Serial.readString() do tekstu, a następnie zareaguj warunkowo:
int wartosc = Serial.parseInt();
if (wartosc > 100) {
Serial.println("Za dużo!");
} else if (wartosc < 0) {
Serial.println("Za mało!");
} else {
Serial.println("OK!");
}
Taki schemat świetnie sprawdza się przy zdalnym sterowaniu robotem przez komputer.
Przykład 3 – wielowarunkowa kontrola robota
Symulacja robota z sensorem odległości sterującego prędkością silników PWM:
int odleglosc = analogRead(A0); // odczyt z sensora
if (odleglosc < 200) {
// blisko - cofnij
analogWrite(9, 0);
analogWrite(10, 255);
} else if (odleglosc > 800) {
// daleko - jedź
analogWrite(9, 255);
analogWrite(10, 0);
} else {
// średnio - stop
analogWrite(9, 0);
analogWrite(10, 0);
}
Alternatywa – instrukcja SWITCH dla wielu dyskretnych wartości
Dla wielu porównań równościowych bardziej przejrzysta i często efektywniejsza jest instrukcja switch:
switch (wartosc) {
case 1:
// kod dla 1
break;
case 2:
// kod dla 2
break;
default:
// domyślny
break;
}
Break zapobiega „przeciekaniu” wykonania do kolejnych przypadków – przydatne w menu robota czy stanach FSM (Finite State Machine).
Najczęstsze błędy i dobre praktyki
Poniżej znajdziesz najczęstsze pułapki oraz wskazówki poprawiające czytelność i niezawodność kodu:
- brak klamer – zawsze używaj
{}nawet dla jednej instrukcji, to poprawia czytelność i eliminuje błędy; - średnik po if – zapis
if (x > 0); { ... }sprawi, że blok wykona się zawsze, niezależnie od warunku; - pomyłka
=vs==– do porównania używaj zawsze podwójnego równa się; - zbyt głębokie zagnieżdżanie – upraszczaj logikę, preferuj płaski łańcuch else if lub switch;
- debugowanie – korzystaj z Serial.print(), aby wypisywać wartości i stany warunków.
IF pozwala budować adaptacyjne zachowania robota – od unikania przeszkód po reakcję na światło – i jest fundamentem każdego projektu na Arduino.