
Chtěl jsem vědět, co mi zrovna letí nad hlavou – jakože letadla. Ne v mobilu, ne v další záložce prohlížeče – na malé kulaté věci na polici, vedle monitoru, na kterou se jen mrknu.
Výsledkem je zařízení se dvěma obrazovkami, mezi kterými se přepíná gestem posunutí prstu na obrazovce.
Připravujeme: Na chiptron.cz pracuji na kombinované verzi Meteo-PlaneRadar – srážkový radar z dat ČHMÚ a radar letadel na jednom zařízení. Ta je zatím ve vývoji. Tenhle článek popisuje samostatný projekt European Plane Radar, který je hotový a můžete si ho postavit hned.
První obrazovka je radar. Letadla se zobrazují jako okřídlené šipky mířící tam, kam skutečně letí, nad obrysem okolních států a jejich měst. Klepnutím na letadlo se otevře panel s detaily. Dlouhým stiskem kdekoliv změníte dosah – 10, 25, 50 nebo 100 km.
Druhá obrazovka je nastavení: jas, stav WiFi, poloha a tlačítko, které otevře konfigurační portál.
A to je celé. Záměrně se nesnaží být mobilem.

Letadla jsou barvená podle výšky
Tohle se ukázalo jako jediná změna, jak udělat radar čitelným na první pohled. Obrazovka plná stejných žlutých trojúhelníků vám řekne, že tam nějaký provoz je. Obrazovka, kde barva něco znamená, vám řekne, jaký provoz to je.
| Výška | Barva | Typicky |
|---|---|---|
| Pod 2 km | Červená | Přiblížení a odlet, vrtulníky, malá letadla |
| 2–6 km | Oranžová | Stoupání, klesání, regionální provoz |
| 6–10 km | Žlutá | Nižší cestovní hladiny |
| 10 km a výš | Modrá | Dálkové lety v cestovní hladině |
Červená nad hlavou znamená, že něco klesá k přistání někde poblíž vás. Obrazovka plná modré znamená, že jste pod koridorem a všichni jen prolétají v cestovní hladině.

Jeden detail: letadlo, které nehlásí výšku, se kreslí šedě, ne červeně. Kdybyste „neznámou“ hodnotu přesunuli do nejnižšího pásma, bylo by to velmi matoucí.
Mapa je celá Evropa a velká města
Podklad pokrývá EU-27 plus Británii, Švýcarsko a Norsko: zhruba 31 000 bodů hranic a 1 100 měst, převzatých z Natural Earth (public domain) a GeoNames (CC BY).

Aby to bylo na mikrokontroléru použitelné:
Musí se to vejít. Souřadnice jsou uložené jako uint16 v pevné řádové čárce místo floatů, což cenu půlí. Kvantizační krok vychází zhruba na 122 m – hluboko pod ~555m tolerancí, na kterou byly obrysy zjednodušené, takže vás to nestojí nic viditelného. Celkem: asi 170 kB flash, zhruba 5 % APP partition. To je změřené, ne odhadnuté – zkompiloval jsem data a přečetl velikost sekce.
Musí to být rychlé. Kreslit 31 000 bodů každý snímek by bylo extrémně pomalé. Obrazovka proto spočítá, které geografické okno může být reálně vidět, a předá ho mapovému modulu, který celé státy odmítne podle bounding boxu ještě předtím, než sáhne na framebuffer. V praxi přežije kdekoliv v Evropě méně než ~300 úseček na snímek. Načtení samotné mapy je tak bleskurychlé.
Města jsou odstupňovaná podle počtu obyvatel, aby hustě osídlené regiony zůstaly čitelné. Na 100 km se kreslí jen města nad 300 tisíc; na 50 km nad 150 tisíc; pod 25 km všechno až po 50 tisíc. Bez toho by Porúří nebo Randstad pohřbily provoz pod hradbou popisků.
Tři věci, které bylo nutné opravit a upravit
Zajímavá část podobného projektu je jen zřídka ta, která funguje.
GeoNames si myslí, že Žižkov je město
Když z GeoNames vyfiltrujete „místa nad 50 000 obyvatel“, dostanete Prahu – a taky Stodůlky, Žižkov a Chodov. To jsou pražské čtvrti. Totéž se děje všude: Hamburg-Mitte, bukurešťský „Sector 3″, City of Westminster. Všechno by se vykreslilo jako fantomová města naskládaná na to skutečné.
Oprava je geometrická, ne editorská. Každé místo, které leží do 12 km od města alespoň třikrát většího, se považuje za jeho čtvrť a zahodí se. To odstranilo 397 záznamů a nechalo 1 100 skutečných měst. Není to dokonalé – pohltí to i pár legitimních obcí jako L’Hospitalet vedle Barcelony – ale v těchhle měřítkách by se jejich popisky stejně překrývaly.
Vybrané letadlo se mi měnilo pod „prstem“
Tahle chyba byla zajímavá, protože vypadala jako glitch displeje a přitom šlo o chybu v datovém modelu.
Klepnete na letadlo, necháte detail otevřený, a asi po pěti sekundách vám tiše ukáže jiné letadlo.

