Kapitel 19 – ESP32 / Pico Architektur für LVGL Projekte

Aus Micropython
Zur Navigation springen Zur Suche springen
LVGL 9 mit MicroPython
Kapitel 19
Titel ESP32 / Pico Architektur für LVGL Projekte
Voraussetzungen Grundkenntnisse in MicroPython
Getestet mit LVGL 9.x
Schwierigkeitsgrad ★★★★☆
Benötigte Zeit 60 Minuten
Status in Arbeit

Kapitel 19 – ESP32 / Pico Architektur für LVGL Projekte[Bearbeiten | Quelltext bearbeiten]

Lernziel[Bearbeiten | Quelltext bearbeiten]

Nach diesem Kapitel kannst du

  • LVGL-Projekte sauber strukturieren,
  • UI und Hardware logisch trennen,
  • typische Stabilitätsprobleme vermeiden,
  • ESP32 / Pico Projekte skalierbar aufbauen.

Grundproblem[Bearbeiten | Quelltext bearbeiten]

Viele LVGL-Projekte scheitern nicht an LVGL selbst,

sondern an schlechter Struktur:

  • UI mischt sich mit Hardware-Code
  • Sensoren blockieren die GUI
  • Timer und Events werden chaotisch genutzt
  • globale Variablen wachsen unkontrolliert

Zielstruktur[Bearbeiten | Quelltext bearbeiten]

Ein stabiles System besteht aus drei Ebenen:

1. Hardware-Schicht[Bearbeiten | Quelltext bearbeiten]

  • Sensoren (I2C, SPI, ADC)
  • GPIO
  • WLAN / ESP-NOW
  • IMU / QMI8658

2. Logik-Schicht[Bearbeiten | Quelltext bearbeiten]

  • Daten verarbeiten
  • Filtern
  • Skalieren
  • Zustände verwalten

3. UI-Schicht (LVGL)[Bearbeiten | Quelltext bearbeiten]

  • Anzeigen
  • Buttons
  • Layout
  • Events

Grundregel[Bearbeiten | Quelltext bearbeiten]

Merke

LVGL darf niemals direkt Hardware lesen.

Datenfluss[Bearbeiten | Quelltext bearbeiten]

Typisches Modell:

Hardware → Logik → UI

Nicht umgekehrt.

Beispiel Architektur[Bearbeiten | Quelltext bearbeiten]

Hardware[Bearbeiten | Quelltext bearbeiten]

def read_sensor():
    return 23.5

Logik[Bearbeiten | Quelltext bearbeiten]

def process(value):
    return value * 1.1

UI[Bearbeiten | Quelltext bearbeiten]

def update_ui(value):
    label.set_text(f"{value:.1f} °C")

Verbindung über Timer[Bearbeiten | Quelltext bearbeiten]

def tick(t):
    raw = read_sensor()
    value = process(raw)
    update_ui(value)

lv.timer_create(tick, 500, None)

Warum Timer zentral ist[Bearbeiten | Quelltext bearbeiten]

Der Timer ist die „Brücke“ zwischen:

  • Hardware
  • Logik
  • UI

Er ersetzt keine Threads.

ESP32 / Pico Unterschiede[Bearbeiten | Quelltext bearbeiten]

ESP32[Bearbeiten | Quelltext bearbeiten]

  • mehr RAM
  • WLAN integriert
  • gut für komplexe UI

Pico / RP2040[Bearbeiten | Quelltext bearbeiten]

  • stabil bei Echtzeit
  • kein WLAN
  • sehr deterministisch

MicroPython Einschränkungen[Bearbeiten | Quelltext bearbeiten]

Achtung

MicroPython ist nicht echtzeitfähig.

Daher:

  • keine langen Berechnungen im UI-Thread
  • keine blockierenden Sensorzugriffe

Typische Fehler =[Bearbeiten | Quelltext bearbeiten]

Achtung

  • Sensorzugriff im Event-Handler
  • lange while-Schleifen im UI
  • globale Variablen ohne Struktur

Besseres Muster[Bearbeiten | Quelltext bearbeiten]

Schlecht[Bearbeiten | Quelltext bearbeiten]

def on_click(e):
    value = read_sensor()
    label.set_text(str(value))

Gut[Bearbeiten | Quelltext bearbeiten]

latest_value = 0

def tick(t):
    global latest_value
    latest_value = read_sensor()

def update_ui(t):
    label.set_text(str(latest_value))

Vorteil dieser Trennung[Bearbeiten | Quelltext bearbeiten]

  • UI bleibt flüssig
  • Sensoren blockieren nicht
  • Code wird testbar
  • Erweiterungen sind einfacher

Erweiterung: Zustandsmodell[Bearbeiten | Quelltext bearbeiten]

Für größere Projekte:

  • RUNNING
  • STOPPED
  • ERROR
  • CONNECTED

Beispiel Zustand[Bearbeiten | Quelltext bearbeiten]

state = "RUNNING"

def update_ui():
    if state == "RUNNING":
        label.set_text("Aktiv")
    elif state == "ERROR":
        label.set_text("Fehler")

Best Practice[Bearbeiten | Quelltext bearbeiten]

Hinweis

Alles was Zeit kostet → in Timer oder Logik-Schicht

Alles was Darstellung ist → in UI-Schicht

Merke[Bearbeiten | Quelltext bearbeiten]

Merke

Gute LVGL-Projekte sind streng in Schichten getrennt.

Zusammenfassung[Bearbeiten | Quelltext bearbeiten]

  • LVGL = UI-Schicht
  • Hardware = Datenquelle
  • Logik = Verarbeitung
  • Timer verbindet alles
  • keine direkten Hardware-Zugriffe im UI