===== 1. Miniprojekt ===== Vytvořte a implementujte obousměrný komunikační systém mezi řídicím serverem (PC) a koncovými IoT zařízením (Raspberry Pi Pico W) prostřednictvím sériové linky (USB/UART). V rámci hlavní smyčky na koncovém zařízení je zakázáno použití blokujících funkcí, zejména ''time.sleep()''. Komunikace probíhá v textovém formátu. Jednotlivé rámce (zprávy) musí být uzavřeny do špičatých závorek a ukončeny znakem nového řádku (např. ''\n''). **1. Navázání spojení (4 body)**: server iniciuje komunikaci pomocí handshaku ''''. Koncové zařízení **neblokujícím** způsobem naslouchá na sériové lince. Jakmile detekuje platný rámec '''', odpoví rámcem ''''. Tímto krokem je provedený handshake a spojení je považováno za navázané. **2. Automatická detekce hardwaru (3 body):** skript na serveru **nesmí** obsahovat staticky definovaný port (např. ''COM3'' nebo ''/dev/ttyACM0''). Skript musí dynamicky prohledat dostupné sériové porty v operačním systému a pomocí filtrování Vendor ID (VID) identifikovat hardware Raspberry Pi (''VID: 0x2E8A''). Pouze na tomto portu se pokusí navázat Handshake. **3. Sběr dat (3 body)**: Po úspěšném navázání spojení s koncovým zařízením odešle server rámec pro nastavení periody měření pomocí příkazu ''\n'' (kde ''x'' reprezentuje čas v ms). Koncové zařízení zajísti, že **přesně** v zadané periodě dojde k přečtení dat z interního ADC teploměru a odeslání dat na server ve formátu ''\n''. **4. Řízení PWM LED (3 body)**: Server analyzuje příchozí teplotní data a implementuje mapování. Na základě přijaté teploty se rozsvítí RGB LED odpovídající barvou (<18 °C = Modrá, 18-22 °C = Azurová, 22-25 °C = Zelená, 25-28 °C = Žlutá, >28 °C = Červená). Tuto barvu odešle na koncové zařízení ve formátu ''\n'' (kde ''R'', ''G'', a ''B'' mohou nabývat hodnot **0-255**). Koncové zařízení dekóduje přijatý rámec a na základě přijatých hodnot správně nastaví připojenou RGB LED. **5. Stavový indikátor (2 body)**: Vestavěná zelená LED na desce Pico slouží jako indikátor stavu spojení. Využijte kaskádových a jednorázových (One-Shot) časovačů pro dosažení následujícího chování: * Stav nespojeno: LED **přesně** každých 5 sekund třikrát rychle blikne (s periodou 100 ms). * Stav spojeno: LED je trvale zhasnutá. Kdykoliv zařízení odešle data (``), LED se **přesně** na 50 ms rozsvítí. **BONUS (+3 body)**: Každý **platný** rámec od serveru resetuje na koncovém zařízení časovač posledního kontaktu. Pokud zařízení neobdrží žádný platný rámec déle než 20 sekund, vyhodnotí to jako ztrátu spojení, okamžitě přejde do stavu nespojeno (zhasne RGB LED, přestane odesílat data). Skript na serveru musí zachytit výjimku při fyzickém vytažení USB kabelu za běhu programu. Skript nesmí havarovat, ale musí vypsat chybové hlášení a přejít zpět do fáze detekce hardwaru. Současně musí být zajištěno, že server vždy odešle platný rámec než dojde k 20sekundovému timeoutu (může být využito udržovacího rámce ''''). **Seznam platných rámců**: '''' & '''', '''' (udržovazí zpráva), '''' (nastavení periody měření a odesílání dat), '''' (nastavení RGB připojené LED, rozsah 0-255). Do systému BRUTE odevzdávejte textový soubor s odkazem na váš commit v GitLabu. V odevzdaném miniprojektu se očekává minimálně následující struktura: * ''main_rpi.py'' - firmware pro Raspberry Pi Pico W, * ''main_server.py'' - Řídicí skript pro PC, * ''requirements.txt'' - seznam Python závislostí * ''README.md'' - Stručná dokumentace obsahující instrukce ke spuštění a případně poznámky k implementaci (např. zapojení pinů pro RGB LED), * ''.gitignore''