WetterCube/Entwicklung
Aufbau des Repositorys
| Datei / Ordner | Inhalt |
|---|---|
wettercube.ino |
gesamte Anwendung: Setup, Loop, Touch-Taste, Portal, Wetter-/Pollen-/Luftqualitäts-Abruf, Web-Oberfläche, Diagnose-Log, OTA |
screens.c/h, images.c/h, colors.c/h, styles.c/h, fonts.c/h, ui.c/h, actions., vars. |
PicoPixel-Export der Oberfläche (LVGL 8.3, 240×240) |
font_montserrat_*.c |
die vom Export erzeugten Schriften (liegen im Sketch-Ordner, siehe unten) |
images/ |
Platzhalter (1×1 px) für die früheren PicoPixel-Bilder, bleibt ein Unterordner |
wetter_icons.c/.h, icons/ |
Wetter- und Warn-Symbole (Meteocons) als LVGL-Bilder, erzeugt von tools/wetter_icons.py
|
assets/icons/ |
PNG-Quellen der Symbole und der Meteocons-Lizenztext |
tools/wetter_icons.py |
wandelt die PNGs in die Firmware-Bilder um (Python 3 mit Pillow) |
build_opt.h |
projektlokale Compiler-Schalter |
partitions.csv |
eigene Partitionstabelle |
docs/ |
GitHub Pages: Web-Installer, version.json, manifest.json, firmware/*.bin
|
CHANGELOG.md, DEVLOG.md, CREDITS.md, LICENSE |
Änderungen, Entwicklungs-Tagebuch, Quellenangaben, MIT-Lizenz |
Bauen
Arduino IDE: ESP32-Core 3.3.x, Bibliotheken LVGL 8.3.x, Arduino_GFX_Library, ArduinoJson 7.x. Die globale lv_conf.h liegt in Arduino/libraries/ neben dem Ordner lvgl. Board ESP32C3 Dev Module mit:
| Menü | Wert |
|---|---|
| USB CDC On Boot | Enabled |
| CPU Frequency | 160 MHz |
| Flash Size / Mode / Frequency | 4 MB / QIO / 80 MHz |
| Partition Scheme | Custom (die partitions.csv im Sketch-Ordner)
|
| Upload Speed | 921600 |
Kommandozeile:
arduino-cli compile --fqbn "esp32:esp32:esp32c3:UploadSpeed=921600,CDCOnBoot=cdc,CPUFreq=160,FlashFreq=80,FlashMode=qio,FlashSize=4M,PartitionScheme=custom,DebugLevel=none" .
Ohne das Partitionsschema Custom meldet der Compiler „Sketch zu groß“, weil die Standardtabelle weniger Platz hat.
build_opt.h
| Schalter | Wirkung |
|---|---|
-Os |
Optimierung auf Größe |
-DLV_COLOR_16_SWAP=0 |
Arduino_GFX tauscht die Bytes selbst. Mit 1 sind die Farben falsch
|
-DLV_MEM_SIZE=98304 |
96 KB LVGL-Speicher. Weniger: Icons fehlen. Mehr: zu wenig freier Heap für den TLS-Handshake (HTTPS) |
Die Schalter liegen projektlokal in build_opt.h, weil die globale lv_conf.h von allen Arduino-Projekten geteilt wird. Compiler--D-Flags gewinnen immer gegen lv_conf.h.
Speicher und Partitionen
Der ESP32-C3 hat 4 MB Flash und keinen PSRAM. Die HTTPS-Abrufe brauchen etwa 40–50 KB freien Heap, deshalb ist LVGL auf 96 KB begrenzt. HTTPS läuft immer über WiFiClientSecure mit setInsecure() (keine Zertifikatsprüfung), ein HTTPClient allein mit https://-URL liefert unter Core 3.3.x HTTP -1. getLocalTime() wird mit Timeout 0 aufgerufen, damit es nicht bis zu 5 Sekunden blockiert.
| Partition | Größe |
|---|---|
nvs |
20 KB (Einstellungen, bleiben bei Updates) |
otadata |
8 KB |
app0 / app1 |
je 2.031.616 Bytes (das Update wird in den jeweils anderen Slot geschrieben) |
Die SPIFFS-Partition wurde entfernt (der Cube nutzt nur NVS), dadurch passen die Slots mit ca. 1,8 MB Firmware bequem. Die Partitionstabelle lässt sich nicht per Update ändern, nur per USB oder Web-Installer.
Oberfläche mit PicoPixel
Die Oberfläche wird im browserbasierten LVGL-Editor PicoPixel gebaut (zuvor SquareLine Studio, Wechsel in v1.8.0).
- In PicoPixel in den Sketch-Ordner exportieren.
- Die Schriften aus dem Unterordner
fonts/in den Sketch-Ordner kopieren und die Include-Pfade vonfonts/fonts.hauffonts.händern (z. B. inscreens.cundstyles.c). Die Bilder bleiben im Unterordnerimages/(images.cbindetimages/*.cein), danachpython3 tools/wetter_icons.pyausführen (setzt die Platzhalter wieder ein, siehe unten). - Nach dem letzten Export immer neu kompilieren, bevor committet wird. Ein später Re-Export überschreibt die Pfad-Korrekturen und bricht sonst den Build (so geschehen in v1.8.1, behoben in v1.8.2).
- Zugriff auf Elemente läuft über die zentrale
objects-Struktur, z. B.objects.labeltemp.
Wetter-Icons
Die Wetter- und Warn-Symbole kommen nicht aus PicoPixel, sondern aus tools/wetter_icons.py: Das Skript schneidet die PNG-Quellen (assets/icons/wetter/, 32 Quell-PNGs, davon 28 eingebunden, assets/icons/warn/) auf den gemeinsam belegten Bereich zu, verkleinert sie (Wettersymbole 48×48, Warnsymbole 80×80) und schreibt LVGL-Bilder nach icons/. Die Zuordnung der Wettercodes steht in wmoZuImage() in wettercube.ino, die Warnsymbole werden in setup() gesetzt.
Die PicoPixel-Bilder in images/ (day_clear, rain, alert …) bleiben nur als 1×1-Platzhalter, weil screens.c auf diese Namen verweist. Nach jedem PicoPixel-Export python3 tools/wetter_icons.py ausführen, denn der Export überschreibt die Platzhalter mit den großen Originalen. Jedes Symbol (48×48) braucht 6,9 KB Flash. Angezeigt werden sie 73 px (Hauptscreen) und 52 px (Vorhersage): setWeatherIcon() zoomt auf die Widget-Größe aus PicoPixel, die Größe lässt sich also dort ändern; größere Bilder verbrauchen schnell mehr (256×256 px ≈ 196 KB).
Release-Ablauf
FIRMWARE_VERSIONinwettercube.ino,docs/version.jsonunddocs/manifest.jsonauf die neue Version setzen.- Lokal testen. In der Arduino IDE Sketch → Kompilierte Binärdatei exportieren.
- Die vier Binaries (
bootloader,partitions,boot_app0,firmware) nachdocs/firmware/kopieren (für den Web-Installer alle vier, für OTA genügtfirmware.bin). CHANGELOG.mdundDEVLOG.mdergänzen.- Committen, pushen, auf GitHub ein Release anlegen. GitHub Pages braucht danach einige Minuten.
Der Cube holt version.json und firmware/firmware.bin von https://jppeterson-lab.github.io/WetterCube/ (Groß-/Kleinschreibung im Repo-Namen muss exakt stimmen).
Lizenz und Credits
Der Quellcode steht unter der MIT-Lizenz. Die Wetter-Icons sind die Meteocons von Bas Milius (MIT), das Gehäuse von Keralots. Details in CREDITS.md.