Nasıl çalışılır?

  1. Görevleri sırayla yapın; her görev bir öncekinin üzerine bir şey ekler.
  2. Her görev için simülasyonun klasöründe, kütüphane dosyasının yanında yeni bir dosya açın (ör. c_room/gorev01.c veya py_room/gorev01.py) ve kütüphaneyi ekleyin.
  3. Önce simülasyonu başlatın, sonra programınızı çalıştırın. Sonsuz döngülü programları Ctrl+C ile durdurun.
  4. Takıldığınızda önce ipucuna bakın; cevabı en son açın.

Oda simülasyonu hakkında bilmeniz gerekenler:
• Simülasyon penceresinin altındaki elle kontrol paneli (menüdeki Elle Kontrol ile açılıp kapanır) ile sensörleri ve çıkışları elle değiştirebilirsiniz: Oda Sıcaklığını Değiştir ve Gün Işığını Değiştir sürgüleri; Lamba Aç / Lamba Kapat, Klima Aç / Klima Kapat, Perde Yukarı / Perde Dur / Perde Aşağı düğmeleri.
• Sıcaklık hiç durmaz: klima kapalıyken her 0,1 saniyede 1 °C ısınır, açıkken aynı hızla soğur. Klima açılıp kapandığında oda yön değiştirmeden önce yaklaşık 1 saniye bekler. Sıcaklık kendiliğinden 13 ile 44 °C arasında kalır.
• Dış ışık kendiliğinden 20 ile 1000 lüks arasında yavaşça gidip gelir (her 0,1 saniyede 1 lüks). Beklemek istemiyorsanız sürgüyle istediğiniz değere getirin.
• Perde başlangıçta tamamen aşağıdadır (kapalı). Tam açılması yaklaşık 4,5 saniye sürer. Perde en üste veya en alta gelince motor kendiliğinden durur ve read_curtain() 0 (CURTAIN_STOP) döndürür. Perdenin konumu okunamaz, sadece motorun ne yaptığı okunur.
• Programınız bitince lamba, klima ve perde son verilen komutta kalır. Değişimler çok hızlı geliyorsa menüdeki Animasyon Hızı ile simülasyonu yavaşlatın; Yenile her şeyi başa alır.

1 Başlangıç

Bağlanma, çıkışları açıp kapatma ve bekleme.
01

Simülasyona bağlan

Cevabı gör

Simülasyona bağlanan, ekrana Hello room! yazan ve bağlantıyı kapatan bir program yazın.
Önce simülasyonu başlatın, sonra programı çalıştırın. Konsolda kütüphanenin [SIM] Connected ve [SIM] Disconnected. mesajlarını da görmelisiniz.
Sonra simülasyonu kapatıp programı yeniden çalıştırın: bağlantı kurulamadığı için program hata mesajıyla bitmelidir.

İpucu
sim_connect() başarılı olursa 0 döndürür. 0 değilse programı hemen bitirin.
sim_connect()sim_disconnect()printf / print
02

Lambayı yak

Cevabı gör

Odadaki lambayı yakan bir program yazın. Program lambayı yaktıktan sonra bitsin.
Program bittiğinde lamba yanmaya devam ediyor mu? Gözlemleyin. Sonra lambayı elle kontrol panelindeki Lamba Kapat düğmesiyle söndürün.

İpucu
Görev 1'deki iskeletin ortasına tek bir satır yeter: lamp(LAMP_ON).
lamp()LAMP_ON
03

Yak, bekle, söndür

Cevabı gör

Lambayı yakın, 2 saniye bekleyin ve söndürün. Lamba simülasyonda 2 saniye yanık görünmeli, program bittiğinde sönük kalmalı.

İpucu
C'de Sleep() milisaniye alır (1 saniye = 1000), Python'da time.sleep() saniye alır.
Sleep / time.sleepLAMP_OFF
04

Önce lamba, sonra klima

Cevabı gör

Şu sırayı uygulayan bir program yazın:
1. Lambayı yakın.
2. 3 saniye sonra klimayı açın (odada klimanın rüzgârı görünür).
3. 5 saniye sonra lambayı ve klimayı kapatın.
Klima açıkken sıcaklık göstergesini izleyin: yaklaşık 1 saniye sonra düşmeye başlar.

İpucu
Komutlar yazıldıkları sırayla çalışır. Her adımın arasına bir bekleme koyun.
ac()AC_ONsequence
05

Perdeyi aç ve kapat

