Zum Inhalt springen

WetterCube/Entwicklung

Aus WetterCube Wiki

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).

  1. In PicoPixel in den Sketch-Ordner exportieren.
  2. Die Schriften aus dem Unterordner fonts/ in den Sketch-Ordner kopieren und die Include-Pfade von fonts/fonts.h auf fonts.h ändern (z. B. in screens.c und styles.c). Die Bilder bleiben im Unterordner images/ (images.c bindet images/*.c ein), danach python3 tools/wetter_icons.py ausführen (setzt die Platzhalter wieder ein, siehe unten).
  3. 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).
  4. 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

  1. FIRMWARE_VERSION in wettercube.ino, docs/version.json und docs/manifest.json auf die neue Version setzen.
  2. Lokal testen. In der Arduino IDE Sketch → Kompilierte Binärdatei exportieren.
  3. Die vier Binaries (bootloader, partitions, boot_app0, firmware) nach docs/firmware/ kopieren (für den Web-Installer alle vier, für OTA genügt firmware.bin).
  4. CHANGELOG.md und DEVLOG.md ergänzen.
  5. 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.