Instrukcja switch…case w Arduino
Instrukcja switch…case w środowisku Arduino umożliwia wykonywanie różnych bloków kodu w zależności od wartości określonej zmiennej. Stanowi czytelną i efektywną alternatywę dla zagnieżdżonych instrukcji if…else, ułatwiając zarządzanie wieloma warunkami.
Instrukcja switch analizuje wartość podanej zmiennej, porównując ją z opcjami zdefiniowanymi w blokach case. Gdy znajdzie zgodność, wykonuje przypisany do danego przypadku kod. Aby zapobiec niezamierzonemu przechodzeniu do kolejnych bloków case, każdy z nich zazwyczaj kończy się instrukcją break.
Przykład użycia (Kod_001):
Powyżej wyrażenie to zmienna lub wartość, którą analizujemy i porównujemy z poszczególnymi wartościami określonymi w przypadkach (case) tej instrukcji. Jeśli żadna z wartości nie pasuje do wyrażenia, wykonywany jest kod zawarty w instrukcji default.
Kilka ważnych właściwości instrukcji switch…case:
- W instrukcji switch…case mogą być używane wartości tylko typu int, char, oraz typy wyliczeniowe enum.
- Gdy w konstrukcji switch…case pominie się instrukcję break w jednym z przypadków, wykonanie kodu będzie kontynuowane do następnego przypadku bez ponownego sprawdzania warunku, aż do napotkania kolejnego break lub końca bloku switch.
- Instrukcję default w konstrukcji switch…case należy użyć, gdy chcemy określić blok kodu, który zostanie wykonany, jeśli żadna z innych wartości przypadków (case) nie pasuje do wartości wyrażenia switch.
- Porównanie switch…case z else if: Instrukcja switch…case w Arduino pozwala na bardziej uporządkowane i czytelne porównywanie jednej zmiennej z wieloma wartościami, podczas gdy zagnieżdżone instrukcje if else oferują większą elastyczność w testowaniu różnorodnych i potencjalnie złożonych warunków.
Poniżej znajdziesz przykład wykorzystania instrukcji switch…case w Arduino, który drukuje nam informacje na którym schodku się znajdujemy (zakładając, że wchodzimy po schodach). W zależności od numeru schodka, na którym znajduje się użytkownik, program wyśle przez port szeregowy odpowiedni komunikat (Symulacja_1):
W tym przykładzie zmienna numerSchodka reprezentuje numer schodka, na którym aktualnie znajduje się użytkownik. Instrukcja switch analizuje tę zmienną i w zależności od jej wartości wyświetla odpowiedni komunikat przez port szeregowy. Każdy przypadek (case) odpowiada jednemu z czterech schodków. Jeśli wartość numerSchodka nie mieści się w zakresie od 0 do 4, program wypisze komunikat informujący, że taki schodek nie istnieje.
Przykład ten pokazuje, jak za pomocą instrukcji switch…case można obsługiwać różne scenariusze w zależności od wartości zmiennej, umożliwiając przejrzyste zarządzanie wieloma opcjami w programie.
Alternatywnie, zamiast instrukcji switch…case, można użyć struktury if…else if…else, która pozwala na osiągnięcie tego samego efektu poprzez sekwencyjne sprawdzanie warunków. Poniżej przedstawiono taki sposób realizacji (Symulacja_2):
Porównanie:
- switch…case jest bardziej przejrzysty, gdy porównujemy jedną zmienną z wieloma wartościami, ponieważ eliminuje powtarzanie zmiennej (numerSchodka == …).
- if…else if…else daje większą elastyczność, ponieważ pozwala na bardziej złożone warunki, np. if (numerSchodka > 4).
Dla tego konkretnego przypadku switch…case jest bardziej czytelny, ale jeśli warunki miałyby być bardziej skomplikowane (np. numerSchodka > 0 && numerSchodka < 5), if…else byłoby lepszym wyborem.
ENUM – typ wyliczeniowy
Enum to skrót od “enumerated type“, czyli wyliczenia. Jest to specjalna konstrukcja, która pozwala programiście określić zmienną mogącą przyjmować jedną z kilku wcześniej zdefiniowanych wartości. Dzięki enum kod staje się bardziej czytelny i łatwiejszy w utrzymaniu, ponieważ zamiast używać bezpośrednio liczb lub ciągów znaków do reprezentowania stanów czy typów, można korzystać z intuicyjnych nazwanych stałych.
Enum o nazwie “moja_nazwa”, który składa się z trzech wyliczeń definiuje się w taki sposób (Kod_002):
Uwaga: Nazwy w enum nie mogą zawierać polskich znaków.
Przykład użycia enum w instrukcji switch…case można zobaczyć w symulacji zamieszczonej poniżej.
Aby sprawdzić działanie programu, należy zmienić wartość zmiennej dzis w linijce 8 na dowolny inny dzień tygodnia, na przykład zamiast Sroda ustawić Niedziela (Symulacja_3):
W tym przykładzie enum pozwala w czytelny sposób reprezentować dni tygodnia jako nazwy zamiast liczb. Dzięki temu kod jest bardziej intuicyjny i łatwiejszy w utrzymaniu – zamiast zastanawiać się, co oznacza liczba 3, możemy bezpośrednio użyć Sroda. To sprawia, że kod jest przejrzysty, a dodanie nowych dni lub modyfikacja wartości nie wymaga pamiętania konkretnych liczb, tylko użycia zrozumiałych nazw.
Operator warunkowy (?:) – skrócona wersja if…else
Operator warunkowy, zwany również operatorem trójargumentowym (ternary operator), jest uproszczoną formą instrukcji if…else, pozwalającą na zapis warunku w jednej linii. Jest przydatny, gdy chcemy przypisać wartość do zmiennej lub wykonać prostą operację na podstawie warunku (Kod_003).
- Jeśli warunek jest prawdziwy (true), zwracana jest pierwsza wartość (po ?).
- Jeśli warunek jest fałszywy (false), zwracana jest druga wartość (po :).
Przykłady:
- Przypisanie wartości do zmiennej na podstawie warunku (Symulacja_4):
Jeśli temperatura jest większa niż 30, do status przypisywane jest “Goraco“, w przeciwnym razie “Chlodno“.
2. Znalezienie większej liczby (Symulacja_5):
Jeśli a jest większe od b, zmienna wieksza przyjmie wartość a, w przeciwnym razie b.
3. Sprawdzenie, czy liczba jest parzysta (Symulacja_6):
Jeśli liczba x jest parzysta, wypisuje “jest parzysta“, w przeciwnym razie “jest nieparzysta“.
Użycie operatora warunkowego (?:)
Dobre zastosowania:
- Proste przypisania wartości na podstawie warunku.
- Skrócenie kodu, gdy warunek jest prosty i czytelny.
- Oszczędność miejsca w pamięci programu (flash) w Arduino.
Kiedy lepiej użyć if…else?
- Jeśli kod warunkowy jest bardziej złożony (np. kilka linii kodu w każdym przypadku).
- Gdy wymagana jest większa czytelność i łatwiejsze debugowanie1.
Operator warunkowy sprawdza się świetnie w prostych decyzjach, ale w bardziej skomplikowanych przypadkach lepiej korzystać z klasycznych instrukcji warunkowych.
- Debugowanie to proces wykrywania i usuwania błędów w programie, który polega na analizie działania kodu oraz testowaniu poprawek. W praktyce odbywa się to poprzez używanie narzędzi takich jak Serial.println() w Arduino, debuggera w IDE lub analizatora stanów logicznych, aby śledzić wartości zmiennych i sprawdzać, czy program działa zgodnie z oczekiwaniami. ↩︎
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: Pętla FOR w Arduino.