Cevabı gör

Perde kapalıyken (en aşağıda) başlayın. Perdeyi yukarı çalıştırın, 6 saniye bekleyin, sonra aşağı çalıştırın ve programı bitirin.
Perde en üste gelince kendiliğinden durmalı; program bittikten sonra da aşağı inmeye devam edip en altta durmalı.

İpucu
curtain(CURTAIN_UP) ve curtain(CURTAIN_DOWN) motoru çalıştırır. Tam açılma yaklaşık 4,5 saniye sürer.
curtain()CURTAIN_UPCURTAIN_DOWN
06

Perdeyi yarıya kadar aç

Cevabı gör

Perde kapalıyken başlayın. Perdeyi 2 saniye boyunca yukarı çalıştırıp durdurun. Perde pencerenin yaklaşık yarısında kalmalı.
Sonra süreyi 1 saniye ve 3 saniye yapıp farkı gözlemleyin (her denemeden önce perdeyi Perde Aşağı düğmesiyle kapatın).

İpucu
Motoru durdurmak için CURTAIN_STOP kullanın.
CURTAIN_STOPtiming
07

Günaydın senaryosu

Cevap sende

Perde kapalıyken başlayın. Her adımdan önce ekrana ne yapıldığını yazan bir sabah senaryosu hazırlayın:
1. Good morning! yazın, lambayı yakın, 2 saniye bekleyin.
2. Opening the curtain yazın, perdeyi yukarı çalıştırın, 5 saniye bekleyin.
3. Fresh air yazın, lambayı söndürün, klimayı açın, 3 saniye bekleyin.
4. Klimayı kapatın ve Ready for the day. yazın.

İpucu
Bu görevde yeni bir komut yok; Görev 1–6'da öğrendiklerinizi sırayla birleştirin.
sequenceprintf / print

2 Temel

Sensör okuma, ekrana yazdırma ve if/else ile karar verme.
08

Sıcaklığı oku

Cevabı gör

Oda sıcaklığını bir değişkene okuyun ve ekrana Temperature: 24 C biçiminde yazın.
Programı birkaç kez çalıştırın ve yazılan değeri simülasyondaki sıcaklık göstergesiyle karşılaştırın. Sonra Klima Aç düğmesine basıp tekrar çalıştırın.

İpucu
C'de int t = read_temp(); ve printf("%d", t); Python'da t = read_temp() ve f-string.
read_temp()variable%d / f-string
09

Oda raporu

Cevabı gör

Odanın bütün değerlerini okuyup alt alta yazan bir rapor programı yazın:
Temperature: .., Lux: .., AC: .., Lamp: .., Curtain motor: ..
Elle kontrol panelinden lambayı yakın, Gün Işığını Değiştir sürgüsünü 500'e getirin, perdeyi yukarı çalıştırın ve perde hareket ederken programı çalıştırın. Rapordaki sayılar yaptığınız değişiklikleri göstermeli.

İpucu
Okuma fonksiyonları: read_temp(), read_lux(), read_ac(), read_lamp(), read_curtain().
read_lux()read_ac()read_lamp()read_curtain()
10

Karanlıksa lambayı yak

Cevabı gör

Dış ışığı okuyun. Değer 100 lüksten azsa lambayı yakıp Dark (.. lux): lamp on yazın; değilse lambayı söndürüp Bright (.. lux): lamp off yazın.
Deneme: Gün Işığını Değiştir sürgüsünü 50'ye getirip programı çalıştırın, sonra 800'e getirip tekrar çalıştırın.

İpucu
if (kosul) { ... } else { ... } yapısını kullanın. Koşul: lux < 100.
if / else<
11

Sıcaksa klimayı aç

Cevap sende

Sıcaklığı okuyun. 26 °C'den yüksekse klimayı açıp Hot (.. C): AC on yazın; değilse klimayı kapatıp Not hot (.. C): AC off yazın.
Deneme: klima kapalıyken oda birkaç saniyede ısınır; programı çalıştırın, klima açılmalı. Sonra 5 saniye bekleyin (oda soğur) ve programı tekrar çalıştırın: klima kapanmalı.

İpucu
Görev 10'un aynısı, sadece sensör, eşik ve çıkış farklı.
if / else>read_temp()
12

Perde ne yapıyor?

Cevabı gör

