Skocz do zawartości

ESP32flight - zbuduj radar lotniczy z ekranem dotykowym (bez lutowania, bez łączenia modułów i bez programatora)


Pomocna odpowiedź

Dobra, jeszcze jedna drobna poprawka ponieważ po przywróceniu poprawnych kolorów obraz był nieco przesunięty zmieniłem parametry synchronizacji, teraz jest bardzo dobrze, wyświetlacz nieco mruga, być może później to poprawię, no, chyba że wcześniej zrobi to autor projektu. Tymczasem zaktualizowana struktura:

 

__attribute__((unused)) static const board_cfg_t k_sunton_8070 = {
    /* Sunton ESP32-8048S070 (7" 800x480, ST7262) and its unbranded
     * Amazon/AliExpress clones. NOT Guition-compatible: DE and VSYNC are
     * swapped and the data bus is wired in the opposite order, so the
     * Guition build shows garbage on this glass. Pin map and timings
     * from rzeldent/esp32-smartdisplay (working devices). Note the slow
     * 12.5 MHz pclk and the unusual 210-pixel HSYNC front porch - both
     * are what the 7" panel actually wants. */
    .name = "Sunton ESP32-8048S070 (7in 800x480)",
    .de = 41, .vsync = 40, .hsync = 39, .pclk = 42,
    // .data = { 14, 21, 47, 48, 45,       /* B0..B4 */
    //           9, 46, 3, 8, 16, 1,       /* G0..G5 */
    //           15, 7, 6, 5, 4 },         /* R0..R4 */
    
    .data = { 15, 7, 6, 5, 4,          /* B0..B4 - zmienione */
              9, 46, 3, 8, 16, 1,       /* G0..G5 - bez zmian */
              14, 21, 47, 48, 45 },     /* R0..R4 - zmienione */
    
    .i2c_sda = 19, .i2c_scl = 20,
    .has_ch422g = false,
    .bl_gpio = 2,
    .tp_rst_gpio = 38,
  //  .hs_pulse = 30, .hs_bp = 16, .hs_fp = 210,
  .hs_pulse = 30, .hs_bp = 46, .hs_fp = 180,  
  .vs_pulse = 13, .vs_bp = 10, .vs_fp = 22,
    .pclk_hz = 12500000,
    .tp_mirror = false,
};   

 

@SOYER dzięki! To, co opisujesz, jest jak najbardziej osiągalne, a Twój plan (JSON co 10 s + pula ikon chowanych/pokazywanych) to dokładnie ta sama architektura, która siedzi w esp32flight. Po kolei:

Skąd dane.  Darmowe, społecznościowe agregatory ADS-B, bez klucza i bez rejestracji. Przykład: https://api.adsb.lol/v2/point/50.05/18.75/30 zwraca JSON ze wszystkimi samolotami w promieniu 30 mil morskich od podanego punktu (ja odpytuję co 8 s, Twoje 10 s jest w sam raz; wypada tylko nie schodzić dużo niżej, to serwisy utrzymywane przez hobbystów). W odpowiedzi masz dla każdej maszyny m.in. lat, lon, alt_baro, track (kurs), flight (znak wywoławczy). Zapasowe źródło o zgodnych danych: https://opendata.adsb.fi/api/v2/lat/50.05/lon/18.75/dist/30

Przeliczenie współrzędnych na piksele. Przy promieniu 50 km spokojnie wystarczy przybliżenie płaskiej Ziemi (błąd rzędu pojedynczych pikseli). Liczysz raz przy starcie, dla swojej lokalizacji domowej:

/* stałe policzone raz dla domu (lat0, lon0) */
float km_per_deg_lat = 110.57f;
float km_per_deg_lon = 111.32f * cosf(lat0 * M_PI / 180.0f);
float px_per_km = RADIUS_PX / RADIUS_KM;   /* np. 240 px / 50 km */

 

/* dla każdego samolotu z JSON-a */
float dx_km = (lon - lon0) * km_per_deg_lon;
float dy_km = (lat - lat0) * km_per_deg_lat;
int x = CENTER_X + (int)(dx_km * px_per_km);
int y = CENTER_Y - (int)(dy_km * px_per_km);   /* minus: ekran rośnie w dół */

I to całe "GPS na ekran". Jeśli po drodze używasz LVGL, ikonę obracasz kursem przez lv_img_set_angle(img, track * 10).

Pula obiektów. Twoje 15 ikon z chowaniem/pokazywaniem to raczej dobry pomysł: tworzysz je raz przy starcie, a po każdym odświeżeniu przypisujesz samoloty do ikon (u mnie kluczem jest hex ICAO maszyny, żeby ta sama ikona płynnie wędrowała między odczytami, a nie skakała losowo), nadmiarowe dostają LV_OBJ_FLAG_HIDDEN. Zero alokacji w trakcie działania, zero fragmentacji.

Tło z mapą. Skoro lokalizacja jest stała, nie baw się w pobieranie kafli na żywo: wygeneruj raz PNG z mapą swojej okolicy (np. zrzut z OpenStreetMap wycentrowany na dom, w skali dopasowanej do promienia), przepuść przez konwerter LVGL i wkompiluj jako asset. Jedna statyczna bitmapa, a efekt dokładnie ten, który opisujesz.

I najważniejsze: esp32flight jest na MIT, więc zamiast wymyślać od zera, możesz podglądać i wycinać do woli: github.com/theqkash/esp32flight. Najciekawsze dla Ciebie pliki to main/flight_task.c (pobieranie i parsowanie JSON-a z failoverem między agregatorami), main/geo_math.c (przeliczenia geograficzne) i widok radaru w main/ui.c. Jakbyś utknął, pisz śmiało. A jak już zadziała, wrzuć zdjęcie, chętnie zobaczę radar w innym wydaniu!

 

@_LM_ Dzięki! Ja nie mam magicznej kuli do sprzętów, więc świetnie że udało Ci się to poprawić, dorzuciłem do kodu na przyszłość. :). 
 

4 minuty temu, theqkash napisał:

Ja nie mam magicznej kuli do sprzętów, więc świetnie że udało Ci się to poprawić, dorzuciłem do kodu na przyszłość

na tym polega open source, fest mnie to zainspirowało chyba dodam sobie do tego widgety stacji pogowej 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...