Program steruje światem
🎯 Po co Ci to?
Wszystkie Twoje dotychczasowe programy żyły w akwarium: dane z klawiatury, wyniki na ekran. Tymczasem większość komputerów świata nie ma ani klawiatury, ani ekranu — siedzą w pralkach, windach, dronach, sygnalizacji świetlnej i rozrusznikach serca. Ich „input" to czujniki, a „print" to silniki i przekaźniki. Dobra wiadomość: to wciąż te same cztery klocki — zmienne, warunki, pętle, funkcje. Zmienia się tylko partner rozmowy: zamiast człowieka — świat fizyczny. A świat fizyczny, jak zobaczysz, jest wymagającym rozmówcą.
✅ Czego się nauczysz
Po tej jednostce potrafisz:
- opisać pętlę sterowania: odczyt czujników → decyzja → działanie;
- zaprojektować (w pseudokodzie lub Pythonie) program sterujący prostym urządzeniem;
- wyjaśnić różnicę między sygnałem z czujnika a „czystą" daną z klawiatury.
📘 Wyjaśnienie
Pętla sterowania. Serce każdego urządzenia sterowanego programem bije w tym samym rytmie — nieskończonej pętli:
powtarzaj bez końca:
odczytaj czujniki (WEJŚCIE: świat → liczby)
podejmij decyzję (PRZETWARZANIE: warunki)
ustaw urządzenia wykonawcze (WYJŚCIE: liczby → świat)
odczekaj chwilę
Poznajesz? To „wejście → przetwarzanie → wyjście" z jednostki 3.1, opakowane w while True (pętla celowo nieskończona — pralka ma sterować, póki ma prąd). Czujnik — termometr, czujnik odległości, przycisk — zamienia wielkość fizyczną na liczbę, którą program czyta jak zwykłą zmienną. Urządzenie wykonawcze — silnik, grzałka, dioda — zamienia liczbę z programu z powrotem na działanie w świecie.
Przykład: termostat. Utrzymuje temperaturę 21°C, sterując grzejnikiem:
CEL = 21.0
HISTEREZA = 0.5
while True:
t = odczytaj_temperature() # czujnik → liczba
if t < CEL - HISTEREZA: # za zimno (poniżej 20,5)
wlacz_grzanie()
elif t > CEL + HISTEREZA: # za ciepło (powyżej 21,5)
wylacz_grzanie()
odczekaj(sekund=10)
(Funkcje odczytaj_temperature czy wlacz_grzanie dostarcza producent sterownika — Ty piszesz logikę.) Zwróć uwagę na HISTEREZA — szczelinę między progami włączania i wyłączania. Po co? Wyobraź sobie wersję naiwną: „grzej, gdy $t < 21$; nie grzej, gdy $t \ge 21$". Przy temperaturze drgającej wokół 21,0 (a pomiary zawsze drgają) grzejnik pstrykałby się co kilka sekund — na śmierć przekaźnika. Szczelina sprawia, że urządzenie przełącza się rzadko i zdecydowanie. To pierwsza lekcja sterowania światem: pomiary są zaszumione, a częste przełączanie kosztuje — z klawiaturą tego nie było.
Przykład: robot omijający przeszkody. Czujnik odległości z przodu, dwa silniki:
while True:
d = odczytaj_odleglosc() # w centymetrach
if d > 30:
jedz_prosto()
elif d > 10:
skrec_w_prawo() # przeszkoda blisko: omiń
else:
cofnij() # przeszkoda tuż-tuż: ratunku
odczekaj(sekund=0.1)
Kaskada progów jak z ocen w 3.2 — tylko zamiast stopni szkolnych: zachowania maszyny. Jeśli masz dostęp do robota edukacyjnego albo mikrokontrolera (w wielu szkołach są) — ten program, po drobnym dopasowaniu nazw funkcji do zestawu, naprawdę jeździ. Jeśli nie masz — nic straconego: eksperyment myślowy działa zawsze. Weź kartkę w kratkę, narysuj pokój z przeszkodami i wykonuj program „za robota", krok po kroku, odczytując odległości z rysunku. Śledzenie z działu 1 właśnie awansowało na symulację.
💭 Pomyśl: Robot z powyższym programem jedzie wzdłuż długiej ściany, która jest po jego lewej stronie, w odległości 20 cm z przodu nic nie ma. Co zrobi? A co zrobi, gdy dojedzie do rogu (ściana pojawi się z przodu)? Znajdź sytuację, w której robot utknie na dobre.
Sprawdź odpowiedź
Ściana z boku jest dla czujnika przedniego niewidzialna — robot jedzie prosto (i słusznie). W rogu: odległość spada, przy 30 cm zaczyna skręcać w prawo, aż przód się zwolni — róg pokonany. Utknięcie: ciasny kąt/wnęka węższa niż potrzeba — robot skręca w prawo, trafia na ścianę, cofa, znów podjeżdża… i tańczy w kółko. Sterowanie oparte na jednym czujniku ma ślepe strefy i pułapki; dokłada się więc czujniki boczne, losowy skręt po kilku cofnięciach, pamięć ostatnich decyzji. Projektowanie zachowań na wszystkie przypadki świata to esencja robotyki — i wcale nie trywialna.
⚠️ Uwaga, pułapka
W akwarium klawiatury błędne dane wpisuje człowiek. W świecie fizycznym błędne dane produkuje rzeczywistość: czujnik chwilowo zwróci 0 albo wartość absurdalną (odbicie, zabrudzenie, drgania). Program sterujący, który przy jednym głupim odczycie robi gwałtowny manewr, jest niebezpieczny. Proste lekarstwa: ignoruj wartości spoza sensownego zakresu (specyfikacja!), uśredniaj kilka ostatnich pomiarów, wymagaj dwóch zgodnych odczytów przed drastyczną akcją. Testowanie z koszyka „dane błędne" przestaje tu być formalnością — bywa kwestią bezpieczeństwa.
🌍 Powiązania
Pętla „czujnik → decyzja → akcja" krąży wszędzie: tempomat w aucie (prędkość → gaz), winda (przyciski i czujniki pięter → silnik), automatyczna bramka (fotokomórka → szlaban), rozrusznik serca (rytm → impuls). Nawet organizmy żywe działają w tym schemacie — biolodzy mówią o pętlach sprzężenia zwrotnego, a termostat z histerezą to dokładnie to, co robi Twój organizm z temperaturą ciała. Informatyka, biologia i automatyka podają sobie tu ręce.
🛠️ Teraz Ty
Zaprojektuj (pseudokod albo Python z wymyślonymi funkcjami czujników) sterownik przejścia dla pieszych z przyciskiem: normalnie zielone dla aut; po wciśnięciu przycisku — po 5 sekundach żółte, potem czerwone dla aut i zielone dla pieszych na 20 sekund, potem powrót. Uwzględnij: co się dzieje, gdy ktoś wciska przycisk w trakcie fazy zielonej dla pieszych? Wykonaj swój program „na sucho" dla scenariusza z dwoma pieszymi.
📐 Definicje tej lekcji
- Pętla sterowania — nieskończone „odczytaj → zdecyduj → wykonaj → odczekaj"; szkielet programów wbudowanych.
- Czujnik / urządzenie wykonawcze — przetwornik świata na liczby / liczb na działanie.
- Histereza — szczelina między progiem włączenia i wyłączenia, chroniąca przed trzepotaniem decyzji.
📌 Najważniejsze w pigułce
- Sterowanie to te same klocki (zmienne, warunki, pętle, funkcje) z innym wejściem i wyjściem.
- Pomiary drgają i kłamią: progi z histerezą, filtrowanie odczytów, odporność na absurdy — to standard, nie luksus.
- Bez sprzętu też się da: symulacja na kartce uczy dokładnie tego samego myślenia.
🎒 Zadania
- Automatyczne oświetlenie schodów: czujnik ruchu (zwraca
True/False) i lampa. Światło ma się włączać przy ruchu i gasnąć 30 sekund po ostatnim wykrytym ruchu. Napisz pętlę sterowania. (Podpowiedź: potrzebujesz zmiennej pamiętającej „czas od ostatniego ruchu".)
Wskazówka i odpowiedź
od_ruchu = 9999
while True:
if czujnik_ruchu():
od_ruchu = 0
wlacz_lampe()
else:
od_ruchu = od_ruchu + 1
if od_ruchu > 30:
wylacz_lampe()
odczekaj(sekund=1)
Sedno: nie gasimy „gdy brak ruchu", tylko „gdy brak ruchu utrzymuje się" — licznik od_ruchu to pamięć, której czysty warunek nie ma. Bardzo wiele sterowań wymaga takiej małej pamięci stanu.
- Szklarnia: czujnik wilgotności gleby (0–100%) i zawór podlewania. Zaprojektuj sterowanie z histerezą (podlewaj poniżej 40%, przestań powyżej 60%) i wyjaśnij, co by się działo z progami 50%/50%.
Wskazówka i odpowiedź
if w < 40: otworz_zawor() / elif w > 60: zamknij_zawor() (między 40 a 60 — nie zmieniaj stanu!). Przy wspólnym progu 50% wilgotność drgająca wokół 50 (a pomiar gleby drga mocno) powodowałaby ciągłe otwieranie/zamykanie zaworu: zużycie sprzętu, chlupanie wody, chaos. Histereza = spokój. Zauważ też wariant „nie rób nic" — trzeci stan, którego początkujący często zapominają.
- Czujnik odległości robota raz na jakiś czas zwraca fałszywe 0 cm (odbicie od kurzu). Z programem z 📘 robot wtedy gwałtownie cofa. Zaproponuj poprawkę wymagającą dwóch kolejnych odczytów poniżej 10 cm, zanim robot zacznie cofać.
Wskazówka i odpowiedź
Dodaj licznik podejrzeń: blisko = blisko + 1 gdy d < 10, zerowany w przeciwnym razie; cofaj dopiero przy blisko >= 2. Jeden szalony odczyt zostanie zignorowany, prawdziwa przeszkoda (dwa zgodne odczyty co 0,1 s) — obsłużona z opóźnieniem ledwie 0,1 s. Wymiana odrobiny czasu reakcji na odporność — typowy, świadomy kompromis inżyniera.
🔍 Sprawdź, czy umiesz
- Naszkicować pętlę sterowania dowolnego urządzenia z domu.
- Wyjaśnić histerezę na przykładzie i uzasadnić jej potrzebę.
- Wskazać, czym różni się testowanie programu sterującego od testowania kalkulatora.