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

  1. 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.

  1. 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ą.

  1. 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.

Ucz się tej jednostki z asystentem