
Et 64×64 LED-panel på husmuren viser vores husnummer. Det nye er, at det nu kan skifte udseende — flag på fødselsdage, sne i december, en kylling der lister ind i hjørnet til påske — uden at jeg skal have en computer med ud i haven og genprogrammere noget.
Panelet skal to ting på samme tid: skubbe 4.096 pixels ud 60 gange i sekundet over en realtidsbus, og holde en WiFi-forbindelse i live. De to opgaver passer dårligt sammen på én chip — så løsningen blev to hjerner:
Web UI ──MQTT──▶ Gateway (WiFi, ekstern antenne)
│ UART, 3 ledninger
▼
Controller (WiFi slukket, HUB75-display)
▼
[ 64×64 panel ]
En lille gateway-chip håndterer netværk og MQTT. Den gamle ESP32 blev degraderet til ren displaycontroller med WiFi helt slukket. De to taler sammen over tre ledninger, og gatewayen uploader scener til controllerens eget filsystem — linjen bruges kun ved ændringer, ikke til at strømme billeder. Konsekvensen: dør netværket, sker der ingenting. Jeg mister fjernstyringen, ikke husnummeret.
Animationerne er ikke kode, men en JSON-beskrivelse controlleren fortolker — lag, sprites, bevægelse over tid. Det betyder nye animationer kan uploades uden at genflashe firmwaren.
Controlleren genstartede i ring, men kun forsynet gennem panelets egen 5V — klassisk brownout. En kondensator over 5V og GND løste det, verificeret ved at følge oppetiden over tre gange tre minutter uden USB tilsluttet.
Fire ud af ti filoverførsler fejlede på checksum. Ikke protokollen, men en modtagerbuffer der løb over mens controlleren havde travlt med skærmopdateringen. Større buffer løste det.
Et MQTT-bibliotek genbrugte sin egen buffer til både indgående og udgående beskeder — en filoverførsel kunne overskrive sig selv midt i afsendelsen. Fundet ved en gennemlæsning af koden, ikke ved en fejlmelding. Den slags giver ellers mystiske, uregelmæssige problemer måneder senere.
| Controller | Gateway | |
|---|---|---|
| Kort | ESP32 WROOM-32 | XIAO ESP32-C3 |
| Rolle | HUB75-display, WiFi slukket | WiFi, MQTT, OTA |
| Watchdog | 10 s | 30 s |
Begge enheder har en watchdog der genstarter dem, hvis hovedløkken hænger, og reset-årsagen rapporteres til Home Assistant, så en genstart aldrig sker ubemærket.
Den beslutning, jeg er gladest for, er at gøre animation til data frem for kode — det gjorde hele systemet redigerbart uden genflashning. Og WiFi’et derude driller stadig, formentlig fordi panelets eget fladkabel forstyrrer gatewayens antenne. Muren har dog ikke bemærket noget — den viser husnummeret videre, uanset hvad netværket laver.