Důvod: výběr byl uložený jako index do pole. Pole se při každém stažení dat staví od nuly a adsb.fi nic neslibuje o pořadí. Jedno letadlo opustí oblast, všechno za ním se posune, a index 7 je najednou někdo úplně jiný. Detailní panel poslušně ukazoval toho, kdo slot zdědil.
Oprava je klíčovat výběr na ICAO hex adresu – 24bitový identifikátor vypálený do draku letadla, který se mezi stahováními nemění. Panel teď buď sleduje letadlo, které jste skutečně vybrali, nebo se zavře, když opravdu opustí oblast.
Výhodou teď tedy je: detailní panel se teď aktualizuje živě, dokud je otevřený – výška a rychlost naskakují, jak přicházejí nová data, protože každý snímek znovu vyhodnotí identitu proti poslednímu stažení. A zavírání panelu se stalo záměrným: starý kód ho zavřel jen tehdy, když zastaralý index náhodou přetekl konec pole.
Překvapení na 84 kilometrech
Po zapojení evropské mapy jsem ji otestoval vycentrovanou na Prahu a nedostal žádnou hranici na 10, 25 ani 50 km. Jen tečky měst na černé.
Praha je totiž 84 km od nejbližší státní hranice. V těchhle rozsazích tam vážně není co kreslit.
Stojí za to o tom vědět, protože komukoliv ve vnitrozemí to bude připadat jako chyba. Není – přepněte na 100 km a obrys se třeba objeví.
Hardware
Jedna deska: Waveshare ESP32-S3-Touch-LCD-2.1.
- ESP32-S3R8 – 8 MB PSRAM, 16 MB flash
- Kulatý IPS displej, 480×480, řadič ST7701 přes RGB rozhraní
- CST820 kapacitní dotyk
- TCA9554 I/O expandér ovládající reset, CS a napájení LCD
Displej i mikrokontrolér jsou na jedné desce. Není co drátovat, pájet.
Dvě věci, které vás v Arduino IDE možná překvapí
PSRAM musí být nastavená na OPI PSRAM. Tools → PSRAM → OPI PSRAM. Když to neuděláte, displej zůstane černý bez jakéhokoliv jiného příznaku. Je to zdaleka nejčastější příčina „ono to nefunguje“.
LovyanGFX tenhle panel jen tak nerozjede. ST7701 běží přes RGB rozhraní a jeho chip-select visí na I2C expandéru, což knihovna out of the box neřeší. Použil jsem Arduino_GFX nad přímým esp_lcd RGB panelem s ručně psanou inicializační sekvencí. Pozor, chcete knihovnu „GFX Library for Arduino“ od moononournation – ne Adafruit GFX.
A ještě jedna, méně zjevná: kreslení přímo do panelu způsobí, že displej při každém překreslení bliká. Celý snímek se místo toho skládá do off-screen canvasu v PSRAM a posílá ven jediným flush().
Zprovoznění
Nahrajte firmware a zařízení vytvoří otevřenou WiFi síť PlaneRadar-Setup a zobrazí na displeji QR kód. Naskenujte ho mobilem, vyberte svou domácí síť, uložte.
Polohu zadávat nemusíte – detekuje se z IP adresy. Když ji zadáte ručně, ta má vždycky přednost.
Odkud data pocházejí
| Data | Zdroj | Poznámka |
|---|---|---|
| Letadla | adsb.fi | Zdarma, bez API klíče, osobní použití |
| Poloha | ip-api.com | Automatická detekce podle IP |
| Hranice | Natural Earth 1:10m | Public domain |
| Města | GeoNames | CC BY 4.0, populace 50 000+ |
Vlastní ADS-B přijímač nepotřebujete. adsb.fi agreguje data z tisíců dobrovolnických přijímačů a je zdarma bez registrace – ale uveďte ho, když ho použijete, a počítejte s tím, že bezplatné API je určené pro osobní, nekomerční použití. GeoNames je pod CC BY, což znamená, že uvedení zdroje je licenční podmínka, ne zdvořilost.
Co mě inspirovalo
Tohle nevzniklo z ničeho. Staví to na dvou už existujících projektech:
- MatixYo/ESP32-Plane-Radar – původní radar letadel a zdroj adsb.fi
- Selbyl/ESP32-S30Touch-LCD-2.1_Plane-Radar – port na Waveshare 480×480
Kód
Kód je k dispozici na GitHubu: github.com/petus/EuropeanPlaneRadar
Licence MIT. Použijte to, změňte to, prodejte to.
Nad rámec licence jedna prosba: pokud na tom budete stavět, nechte na obrazovce nastavení řádek chiptron.cz ve stejné velikosti a barvě. Nic vás to nestojí a pro mě to něco znamená. Je to prosba, ne podmínka – licence platí v plném rozsahu tak jako tak.
Když z toho postavíte něco zajímavého, rád se o tom dozvím.
Tento projekt vznikl díky existujícím projektům (viz výše) a Claude AI.








Žádné sociální komentáře k dispozici.