Perde motorunun durumunu okuyup sayı yerine yazıyla gösterin: 0 ise Curtain stopped, 1 ise Curtain moving up, 2 ise Curtain moving down, başka bir değerse Unknown value.
Deneme: perde dururken çalıştırın; sonra Perde Yukarı (veya Perde Aşağı) düğmesine basıp perde hareket ederken hemen çalıştırın.

İpucu
Üç ve daha fazla seçenek için else if (Python'da elif) zinciri kurun. Sayı yerine CURTAIN_STOP gibi sabitlerle karşılaştırın; eşitlik == ile kontrol edilir.
else if / elif==constants
13

Boşuna yanan lamba

Cevap sende

Lamba yanıyorsa VE dışarısı 600 lüksten aydınlıksa lambayı söndürüp Lamp was on in daylight: turned off yazın. Aksi halde hiçbir komut göndermeden Nothing to do yazın.
Deneme: Lamba Aç düğmesine basın, ışık sürgüsünü 800'e getirip programı çalıştırın (lamba sönmeli). Sonra sürgüyü 300'e getirip lambayı yakın ve tekrar çalıştırın (lamba yanık kalmalı).

İpucu
İki koşulu birleştirmek için C'de &&, Python'da and kullanılır. Lambanın durumunu read_lamp() verir.
&& / andread_lamp()
14

Aynı komutu iki kez verme

Cevap sende

Görev 11'i geliştirin: komut göndermeden önce read_ac() ile klimanın durumuna bakın.
• Sıcaklık 26 °C'den yüksekse: klima zaten açıksa AC already on, kapalıysa klimayı açıp AC turned on yazın.
• Değilse: klima zaten kapalıysa AC already off, açıksa klimayı kapatıp AC turned off yazın.
Deneme: menüden Animasyon Hızını en düşüğe alın. Oda sıcakken programı arka arkaya iki kez çalıştırın: önce AC turned on, sonra AC already on görmelisiniz.

İpucu
Bir if bloğunun içine ikinci bir if yazabilirsiniz (iç içe if).
nested ifread_ac()

3 Orta

Döngüler, sürekli kontrol ve durum takibi.
15

Lambayı 5 kez yakıp söndür

Cevabı gör

Lambayı 5 kez yakıp söndürün: her seferinde 1 saniye yanık, 1 saniye sönük. Her yanışta ekrana Blink 1, Blink 2 ... Blink 5 yazın.
Kodu 5 kez kopyalamak yerine döngü kullanın.

İpucu
C: for (int i = 1; i <= 5; i++) { ... } — Python: for i in range(1, 6):
for loopcounter
16

Geri sayım

Cevap sende

Perde kapalıyken başlayın. Ekrana her saniye bir sayı yazarak 10'dan 1'e geri sayın. Sayım bitince Go! yazın, lambayı yakın ve perdeyi yukarı çalıştırın.

İpucu
Sayaç geriye de sayabilir: C'de i--, Python'da range(10, 0, -1).
for loopi--
17

En düşük ve en yüksek sıcaklık

Cevap sende

Klima kapalıyken oda ısınsın, sonra programı çalıştırın. Program klimayı açsın, her 200 ms'de bir toplam 20 ölçüm alıp her birini 1: 44 C biçiminde yazsın. Sonunda klimayı kapatsın ve ölçümlerin en düşüğünü ve en yükseğini yazsın: Lowest: .. C, highest: .. C.

İpucu
İlk ölçümü hem en düşük hem en yüksek kabul edin. Her yeni ölçümde daha küçükse en düşüğü, daha büyükse en yükseği güncelleyin.
for loopmin / maxvariable update
18

Perde kaç saniyede açılıyor?

Cevap sende

Önce perdeyi aşağı çalıştırın ve motor durana kadar bekleyin (perde tamamen kapanır). Sonra perdeyi yukarı çalıştırın ve motor kendiliğinden durana kadar her 100 ms'de bir sayaç artırın. Sonunda Opened in about .. ms yazın (yaklaşık 4500 ms görmelisiniz).
Sabit bir süre beklemeyin; motorun durduğunu read_curtain() ile anlayın.

İpucu
while (read_curtain() != CURTAIN_STOP) { ... } koşul doğru olduğu sürece döner.
while loop!=read_curtain()
19

Otomatik gece lambası

Cevabı gör

Görev 10'u hiç bitmeyen bir döngüye koyun: her 100 ms'de dış ışığı okuyun; 100 lüksten azsa lambayı yakın, değilse söndürün.
Programı çalıştırıp ışık sürgüsünü 50 ile 500 arasında oynatın; lamba kendiliğinden yanıp sönmeli. Konsolu da izleyin: ne görüyorsunuz? Programı Ctrl+C ile durdurun.

İpucu
Sonsuz döngü: C'de while (1), Python'da while True:. Döngüye mutlaka küçük bir bekleme koyun.
while (1) / while Truecontinuous controlCtrl+C
20

Sadece gerektiğinde komut gönder

Cevabı gör

Görev 19'u düzeltin: lambaya sadece durumunun değişmesi gerektiğinde komut gönderin. Lamba her değiştiğinde ekrana bir kez Lux 85: lamp on veya Lux 120: lamp off yazın.
Sürgüyü oynatın: konsolda artık sadece değişiklik anlarında satır görünmeli.

İpucu
Önce lambanın olması gereken durumunu bulun, sonra read_lamp() ile şimdiki durumuyla karşılaştırın (Görev 14'teki fikir).
state changeread_lamp()!=
21

Basit termostat

Cevap sende

Sürekli çalışan bir termostat yazın: her 100 ms'de sıcaklığı okuyun; 26 °C'den yüksekse klima açık, değilse kapalı olsun. Görev 20'deki gibi sadece değişiklikte komut gönderin ve 27 C: AC on / 26 C: AC off biçiminde yazın.
Çalışırken klimanın ne sıklıkla açılıp kapandığını izleyin (rahat izlemek için Animasyon Hızını düşürebilirsiniz).

İpucu
Görev 20'nin aynısı; lamba yerine klima, lüks yerine sıcaklık.
thermostatread_ac()threshold
22

Düğmeye basma sayacı

Cevabı gör

Elle kontrol panelindeki lamba düğmelerini bir giriş gibi kullanın. Program lambanın kaç kez yakıldığını saysın: lamba her sönükten yanığa geçtiğinde Press 1, Press 2 ... yazsın. 5. yakıştan sonra klimayı açsın, 5 presses: AC on yazsın ve bitsin.
Deneme: lamba sönükken programı başlatın, sonra Lamba Aç ve Lamba Kapat düğmelerine sırayla basın.

İpucu
Bir önceki okumayı prev değişkeninde saklayın. "Önceden 0, şimdi 1" ise bir yakış olmuştur. Döngüyü while (presses < 5) ile bitirin.
edge detectioncounterwhile

4 İleri

Fonksiyonlar, zamanlama, durum makineleri ve hataya dayanıklılık.
23

Kendi fonksiyonun: blink

Cevabı gör

Lambayı times kez, her seferinde ms milisaniye yanık ve ms milisaniye sönük olacak şekilde yakıp söndüren bir blink(times, ms) fonksiyonu yazın.
Ana programda önce blink(3, 200) (hızlı), 1 saniye ara, sonra blink(3, 1000) (yavaş) çağırın.

İpucu
Görev 15'teki döngüyü fonksiyonun içine taşıyın; 5 ve 1000 yerine parametreleri kullanın. Python'da time.sleep(ms / 1000).
functionparameter
24

Değer döndüren fonksiyon: perdeyi sona kadar götür

Cevap sende

move_curtain(dir) fonksiyonu yazın: perdeyi verilen yönde çalıştırsın ve motor durana kadar beklesin. Motor 8 saniye içinde durursa 1 döndürsün. Durmazsa motoru durdurup 0 döndürsün (zaman aşımı).
Ana program: perdeyi kapatın ve Closed yazın, 2 saniye bekleyin, perdeyi açın; sonuç 1 ise Opened, 0 ise Timeout! yazın.
Zaman aşımını denemek için perde açılırken menüden Sim Durdur'a basın: 8 saniye sonra Timeout! görmelisiniz.

İpucu
Görev 18'deki while döngüsüne bir süre sayacı ekleyin. Fonksiyondan return ile çıkılır ve değer döner.
return valuetimeout
25

Histerezisli termostat

Cevap sende

Görev 21'deki termostatı iki eşikle yazın: sıcaklık 28 °C'nin üstüne çıkınca klimayı açın, 20 °C'nin altına inince kapatın; arada hiçbir şey yapmayın. Klimanın kaç kez açıldığını sayın ve her değişiklikte 29 C: AC on (switch 3) gibi yazın.
Görev 21 ile karşılaştırın: klima ne kadar sık açılıp kapanıyor?

İpucu
20 ile 28 arasında else yok: o bölgede klima hangi durumdaysa öyle kalır.
hysteresistwo thresholds
26

Beklemeden zamanlama

Cevabı gör

Görev 25'teki termostat her 100 ms'de çalışmaya devam etsin. Aynı döngüye bir uyarı ışığı ekleyin: perde hareket ederken lamba yarım saniyede bir durum değiştirsin (0,5 s yanık, 0,5 s sönük); perde durunca lamba sönsün.
Deneme: Perde Yukarı veya Perde Aşağı düğmesine basın. Lamba yanıp sönerken termostat da klimayı kontrol etmeye devam etmeli.
Sleep(500) kullanmayın; o zaman termostat da yarım saniye bekler.

İpucu
Her döngü turunda artan bir ticks sayacı tutun. Döngü 100 ms'de bir döndüğüne göre ticks % 5 == 0 her yarım saniyede bir doğru olur.
non-blocking timingtick counter% (modulo)
27

Durum makinesiyle perde

Cevap sende

Perdeyi gün ışığına göre otomatik kontrol edin. Perdenin dört durumu olsun: CLOSED, OPENING, OPEN, CLOSING.
• Başlangıçta perdeyi tamamen kapatın (Görev 24'teki fonksiyon) ve CLOSED durumundan başlayın.
• CLOSED iken lüks 600'ün üstüne çıkarsa perdeyi yukarı çalıştırın → OPENING.
• OPENING iken motor durursa → OPEN.
• OPEN iken lüks 300'ün altına inerse perdeyi aşağı çalıştırın → CLOSING.
• CLOSING iken motor durursa → CLOSED.
Her durum değişikliğinde yeni durumun adını yazın. Deneme: ışık sürgüsünü 800 ile 100 arasında oynatın.

İpucu
Durumu bir tam sayı değişkeninde tutun (C'de enum, Python'da sabitler). Döngüde önce hangi durumda olduğunuza bakın, sonra o durumun kuralını uygulayın.
state machineenumhysteresis
28

Sağlam bağlantı ve kendi kendini test

Cevabı gör

Simülasyon henüz açık değilse programın hemen pes etmesi yerine bağlanmayı 10 kez, 1 saniye arayla denemesini sağlayın (Attempt 1/10 failed...). 10 denemede de bağlanamazsa Could not connect, giving up. yazıp 1 koduyla bitsin.
Bağlandıktan sonra kısa bir kendi kendini test yapsın: lambayı ve klimayı açsın, 200 ms beklesin, read_lamp() ve read_ac() ile komutların gerçekten yazıldığını kontrol edip Lamp OK / Lamp FAILED ve AC OK / AC FAILED yazsın. Sonra ikisini de kapatıp bağlantıyı kapatsın.
Deneme: önce programı çalıştırın, birkaç saniye sonra simülasyonu başlatın.

İpucu
Bağlanma denemelerini 0 (başarılı) veya 1 (başarısız) döndüren connect_retry(tries) adlı bir fonksiyona koyun.
robustnessretryreturn codeself test
29

Ctrl+C ile temiz kapanış

Cevabı gör

Şimdiye kadar sonsuz döngülü programları Ctrl+C ile kestik; lamba, klima ve perde o anki durumda kaldı ve sim_disconnect() hiç çalışmadı. Görev 20'deki gece lambasını öyle değiştirin ki Ctrl+C'ye basıldığında döngüden düzgünce çıksın, lambayı ve klimayı kapatsın, perdeyi durdursun, sim_disconnect() çağırsın ve Bye! yazsın.

İpucu
Python: döngüyü try: ... except KeyboardInterrupt: içine alın. C: signal.h ile SIGINT için bir fonksiyon kaydedin; bu fonksiyon sadece running = 0 yapsın, döngü de while (running) olsun.
Ctrl+Csignal / KeyboardInterruptcleanup

5 Proje

Her şeyi birleştiren tam sistemler.
30

Akıllı oda

Cevap sende

Odayı tamamen otomatik yöneten bir program yazın. Her alt sistem kendi fonksiyonunda olsun ve hepsi aynı 100 ms'lik döngüde çalışsın:
• Lamba: dış ışık 100 lüksten azsa yanık, değilse sönük.
• Klima: 28 °C üstünde aç, 20 °C altında kapat (Görev 25).
• Perde: Görev 27'deki durum makinesi (600 lüks üstünde aç, 300 lüks altında kapat).
• Komutlar sadece değişiklikte gönderilsin ve her değişiklik ekrana yazılsın.
• Ctrl+C ile temiz kapanış (Görev 29).
Deneme: ışık sürgüsünü 50, 400, 800 ve tekrar 50 yapın; her adımda lambanın ve perdenin ne yaptığını izleyin. Ya da bekleyin: dış ışık zaten kendiliğinden değişir.

İpucu
Perde fonksiyonu durumu parametre olarak alıp yeni durumu döndürebilir: state = control_curtain(state, lux).
functionsstate machinehysteresiscleanup
31

Enerji sayacı

Cevap sende

Hiçbir şeyi kontrol etmeyen, sadece izleyen bir enerji sayacı yazın. Lambayı ve klimayı elle kontrol panelinden (veya aynı anda çalışan başka bir programla) açıp kapatın; sayaç şunları ölçsün:
• lambanın ve klimanın toplam kaç saniye açık kaldığı,
• klimanın kaç kez açıldığı.
Her 5 saniyede bir Lamp 12.3 s, AC 4.0 s, AC started 2 times gibi bir satır yazsın. Ctrl+C ile çıkınca enerji tüketimini hesaplasın: lamba 60 W, klima 1500 W. Enerji (Wh) = güç (W) × süre (s) / 3600. Örnek: Energy: lamp 0.21 Wh, AC 1.67 Wh.

İpucu
Döngü 100 ms'de bir döner; lamba açıksa lamp_ticks'i bir artırın. Saniye = tick / 10. Açılma sayısı için Görev 22'deki yükselen kenar fikrini kullanın. Ondalıklı sonuç için C'de 10.0 ile bölün ve %.1f kullanın.
tick counteredge detectionfloatcleanup
32

Elle kontrol önceliği

Cevap sende

Otomatik sistemler kullanıcıyı dinlemelidir. Lamba (100 lüks altında yanık) ve klima (28/20 °C histerezis) otomatik çalışsın. Ama kullanıcı elle kontrol panelinden lambanın veya klimanın durumunu değiştirirse, program o cihaza 30 saniye boyunca dokunmasın ve Lamp: manual for 30 s (veya AC: ...) yazsın. 30 saniye dolunca Lamp: back to automatic yazıp otomatiğe dönsün. Ctrl+C ile temiz kapanış olsun.
Deneme: ışık sürgüsünü 50'ye getirin (lamba yanar), sonra Lamba Kapat'a basın: lamba 30 saniye sönük kalmalı, sonra yeniden yanmalı.

İpucu
Programın her cihaza en son ne yazdığını bir değişkende saklayın (lamp_sent). read_lamp() bundan farklıysa değeri başka biri, yani kullanıcı değiştirmiştir. 30 saniye = 300 tick.
manual overridetick timerstate tracking
33

Bir günün döngüsü

Cevap sende

Odanın bir gününü yöneten bir durum makinesi yazın. Durumlar: NIGHT, DAY, EVENING.
• Başlangıç: lüks 300 veya üstündeyse perdeyi tamamen açıp DAY, değilse tamamen kapatıp NIGHT durumundan başlayın.
• NIGHT → lüks 300'ün üstüne çıkınca sabah rutini: Good morning! yazın, lambayı hızlıca 3 kez yakıp söndürün (300 ms), perdeyi adım adım açın (1 s yukarı, 2 s bekle, 1 s yukarı, 2 s bekle, sonra sonuna kadar), DAY durumuna geçin.
• DAY → lüks 100'ün altına inince: Good evening! yazın, perdeyi aşağı çalıştırın, lambayı yakın, EVENING durumuna geçin.
• EVENING → 10 saniye sonra lambayı söndürün, Good night! yazın, NIGHT durumuna geçin. Bu 10 saniye beklenirken döngü bloklanmasın (tick sayacı).
• Ctrl+C ile temiz kapanış.
Deneme: ışık sürgüsüyle günü hızlandırın (50 → 500 → 50) ya da yaklaşık 3 dakika bekleyip kendiliğinden değişen gün ışığını izleyin.

İpucu
Görev 23'teki blink ve Görev 24'teki move_curtain fonksiyonlarını tekrar kullanın. Sabah rutini kısa olduğu için bloklayabilir; akşamdaki 10 saniye için EVENING durumuna girerken bir sayacı 100'e ayarlayıp her turda azaltın.
state machinefunctionsnon-blocking timingcleanup