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ř. <PRIKAZ>\n).
1. Navázání spojení (4 body): server iniciuje komunikaci pomocí handshaku <PING>. Koncové zařízení neblokujícím způsobem naslouchá na sériové lince. Jakmile detekuje platný rámec <PING>, odpoví rámcem <PONG:PICO_OK>. 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 <SET_T:x>\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 <DATA:25.4>\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 <LED:R,G,B>\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í:
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 <KEEP_ALIVE>).
Seznam platných rámců: <PING> & <PONG:PICO_OK>, <KEEP_ALIVE> (udržovazí zpráva), <SET_T:x> (nastavení periody měření a odesílání dat), <LED:r,g,b> (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