Kapitel 19 – ESP32 / Pico Architektur für LVGL Projekte
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 → UINicht umgekehrt.
Beispiel Architektur[Bearbeiten | Quelltext bearbeiten]
Hardware[Bearbeiten | Quelltext bearbeiten]
def read_sensor():
return 23.5Logik[Bearbeiten | Quelltext bearbeiten]
def process(value):
return value * 1.1UI[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