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.