c_room/gorev01.c veya py_room/gorev01.py) ve kütüphaneyi ekleyin.Garaj hakkında bilmeniz gerekenler: Simülasyon açıldığında kapı tam kapalıdır (door_pos_read() = 100; 0 tam açık demektir). Kapı motoru uca gelince kendiliğinden DURMAZ; motoru programınız durdurmalıdır. Kapının tam açılması veya kapanması yaklaşık 7 saniye sürer (Animasyon Hızı varsayılandayken). Duvardaki tuş takımında 0–9, # ve X tuşları vardır; bir tuş yalnızca fareyle basılı tutulduğu sürece 1 okunur, bırakılınca 0 olur — basışlar bir yerde saklanmaz. Uyarı ışığı, tuş takımının hemen üstündeki renkli şerittir. Elle kontrol panelindeki Işık Aç / Işık Kapat ve Kapı Yukarı / Kapı Durdur / Kapı Aşağı düğmeleri, programınızın yazdığı adreslere yazar; bir görev bittiğinde kapıyı bu düğmelerle yeniden kapatabilirsiniz.
Garaj simülasyonunu başlatın. Simülasyona bağlanan, bağlantı başarılıysa ekrana Connected to the garage! yazan ve bağlantıyı kapatan bir program yazın.
Sonra simülasyonu kapatıp programı bir kez daha çalıştırın ve ne olduğunu gözlemleyin.
sim_connect() başarılıysa 0 döndürür. Bağlantıyı sim_disconnect() ile kapatın.Garajın iç lambasını yakan bir program yazın. Program bittikten sonra lambanın yanık kaldığını gözlemleyin.
Lambayı söndürmek için elle kontrol panelindeki Işık Kapat düğmesine basın.
garage_lamp() fonksiyonu ve LAMP_ON sabiti kullanılır.Lambayı yakın, 3 saniye bekleyin, sonra söndürün. Program bittiğinde lamba kapalı olmalı.
Sleep(3000) 3000 milisaniye bekler; Python'da time.sleep(3) 3 saniye bekler (önce import time).Uyarı ışığını sırasıyla 2 saniye kırmızı (255, 0, 0), 2 saniye sarı (255, 255, 0) ve 2 saniye yeşil (0, 255, 0) yakın; en sonunda söndürün. Uyarı ışığı tuş takımının hemen üstündeki renkli şerittir.
warning_light(r, g, b, WARN_ON) rengi ayarlar ve ışığı açar. Sarı, kırmızı ile yeşilin karışımıdır.Kapı kapalıyken başlayın. Kapı motorunu yukarı yönde çalıştırın, 2 saniye bekleyin ve motoru durdurun. Kapı yaklaşık üçte bir açılmış olmalı.
Kapıyı yeniden kapatmak için elle kontrol panelinde Kapı Aşağı düğmesine, kapı kapanınca Kapı Durdur düğmesine basın.
door_motor(DOOR_UP) motoru çalıştırır; motor siz door_motor(DOOR_STOP) diyene kadar çalışmaya devam eder.Kapı kapalıyken tam bir kapı döngüsü yapın:
1. Uyarı ışığını turuncu (255, 165, 0) yakın ve kapıyı 7 saniye yukarı çalıştırın (kapı tam açılır).
2. Motoru durdurun, uyarı ışığını söndürün ve 3 saniye bekleyin.
3. Uyarı ışığını kırmızı (255, 0, 0) yakın ve kapıyı 7 saniye aşağı çalıştırın.
4. Motoru durdurun ve uyarı ışığını söndürün.
Kapının kapalılık yüzdesini okuyup ekrana Door closed: 100% biçiminde yazdırın.
Sonra elle kontrol panelinde Kapı Yukarı düğmesine basın, kapı yarıya gelince Kapı Durdur düğmesine basın ve programı tekrar çalıştırın. Bu kez farklı bir sayı görmelisiniz.
door_pos_read() 0 ile 100 arasında bir tam sayı döndürür: 100 tam kapalı, 0 tam açık. Değeri bir değişkende saklayın.Kapının konumunu okuyun. Kapı tam kapalıysa (100) ekrana Door is closed yazıp uyarı ışığını yeşil yakın; değilse Door is NOT closed yazıp kırmızı yakın.
Programı bir kez kapı kapalıyken, bir kez de kapıyı elle biraz açtıktan sonra çalıştırın.
if (...) { ... } else { ... } yapısını kullanın. Eşitlik == ile kontrol edilir.Görev 8'i üç duruma genişletin:
• 100 ise Closed yazın, uyarı ışığı yeşil (0, 255, 0).
• 0 ise Fully open yazın, uyarı ışığı kırmızı (255, 0, 0).
• Arada bir değerse Partly open: 40% gibi yüzdeyle birlikte yazın, uyarı ışığı sarı (255, 255, 0).
else if, Python'da elif kullanılır.Lambanın, uyarı ışığının ve kapı motorunun o anki durumunu okuyup yazdırın, örneğin:
Lamp: ON
Warning light: OFF
Motor: UP
Motor için 0 → STOPPED, 1 → UP, 2 → DOWN yazın. Önce programı çalıştırın; sonra elle kontrol panelinde Işık Aç ve Kapı Yukarı düğmelerine basıp tekrar çalıştırın. En sonunda Kapı Durdur'a basmayı unutmayın.
garage_lamp_read(), warning_light_read() ve door_motor_read() çıkışların son durumunu okur. Motor değerini DOOR_STOP, DOOR_UP, DOOR_DOWN sabitleriyle karşılaştırın.Program ekrana Press and hold key 5 (3 s)... yazsın ve 3 saniye beklesin. Bu sürede simülasyondaki tuş takımında 5 tuşunu fareyle basılı tutun.
Süre dolunca tuşu okuyun: basılıysa lambayı yakıp Key 5 is pressed yazın, değilse lambayı söndürüp Key 5 is not pressed yazın. Programı bir kez tuşa basarak, bir kez basmadan deneyin.
key_read(5) tuş o anda basılıysa 1, değilse 0 döndürür. Tuş takımı basışları saklamaz: tuşu, program okuyana kadar basılı tutmalısınız.Program Press and hold key 1 (3 s)... yazıp 3 saniye beklesin. Kapıyı yalnızca iki koşul birlikte sağlanırsa açın: kapı tam kapalı (100) VE 1 tuşu basılı.
Bu durumda Opening yazıp kapıyı 3 saniye yukarı çalıştırın ve durdurun. Aksi halde Cannot open yazıp uyarı ışığını 2 saniye kırmızı yakın ve söndürün. Programı kapı kapalıyken ve kapı biraz açıkken deneyin.
&&, Python'da and iki koşulu birleştirir.Uyarı ışığının rengini kapının konumundan hesaplayın:
kırmızı = (100 − konum) × 255 / 100
yeşil = konum × 255 / 100
mavi = 0
Böylece kapalı kapı yeşil, tam açık kapı kırmızı, yarı açık kapı ara bir renk olur. Konumu ve hesaplanan değerleri Door closed: 50% R=127 G=127 gibi yazdırın. Kapıyı elle farklı konumlara getirip programı birkaç kez çalıştırın.
// ile yapılır.Görev 13'ü sonsuz bir döngüye alın: her 300 ms'de bir konumu okuyup yazdırın ve uyarı ışığının rengini güncelleyin.
Program çalışırken kapıyı elle kontrol panelinden açıp kapatın (uçta Kapı Durdur'a basın) ve rengin yavaş yavaş değiştiğini izleyin. Programı Ctrl+C ile durdurun.
while (1) { ... }, Python'da while True: sonsuza kadar döner. Döngünün sonuna kısa bir bekleme koyun.Görev 6'yı süre yerine sensörle yapın:
1. Uyarı ışığını turuncu (255, 165, 0) yakın, motoru yukarı çalıştırın ve door_pos_read() 0 olana kadar her 50 ms'de bir kontrol ederek bekleyin. Sonra motoru durdurun, ışığı söndürün ve Door is fully open yazın.
2. 1 saniye bekleyin.
3. Aynı şekilde kapıyı konum 100 olana kadar kapatın ve Door is fully closed yazın.
Programı kapı yarı açıkken de deneyin: yine doğru yerde durmalı.
while (koşul) koşul doğru olduğu sürece döner. Kapı açılırken koşul door_pos_read() > 0 olabilir.Sürekli çalışan bir bekçi program yazın: motor yukarı çalışıyorken kapı tam açıksa (0) ya da motor aşağı çalışıyorken kapı tam kapalıysa (100) motoru durdursun ve Limit reached, motor stopped yazsın. Döngü her 50 ms'de bir dönsün.
Programı çalışır halde bırakın ve kapıyı yalnızca elle kontrol panelindeki Kapı Yukarı / Kapı Aşağı düğmeleriyle hareket ettirin: kapı her uca geldiğinde kendiliğinden durmalı.
door_motor_read() elle verilen komutu da okur. İki ayrı durumu C'de ||, Python'da or ile birleştirin.Tuş takımını kumanda olarak kullanın: 1 → kapı yukarı, 2 → kapı aşağı, 0 → dur. Kapı uca ulaşınca motor kendiliğinden dursun (Görev 16). Motor çalışırken uyarı ışığı turuncu (255, 165, 0) yansın, motor durunca sönsün. Döngü her 50 ms'de bir dönsün.
Deneyin: 1'e basın, kapı yarıdayken 0'a basın, sonra 2'ye basın.
if ile okuyun, sonra Görev 16'daki uç kontrolünü yapın. Işığın rengine en son door_motor_read() değerine bakarak karar verin.Tuş takımının 12 tuşunu (0–11) bir for döngüsüyle tarayın ve basılı olan tuşu yazdırın: rakamlar için Key 7, 10 için Key #, 11 için Key X. Dış döngü her 200 ms'de bir dönsün.
Bir tuşu basılı tuttuğunuzda yazının tekrar tekrar geldiğine dikkat edin; bunu bir sonraki görevde düzelteceksiniz.
for (int k = 0; k <= 11; k++) / for k in range(12): k'yı 0'dan 11'e kadar sayar. ADR_KEY_HASH (10) ve ADR_KEY_X (11) sabitleri hazırdır.# tuşuna kaç kez basıldığını sayın. Tuşu ne kadar uzun basılı tutarsanız tutun her basış yalnızca bir kez sayılsın; sayı her arttığında # pressed 3 times gibi yazdırın.
X tuşu sayacı sıfırlasın ve Counter reset yazsın (sayaç zaten 0 ise bir şey yapmasın). Döngü her 20 ms'de bir dönsün.
Bir rakam tuşuna (1–9) basılmasını bekleyin, tuş bırakılınca da devam edin. Sonra Blinking 4 times gibi yazdırın ve garaj lambasını o rakam kadar yakıp söndürün (0,5 s yanık, 0,5 s sönük). Ardından yeni bir rakam bekleyin. 0, # ve X tuşları yok sayılsın.
for kullanın.Tuş takımından 4 rakam okuyun (bu kez 0 da geçerli; # ve X yok sayılsın). Her rakam basılıp bırakıldığında uyarı ışığı 150 ms mavi (0, 0, 255) yansın (tuş sesi gibi) ve ekrana bir * yazılsın.
4 rakam tamamlanınca rakamları tek sayıda birleştirin (1, 2, 3, 4 → 1234) ve Code: 1234 yazın. Kod 1234 ise uyarı ışığı 3 saniye yeşil, değilse 3 saniye kırmızı yansın; sonra program bitsin.
code = code * 10 + digit kullanın. 0 da geçerli olduğu için 'tuş yok' anlamında -1 kullanın.Görev 21'i fonksiyonlara bölün ve sürekli çalışan bir şifreli kapı yapın:
• wait_key(): herhangi bir tuşun (0–11) basılıp bırakılmasını bekler, 150 ms mavi tuş ışığı yakar ve tuşun numarasını döndürür.
• open_door() ve close_door(): kapıyı sensöre bakarak tam açar / tam kapatır; hareket sırasında uyarı ışığı turuncu yanar (Görev 15).
Ana döngü 4 rakam okusun (# ve X yok sayılsın) ve her rakam için * yazsın. Kod 1234 ise Access granted yazıp lambayı yaksın, kapıyı açsın, 5 saniye beklesin, kapıyı kapatıp lambayı söndürsün. Yanlışsa Wrong code yazıp uyarı ışığını 2 saniye kırmızı yaksın.
main'den önce yazın. wait_key() bir değer döndürdüğü için int (Python'da return) kullanır; diğer ikisi void'dir.Şifre artık sabit uzunlukta değil. Kullanıcı rakamları yazar ve # ile onaylar:
• Her rakam bir dizide saklansın ve * yazılsın; en fazla 8 rakam saklansın, fazlası yok sayılsın.
• X, o ana kadar yazılanları silsin, Cleared yazsın ve uyarı ışığı 300 ms sarı (255, 255, 0) yansın.
• Doğru şifre 2580'dir ve bir dizide ({2, 5, 8, 0}) saklanır. #'e basılınca girilen rakamları şifreyle karşılaştırın: uzunluk ve tüm rakamlar aynıysa kapıyı Görev 22'deki gibi açıp kapatın (lamba dahil), değilse Wrong code yazıp 2 saniye kırmızı yakın.
Her denemeden sonra giriş sıfırlansın. Görev 22'deki fonksiyonları kullanın.
len değişkeni tutun ve karşılaştırmayı bir fonksiyonda for ile yapın. Python'da liste kullanın; iki liste == ile karşılaştırılabilir.Görev 23'e güvenlik ekleyin: yanlış denemeleri sayın ve Wrong code (2/3) gibi yazdırın. Art arda 3 yanlış denemede sistem 15 saniye kilitlensin:
• LOCKED for 15 s yazılsın.
• Kilit süresince uyarı ışığı kırmızı yanıp sönsün (250 ms yanık, 250 ms sönük) ve tuşlar dikkate alınmasın.
• Kilit bitince Unlocked yazılsın ve sayaç sıfırlansın.
Doğru şifre girildiğinde de sayaç sıfırlansın. 1. ve 2. yanlış denemede önceki gibi 2 saniye kırmızı yansın.
lockout() fonksiyonuna koyun. 15 saniye, 500 ms'lik 30 yanıp sönmedir. Kilit sırasında wait_key() çağrılmadığı için tuşlar kendiliğinden yok sayılır.Gerçek garaj kapıları kapanırken önüne bir engel çıkarsa durup geri açılır. Simülasyonda engel sensörü olmadığı için X tuşunu 'engel algılandı' düğmesi olarak kullanın.
close_door_safe() adında bir fonksiyon yazın: kapıyı kapatırken her 50 ms'de konumla birlikte X tuşunu da kontrol etsin. X basılırsa motoru hemen durdursun, Obstacle! Reopening yazsın, uyarı ışığını 1 saniye kırmızı yaksın, kapıyı tam açsın ve 0 döndürsün. Kapı engelsiz kapanırsa 1 döndürsün.
Ana program: #'e basılınca kapıyı açsın, 5 saniye beklesin ve close_door_safe() ile kapatsın; kapı engel yüzünden yeniden açıldıysa 5 saniye bekleyip tekrar kapatmayı denesin. Kapı kapanınca Door closed yazsın.
if ile X'e bakın; bulunca return 0 ile fonksiyondan hemen çıkın. Ana programda while (close_door_safe() == 0) tekrar denemeyi sağlar.Görev 23'teki şifre girişine zaman aşımı ekleyin: kullanıcı en az bir rakam yazdıktan sonra 5 saniye hiçbir tuşa basmazsa giriş silinsin, Timeout, entry cleared yazılsın ve uyarı ışığı 1 saniye sarı yansın.
Bunun için wait_key_timeout(ms) fonksiyonunu yazın: verilen süre içinde bir tuş basılıp bırakılırsa (mavi tuş ışığıyla birlikte) numarasını, süre dolarsa -1 döndürsün. Bu görevde kapıyı hareket ettirmeyin: doğru şifrede Access granted yazıp 3 saniye yeşil, yanlışta Wrong code yazıp 2 saniye kırmızı yakın.
GetTickCount() bilgisayar açıldığından beri geçen milisaniyeyi (DWORD), Python'da time.time() saniyeyi verir. Başlangıç zamanını saklayın ve farkına bakın.Görev 17'deki tuş kumandasını geliştirin: kapı hareket ederken uyarı ışığı turuncu (255, 165, 0) yanıp sönsün (300 ms yanık, 300 ms sönük), ama tuşlar her an hemen tepki versin.
Yani yanıp sönmeyi Sleep(300) / time.sleep(0.3) ile YAPMAYIN: döngü 20 ms'de bir dönsün; her turda saati okuyun, son değişimden bu yana 300 ms geçtiyse ışığı tersine çevirin. Motor durunca ışık sönük kalsın. Kapı yarıdayken 0'a basarak kapının hemen durduğunu kontrol edin.
light_on) ve son değişim zamanını (last_change) iki değişkende tutun.Kapıyı bir durum makinesiyle yönetin. Dört durum vardır: CLOSED, OPENING, OPEN, CLOSING.
• CLOSED: motor durur, lamba ve uyarı ışığı söner. # basılınca → OPENING.
• OPENING: lamba yanar, uyarı ışığı turuncu, motor yukarı. Konum 0 olunca → OPEN.
• OPEN: motor durur, uyarı ışığı yeşil. 10 saniye geçince veya # basılınca → CLOSING.
• CLOSING: uyarı ışığı turuncu, motor aşağı. Konum 100 olunca → CLOSED; X basılırsa (engel) Obstacle! yazıp → OPENING.
Her durum değişiminde -> OPEN gibi yeni durumu yazdırın. Program başında kapı kapalı değilse CLOSING ile başlayın. Döngü 20 ms'de bir dönsün, hiçbir yerde uzun Sleep olmasın; tuşlar kenar algılamayla (Görev 19) okunsun.
enum). Bir enter(state) fonksiyonu yeni duruma geçerken motor ve ışıkları bir kez ayarlasın; ana döngü yalnızca geçiş koşullarını kontrol etsin. new_key() fonksiyonu yalnızca basıldığı anda tuş numarasını, diğer zamanlarda -1 döndürsün.Görev 28'deki durum makinesini şifreli girişle birleştirin. Durumlar: CLOSED, OPENING, OPEN, CLOSING, LOCKED.
• CLOSED: tuş takımından şifre alınır (Görev 23–26). Rakam → * ve 100 ms mavi ışık (en fazla 8 rakam); X → girişi sil, 300 ms sarı; # → kontrol. Şifre 2580. Doğruysa Access granted → OPENING. Yanlışsa Wrong code (n/3) ve 1 s kırmızı; 3. yanlışta → LOCKED. Giriş doluyken 5 s tuşa basılmazsa Timeout, entry cleared ve 1 s sarı.
• LOCKED: 15 s boyunca uyarı ışığı kırmızı yanıp söner (250 ms), tuşlar yok sayılır; sonra Unlocked → CLOSED.
• OPENING: lamba yanar, motor yukarı, uyarı ışığı turuncu yanıp söner (300 ms, programı durdurmadan — Görev 27). Konum 0 → OPEN.
• OPEN: motor durur, ışık sabit yeşil. 10 s sonra veya # ile → CLOSING.
• CLOSING: motor aşağı, turuncu yanıp sönme. X → Obstacle! Reopening → OPENING. Konum 100 → CLOSED.
CLOSED ve LOCKED durumlarında motor durur, lamba ve uyarı ışığı söner, giriş silinir. Her durum değişimi -> OPEN gibi yazdırılsın; program başında kapı kapalı değilse CLOSING ile başlansın.
state_time değişkenini enter() içinde ayarlayarak hem LOCKED (15 s) hem OPEN (10 s) süresini ölçün. Şifre işini handle_code(key) adlı bir fonksiyona taşıyın. Yanıp sönmeyi blink(r, g, b, period) fonksiyonunda Görev 27'deki gibi yapın.Kapıyı tuş takımıyla istenen konuma götürün. Kullanıcı 0–100 arası bir kapalılık yüzdesi yazar ve # ile onaylar (ör. 5, 0, # → %50). Yazılan rakamlar ekranda görünsün; en fazla 3 rakam alınsın. X yazılan sayıyı silsin (Cleared).
• Hiç rakam yoksa ya da değer 100'den büyükse Invalid yazıp uyarı ışığını 1 saniye kırmızı yakın.
• Kapı zaten o konumdaysa Already there yazın.
• Aksi halde program yönü kendisi seçsin: hedef şu anki değerden küçükse kapı yukarı, büyükse aşağı gitsin; hedefe ulaşınca dursun. Hareket sırasında uyarı ışığı turuncu yansın ve konum her değiştiğinde 45% -> 50% gibi yazdırılsın. Hedefe varınca Arrived yazıp 1 saniye yeşil yakın.
• Hareket sırasında X basılırsa kapı hemen dursun ve Stopped yazılsın.
go_to(target) fonksiyonuna koyun. Dikkat: değer küçüldükçe kapı AÇILIR. Durma koşulu yukarı giderken pos <= target, aşağı giderken pos >= target olmalı. Konumu yalnızca değiştiğinde yazdırmak için son yazdırılan değeri saklayın.Şifre, program değiştirilmeden güncellenebilsin. Kullanıcı şifresi başlangıçta 1234, yönetici şifresi sabit 9999'dur. Tüm girişler # ile onaylanır, X girişi siler (Cleared); her rakam için * yazılır, en fazla 8 rakam alınır.
• Kullanıcı şifresi girilirse: Access granted, kapıyı açın, 5 s bekleyin, kapatın (Görev 22'deki fonksiyonlar).
• Yönetici şifresi girilirse: Admin mode yazılır ve uyarı ışığı sürekli sarı (255, 255, 0) yanar. Enter new code: yazılır, kullanıcı yeni şifreyi yazıp #'e basar; sonra Repeat new code: yazılır ve aynı şifre tekrar girilir. İki giriş aynıysa ve en az 4 rakamlıysa şifre değişir: Code changed yazılır ve uyarı ışığı iki kez yeşil yanıp söner (300 ms yanık, 300 ms sönük). Değilse Code NOT changed yazılır ve 2 s kırmızı yanar.
• Başka bir giriş: Wrong code ve 2 s kırmızı.
Not: Sürekli sarı ışık bozulmasın diye bu görevde tuş ışığı (mavi) kullanmayın.
#'e kadar okuyan read_entry() fonksiyonu yazın ve üç yerde kullanın. C'de iki diziyi karşılaştıran same(a, a_len, b, b_len) fonksiyonu, yeni şifreyi kopyalamak için de bir for döngüsü gerekir.Garajı üç kişi kullanıyor ve her birinin 4 haneli kodu var: Ali 1111, Ayse 2222, Can 3333. İsimleri bir dizide, kodları iki boyutlu bir dizide (listelerin listesi) saklayın. Girişler Görev 31'deki gibi okunur (*, X siler, # onaylar).
• Bir kullanıcının kodu girilirse Welcome, Ayse yazılsın, o kişinin açma sayısı 1 artsın, lamba yansın, kapı açılsın, 5 s sonra Görev 25'teki close_door_safe() ile kapatılsın (engel yüzünden açıldıysa 5 s sonra tekrar denensin) ve lamba sönsün.
• Bilinmeyen bir kod girilirse Unknown code yazılsın, yanlış deneme sayacı artsın ve 2 s kırmızı yansın.
• Yalnızca 0 girilip #'e basılırsa rapor yazdırılsın:
Ali: 2 openings
Ayse: 0 openings
Can: 1 openings
Wrong attempts: 1
Total openings: 3
find_user() fonksiyonu girilen kodu her kullanıcının koduyla karşılaştırıp kullanıcının sırasını (0–2) ya da bulunamazsa -1 döndürsün. Açma sayıları için kullanıcı sayısı kadar elemanlı bir sayaç dizisi kullanın.