Version 1.9.0: - Die Messung aus 1.8.8 hat die Ursache der Trägheit gefunden: Jeder Bildaufbau kostete 240 bis 300 Millisekunden - dauerhaft, auch im Leerlauf. Fünf Sekunden für den Aufweckdialog waren also rund zwanzig solcher Durchgänge. - Grund war, dass zweimal durch den Bildspeicher gearbeitet wurde: LVGL zeichnete in einen eigenen Puffer, und dessen Inhalt wurde anschließend vollständig in den Bildspeicher kopiert. Bei 1280x720 in 24 Bit sind das zwei Durchgänge durch je 2,7 MB. - LVGL zeichnet jetzt direkt in den Bildspeicher. Der Treiber lässt das Kopieren dann weg, und LVGL zeichnet nur noch die geänderten Bereiche statt jedes Mal die ganze Fläche. Schalter WS7_DIRECT_FB in pins_config.h. - Die Anzeigen von Shot-Timer und Waage bleiben während eines Bezugs in der normalen Schrift; der fette Wechsel ist entfernt. Der Bereich bekommt weiterhin mehr Platz. - Neu: Die Größe der Standby-Uhr lässt sich einstellen (Klein, Mittel, Groß - 120, 180 oder 240 Pixel), zu finden auf der Info-Seite unter Darstellung. Anders als die allgemeine Schriftgröße wirkt sie sofort, weil sie an einem einzigen Textfeld hängt. - Die Knöpfe des Aufweckdialogs berücksichtigen jetzt ebenfalls die eingestellte Schriftgröße und wachsen mit. Version 1.8.8: - Der Aufweckdialog berücksichtigt jetzt die eingestellte Schriftgröße vollständig: Die Knöpfe bekommen dieselbe Schrift wie der Text und wachsen mit (150 / 210 / 280 Pixel). Bisher erbten sie die kleine Grundschrift und behielten eine feste Breite - neben dem größeren Text wirkten sie dadurch verloren. - Die große Standby-Uhr bleibt bewusst bei ihrer festen Größe: Sie ist bereits auf die Bildschirmhöhe abgestimmt, eine Umschaltung würde sie nur schlechter passend machen. - Neu: eine Zeitmessung für langsame Bildaufbauten. Überschreitet ein Zeichenzyklus 200 Millisekunden, meldet die serielle Konsole seine Dauer. Damit lässt sich feststellen, welcher Vorgang tatsächlich Zeit kostet - die bisherigen Erklärungen für die Verzögerung beim Aufweckdialog haben sich als falsch erwiesen, und weiteres Raten hilft nicht. Im Normalbetrieb bleibt die Ausgabe still. Version 1.8.7: - Vom Fingertipp auf die Standby-Uhr bis zum Aufweckdialog vergingen rund fünf Sekunden mit schwarzem Bildschirm. Ursache war der halbdurchsichtige Vorhang, den der Dialog über den ganzen Bildschirm legt: Dafür muss LVGL einen Vollbild-Zwischenpuffer anlegen und die gesamte Fläche mischen - bei 1280x720 in 24 Bit die teuerste Operation überhaupt. - Der Vorhang ist auf dem Waveshare-Panel jetzt deckend. Verloren geht dabei nichts: Im Standby liegt dahinter ohnehin nur Schwarz. - Aus demselben Grund ist auch der Vorhang des Menüs deckend, in einem dunklen Ton. Auf dunklem Grund sieht das praktisch genauso aus wie halbdurchsichtig, spart aber dieselbe Mischarbeit. Die JC-Panels behalten in beiden Fällen die Transparenz. - Der Aufweckdialog wird mit größerer Schrift auch breiter (420 / 640 / 900 Pixel), damit der Text nicht an unglücklichen Stellen umbricht. Version 1.8.6: - Die Uhrzeit verschwindet nicht mehr, wenn die Hauptplatine ihre Zeit gerade neu abgleicht. Der P4 merkt sich die zuletzt empfangene Uhrzeit und zählt zwischen den Meldungen selbst weiter; sobald die Hauptplatine wieder eine Zeit schickt, gilt deren Wert. - Der P4 stellt dabei nichts richtig und ersetzt keine Zeitquelle - er überbrückt nur die Lücke. Hat er noch nie eine Uhrzeit bekommen, bleibt die Anzeige wie bisher leer. - Gilt für die Uhr in der Kopfleiste und für die große Standby-Uhr. Version 1.8.5: - Die Verzögerung von rund zwei Sekunden rund um den Standby ist behoben. Sie lag nicht an der Helligkeitsumschaltung, sondern daran, dass die Standby-Uhr bei JEDER Zustandsmeldung der Hauptplatine nach vorn geholt wurde. Das ordnet die Ebenen neu und lässt LVGL den gesamten Bildschirm neu zeichnen - einmal pro Sekunde, jedes Mal 1280x720 in 24 Bit. Dadurch hing die Oberfläche dauerhaft ein bis zwei Sekunden hinterher. Nach vorn geholt wird die Uhr jetzt beim Einblenden, danach bleibt sie dort. - Der Aufweckdialog schließt sich nach 30 Sekunden ohne Auswahl von selbst und wird wie „Abbrechen" gewertet. Vorher blieb das Display hell stehen - der Dialog schaltet auf normale Helligkeit, und ein versehentlicher Tipp auf die Uhr hätte die Maschine die ganze Nacht leuchten lassen. - Die Verlaufskurve hat keinen eigenen Hintergrund mehr; sie liegt jetzt direkt auf der Karte. Die abgesetzte Fläche war nur nötig, solange die Kurve vor dem ersten Messwert leer blieb - seit sie beim aktuellen Wert startet, ist immer eine Linie da. - Auf der Statistikseite erschien ein leeres Rechteck, wenn ohne Waage bezogen wurde. Dort stand ein typografischer Gedankenstrich, den der Zeichensatz der Schrift nicht enthält. Jetzt ein einfacher Bindestrich. Version 1.8.4: - Standby-Uhr und Aufweckdialog erscheinen jetzt sofort statt mit spürbarer Verzögerung. Ursache waren die weichen Ein- und Ausblendungen: Eine Deckkraft-Animation ist bei einem Bildspeicher in RGB888 das Teuerste, was die Oberfläche tun kann, weil für jedes Einzelbild die gesamte Fläche unter der Ebene neu gezeichnet und mit ihr gemischt werden muss. Auf 1280x720 dauerte eine solche Blende deutlich länger als die 450 ms, die vorgesehen waren. Auf dem Waveshare-Panel laufen die Übergänge deshalb ohne Animation; die JC-Panels behalten sie. - Beim Wechsel der Schriftgröße blitzte kurz ein blaues Bild auf. Das kommt nicht von der Firmware: Das Panel zeigt von sich aus Blau, sobald kein Videosignal anliegt - und beim nötigen Neustart reißt das Signal kurz ab. Die Beleuchtung wird jetzt vorher abgeschaltet; dunkel ist unauffälliger als blau. - Neue Einstellung unter Darstellung: „Temperaturzahl in der Zustandsfarbe". Aus bleibt die Zahl weiß, die Zustandsfarbe steckt dann allein im Balken darunter - ruhiger, und die Zahl bleibt eine Zahl. Ein bedeutet, sie färbt sich mit, wie bisher. Vorgabe ist aus. Warnungen bleiben in jedem Fall rot; das ist keine Gestaltung, sondern eine Meldung. Version 1.8.3: - Fehlerbehebung: Bei allen Darstellungen stand hinter der Temperatur ein leeres Rechteck statt des C. Die beiden großen Schriften waren auf Ziffern, Komma, Punkt, Minus und Gradzeichen beschränkt - das C fehlte darin schlicht. Es ist jetzt enthalten, ebenso g und s für die Gewichts- und Zeitanzeige während eines Bezugs. - Fehlerbehebung: Bei der Darstellung „Verlauf" war keine Kurve zu sehen. Ein frisch angelegtes Diagramm enthält lauter „kein Wert"-Punkte und zeichnet deshalb nichts; ohne Hintergrund war der Bereich vollständig unsichtbar, bis nach einer Minute genug Messwerte zusammengekommen wären. Die Kurve startet jetzt beim aktuellen Messwert, und ihre Fläche ist leicht abgesetzt. - Die großen Zahlen des Dashboards stehen jetzt im fetten Schnitt und etwas enger, wie im Entwurf. Erzeugt aus der variablen Maven-Pro-Datei mit Gewicht 700 - dieselbe Schriftart wie bisher, nur kräftiger. Die übrige Oberfläche bleibt unverändert. Version 1.8.2: - Die Liste der letzten Bezüge auf der Statistikseite ist jetzt eine Tabelle mit festen Spalten: Zeitpunkt, Dauer, Gewicht und gegebenenfalls die Kennzeichnung „kalt". - Vorher war es ein einziges mehrzeiliges Textfeld, in dem die Werte durch Leerzeichen getrennt aneinandergereiht standen. Weil Zahlen unterschiedlich breit sind, stand nichts untereinander - zwei Bezüge ließen sich nicht vergleichen, ohne jede Zeile einzeln zu lesen. Genau das sah unruhig aus. - Ziffern haben jetzt gleiche Breite, jede zweite Zeile ist leicht abgesetzt, und eine Kopfzeile benennt die Spalten. Wurde ohne Waage bezogen, bleibt die Gewichtsspalte leer, statt eine Null vorzutäuschen. - Die Zeilen werden einmal angelegt und danach nur gefüllt oder ausgeblendet, statt bei jeder Aktualisierung neu zu entstehen. Version 1.8.1: - Die Bezugsanzeige ist da, und zwar für alle vier Darstellungen gemeinsam: Sobald ein Bezug oder Dampfbezug läuft, schrumpft der Temperaturbereich und die untere Zeile wächst. Shot-Timer und Gewicht werden dabei auf 96 Pixel vergrößert - während eines Bezugs zählen Zeit und Gewicht, die Kesseltemperaturen sind dann Nebensache. - Es gibt keine zweite Ansicht: Die Seite verschiebt nur das Gewicht zwischen ihren beiden Bereichen. Damit bleibt alles an seinem Platz, und es gibt nichts doppelt zu pflegen. - Der Wechsel hält nach dem Bezug noch vier Sekunden an. Ohne dieses Nachhalten würde die Seite bei jeder kurzen Unterbrechung hin- und herspringen - das wäre unruhiger als gar kein Wechsel. Version 1.8.0: - Das Dashboard hat vier neue Darstellungen, die die bisherigen fünf ersetzen. Sie sind keine Varianten desselben Bildes, sondern vier Antworten auf die Frage, was die große Fläche des 7-Zöllers leisten soll: * Gewichtet - Wasser bekommt zwei Drittel der Fläche, Dampf ein Drittel. Beim Espresso zählt die Wassertemperatur; die Asymmetrie ist die Aussage. * Verlauf - unter jeder Temperatur eine flache Kurve der letzten Minute. Die eigentliche Frage an eine PID-Regelung ist nicht „wie warm", sondern „hält sie" - und das kann eine Zahl grundsätzlich nicht zeigen. Der Ausschnitt hängt am Sollwert, damit die Abweichung sichtbar wird statt in der Skala unterzugehen. * Flächen - keine Kartenkanten, zwei Felder mit einem Hauch Helligkeitsunterschied. * Band - ein farbiges Band über die volle Breite sagt den Zustand, bevor eine Zahl gelesen wird: bereit, heizt, Bezug, Cold Extraction oder Standby. Neue Vorgabe. - Dafür gibt es zwei neue Schriftgrade (96 und 140 Pixel). Sie enthalten nur Ziffern, Komma, Punkt, Minus und Gradzeichen - mit vollem Zeichensatz wären sie um ein Vielfaches größer, ohne etwas beizutragen. Die größte Textschrift hatte bisher 48 Pixel, was für die großen Zahlen nicht reichte. - Ältere Stände haben in den Einstellungen noch die Nummer einer der früheren Darstellungen gespeichert; liegt sie außerhalb, fällt sie auf die Vorgabe zurück. - Der Aufbau der Bezugsanzeige - untere Zeile wechselt während eines Bezugs auf große Timer- und Gewichtsanzeige - folgt als nächster Schritt. Version 1.7.3: - Die Schriftgröße steht jetzt auf der Info-Seite im Abschnitt „Darstellung", zusammen mit der Wahl der Temperaturanzeige und dem Live-Bezugsschirm. Dort gehört sie hin: Es ist eine Einstellung dieses Displays, keine Wartungsaufgabe. - Die Seite Reinigung & Wartung hat damit wieder vier Karten in zwei Spalten. - Die Auswahl selbst ist unverändert: drei Stufen, Neustart nach der Auswahl. - Sie steht auf allen Panels zur Verfügung, nicht nur auf dem 7-Zöller. Version 1.7.2: - Die Schriftgröße lässt sich jetzt einstellen: Klein, Mittel oder Groß, zu finden auf der Seite Reinigung & Wartung in der neuen Karte „Darstellung". - LVGL-Schriften sind fest einkompilierte Bilddaten; es gibt sie nur in den Größen, die im Projekt liegen (14, 18, 28, 40 und 48 Pixel). Stufenlos skalieren lässt sich also nichts. Stattdessen gibt es drei Rollen - klein, normal, hervorgehoben -, die je nach Einstellung eine Stufe höher greifen. - Die großen Anzeigen für Temperatur und Uhrzeit bleiben unverändert: Sie sind bereits auf die Bildschirmgröße abgestimmt und sollen nicht mitwachsen. - Die Einstellung liegt lokal im Display, nicht auf der Hauptplatine - sie betrifft nur dieses Gerät. Nach der Auswahl startet der P4 neu, weil die Schriften in bereits angelegten Bedienelementen stecken und sich nicht nachträglich umhängen lassen. - Zu erwarten: In der Stufe Groß brauchen die Karten mehr Platz. Ob alle Seiten dann noch vollständig auf den Bildschirm passen, zeigt erst das Gerät. Version 1.7.1: - Cold Extraction ist auf dem 7-Zoll-Panel dreispaltig: oben die drei Karten mit Erklaerungstext (Modus, Vorbenetzung, Bezugsende), darunter die knappen (Grundeinstellung, Hauptbezug, Pumpenschutz), der Speichern-Knopf frei unter allen sechs. Drei statt zwei Spalten, weil die Erklaerungstexte keine volle Zeilenbreite brauchen und so am Ende keine halbleere Reihe stehen bleibt. - Der Warnhinweis stand bisher als eigene Zeile am Seitenende, weit entfernt von dem Schalter, auf den er sich bezieht. Er sitzt jetzt in der Modus-Karte. - Reinigung & Wartung ist zweispaltig und besteht aus vier Karten: Wartungszaehler, Flush-Zeiten, Display-Helligkeit sowie Reinigung & Entkalkung. Bisher standen dort lose Zeilen unter blossen Zwischenueberschriften, dazwischen freistehende Knoepfe. - Anders als bei Bruehen und Cold Extraction sitzt der Speichern-Knopf hier IN der Karte: Jede Karte speichert etwas anderes, deshalb gehoert der Knopf zur Karte statt unter die Seite. - Alle drei umgestellten Seiten passen jetzt vollstaendig auf den Bildschirm. Die JC-Panels behalten ihr einspaltiges Layout. Version 1.7.0: - Brew-Control ist auf dem 7-Zoll-Panel zweispaltig: Pre-Infusion und Brew-by-Weight oben, Brew-by-Time und Dampf-Timer darunter, der Speichern-Knopf frei unter allen Karten. Damit passt die Seite vollstaendig auf den Bildschirm und muss nicht mehr gescrollt werden - der teuerste Vorgang der Oberflaeche entfaellt dort ersatzlos. - Die Anordnung folgt der Bedeutung: links steht, was den Bezug startet, rechts, was ihn beendet. - Der Speichern-Knopf sitzt bewusst nicht in einer der Karten. Er speichert die ganze Seite und wuerde in einer einzelnen Karte so wirken, als gaelte er nur fuer diese. - Die JC-Panels bleiben einspaltig - dort ist der Platz knapp, nicht ueppig. - Cold Extraction und Reinigung/Wartung folgen als naechstes. Version 1.6.27: - Beim Waveshare-Panel rollen scrollbare Listen nach dem Loslassen nicht mehr aus, sondern folgen nur dem Finger. Ohne Doppelpufferung entsteht beim Scrollen jedes Bild komplett neu; am staerksten faellt das beim Ausrollen auf, wo sich das Bild ohne fuehrenden Finger weiterbewegt und jedes Stocken unmittelbar sichtbar ist. - Die JC-Panels sind ausgenommen, ihr Bediengefuehl bleibt unveraendert. Version 1.6.26: - Fehlerbehebung: Beim Bildlauf blitzten blaue Zwischenbilder auf. Ursache war der zweite Zeichenpuffer aus 1.6.25. Der Panel-Treiber lehnt eine Uebertragung ab, solange die vorige noch laeuft; mit zwei Puffern schickt LVGL die naechste aber sofort los. Die abgelehnte Uebertragung faellt ersatzlos aus, und der betroffene Bildbereich behaelt seinen alten Inhalt. - Der zweite Zeichenpuffer ist deshalb wieder entfernt, die Herstellerdatei lvgl_port_v9.c damit wieder unveraendert. Der eigentliche Gewinn beim Bildlauf bleibt erhalten: Der Zwischenpuffer hat weiterhin volle Bildhoehe, ein Bildlauf braucht also einen Durchgang statt sechs. Version 1.6.25: - Der Bildlauf war nach der Umstellung auf einen Bildspeicher sehr zaeh. Grund war der Zwischenpuffer, in den LVGL zeichnet: Mit 120 Zeilen brauchte ein Bildlauf ueber die ganze Seite sechs Durchgaenge, jeder mit eigener Uebertragung in den Bildspeicher. - Der Zwischenpuffer hat jetzt volle Bildhoehe - ein Durchgang statt sechs. Dazu kommt ein zweiter Puffer, damit LVGL bereits den naechsten Bereich zeichnen kann, waehrend der vorige noch uebertragen wird. - Kosten: 2 x 2,8 MB PSRAM zusaetzlich, bei 32 MB unkritisch. Am Startverhalten aendert sich nichts: Diese Puffer sind Zeichenpuffer, keine Bildspeicher der Anzeige - es bleibt bei EINEM Bildspeicher, und nur der war fuer den Startfehler verantwortlich. Version 1.6.24: - Ursache des unzuverlaessigen Starts gefunden und behoben: die Anzahl der Bildspeicher. Mit zwei Bildspeichern kam nach dem Einschalten kein Bild - der Hochlauf meldete durchgehend Erfolg, das Panel blieb dunkel, und erst ein Reset half. Mit genau einem startet es zuverlaessig. Belegt wurde das mit den Prueffarbbalken: Sie erscheinen mit einem Speicher sofort, mit zweien nicht. Der Werks-Testsketch benutzt ebenfalls einen - das war der letzte verbliebene Unterschied zu ihm. - Die Oberflaeche laeuft deshalb ohne Doppelpufferung: LVGL zeichnet in einen Zwischenpuffer von 120 Zeilen im PSRAM, der dann in den einen Bildspeicher uebertragen wird. Bei schnellen Bildwechseln kann kurz eine Kante sichtbar werden; ein zuverlaessig startendes Display wiegt das auf. - Schalter WS7_SINGLE_FB in pins_config.h. WS7_PARTIAL_REFRESH ist damit wirkungslos, weil es ohne Doppelpufferung nichts umzuschalten gibt. - Der PSRAM-Bedarf sinkt von 5,4 MB auf 2,8 MB. - Die Umgehungen aus den Vorversionen bleiben erhalten: Anlaufzeit, wiederholte Bridge-Grundeinstellung, wiederholte Weckbefehle und der Neustart nach Kaltstart. Ob jede davon noch noetig ist, laesst sich jetzt einzeln pruefen - der Startfehler selbst ist behoben. Version 1.6.23: - Der Selbst-Neustart aus 1.6.22 reicht nicht: Ein Software-Neustart setzt offenbar nicht dasselbe zurueck wie die Reset-Taste. Der Schalter bleibt eingeschaltet, er schadet nicht, loest das Problem aber nicht allein. - Zurueck zu dem einen Unterschied zum funktionierenden Werks-Testsketch, der bisher nie ueberprueft wurde: Dieser legt EINEN Bildspeicher an, die Firmware zwei. Der Pruefbild-Test lief bislang ebenfalls mit zwei und war damit nie ein echter Nachbau des Testsketches - er wich an genau der Stelle ab, die noch offen ist. - Mit WS7_TEST_PATTERN = 1 wird jetzt genau ein Bildspeicher angelegt, wie im Testsketch. Erscheinen die Farbbalken damit zuverlaessig, liegt es an der Anzahl der Bildspeicher, und die Oberflaeche laesst sich darauf umstellen. Version 1.6.22: - Der Ab- und Wiederaufbau der DSI-Strecke aus 1.6.21 hat nicht geholfen, sondern das Bild um einen Schritt verschlechtert: Nach dem Einschalten kam gar nichts mehr, nach dem ersten Reset nur die Beleuchtung, erst nach dem zweiten das Bild. Ein Ab- und Wiederaufbau im laufenden Betrieb ist einem echten Chip-Reset also nicht gleichwertig. WS7_DSI_RESTART steht deshalb wieder auf 0; der Schalter bleibt samt Begruendung erhalten. - Stattdessen der Weg, den die Messungen eindeutig stuetzen: Nach einem Kaltstart startet der P4 sich genau einmal selbst neu, sobald der erste Hochlauf durch ist. Damit passiert genau das, was bei jedem Versuch zuverlaessig geholfen hat - ohne dass jemand die Reset-Taste druecken muss. - Eine Schleife ist ausgeschlossen: Beim zweiten Durchlauf ist der Startgrund kein Kaltstart mehr, die Bedingung greift nicht erneut. Der Fruehstart-Zaehler der Absturzsicherung wird vor dem gewollten Neustart zurueckgesetzt, damit dieser nicht als Absturz zaehlt. - Kostet rund drei Sekunden, und nur beim Einschalten. Schalter WS7_COLD_BOOT_RESTART in pins_config.h. - Das ist eine Umgehung, keine Erklaerung: Warum das Panel den ersten Anlauf nach dem Einschalten nicht annimmt, ist weiterhin offen. Der Hochlauf meldet durchgehend Erfolg. Version 1.6.21: - Der Hochlauf lief zuletzt vollstaendig fehlerfrei durch - Bridge zweimal eingestellt, Panel zweimal geweckt, alle I2C-Bausteine erreichbar - und trotzdem kam beim ersten Einschalten kein Bild. Erst ein Reset half, und der zuverlaessig. Es fehlte also kein Befehl mehr; es fehlte der Vorgang selbst. - Ein Reset unterscheidet sich an dieser Stelle in genau einem Punkt: Die DSI-Verbindung geht einmal weg und neu auf, waehrend Bridge und Panel bereits versorgt und eingestellt sind. Weder die wiederholte Grundeinstellung noch die wiederholten Weckbefehle ersetzen das - beide laufen ueber eine Verbindung, die durchgehend bestand. - Der Hochlauf baut die DSI-Strecke jetzt einmal komplett ab und wieder auf: Bildausgabe, Kommandokanal und Bus werden freigegeben und neu angelegt. Damit passiert ohne Reset, was vorher erst der zweite Start brachte. Schalter WS7_DSI_RESTART in pins_config.h, Pause dazwischen WS7_DSI_RESTART_MS (Vorgabe 200 ms). - Der DSI-Aufbau steckt dafuer in einer eigenen Funktion, damit der Vorgang wiederholbar ist statt zweimal im Quelltext zu stehen. Version 1.6.20: - Nach 1.6.19 lief es reproduzierbar so ab: Beim Einschalten ging nach zwei bis drei Sekunden die Hintergrundbeleuchtung an, dann kam nichts mehr; nach einem Reset ging die Beleuchtung kurz aus und danach erschien Beleuchtung samt Bild. Daraus folgt der letzte fehlende Schritt: Auch die Grundeinstellung der Bridge lief bisher nur einmal, und zwar bevor die DSI-Strecke ueberhaupt existierte. Beim Reset half es nur deshalb, weil die Bridge ihre Einstellung aus dem vorigen Durchlauf noch hatte und diesmal ein DSI-Signal vorfand. - Die Grundeinstellung der Bridge wird jetzt ein zweites Mal geschrieben, sobald die Videoausgabe laeuft - dasselbe Vorgehen wie bei den Weckbefehlen des Panels in 1.6.19. Damit wird ohne Reset erreicht, was vorher erst der zweite Durchlauf brachte. - Im Start-Log sind beide Durchgaenge benannt ("Bridge-Grundeinstellung vor dem DSI-Start" und "... nach dem Start der Videoausgabe"). Version 1.6.19: - Die Wartezeit aus 1.6.18 hat den Start deutlich verbessert, aber noch nicht zuverlässig gemacht. Aus dem verbliebenen Fehlerbild folgt der nächste Schritt: Die Beleuchtung ging an, das Bild fehlte. Die Beleuchtung hängt an der Bridge und wird über I2C geschaltet - sie funktioniert also. Verloren gehen die Weckbefehle an das Panel selbst. - Diese Befehle wurden bisher genau einmal geschickt, bevor die Videoausgabe lief. War der Panel-Controller in dem Moment noch nicht aufnahmebereit, waren sie weg, und danach hat nie wieder jemand nachgefragt. Sie werden jetzt ein zweites Mal gesendet, sobald die Videoausgabe steht. Die Befehle sind wiederholbar, der zweite Anlauf kostet nichts. - Die Pause dazwischen steht als WS7_PANEL_SETTLE_MS in pins_config.h (Vorgabe 200 ms). - Im Start-Log ist jeder Anlauf einzeln zu sehen ("Weckbefehle vor/nach dem Start der Videoausgabe"). Version 1.6.18: - Ursache des unzuverlässigen Starts gefunden: Der P4 sprach Bridge und Panel sofort nach dem Einschalten an. Das Displaymodul braucht danach aber einen Moment, bis es bereit ist. Kam der Hochlauf zu früh, nahm die Bridge ihre Register nicht an oder das Panel zeigte trotz korrekt gesendeter DSI-Daten nichts - beides ohne Fehlermeldung, weil aus Sicht des P4 jeder Schritt geklappt hatte. Das Ergebnis war ein Display, das mal ansprang und mal nicht, und beim ersten Anstecken meist gar nicht. - Der Hochlauf wartet jetzt WS7_PANEL_WARMUP_MS (Vorgabe 2000 ms), bevor er beginnt. Der Werks-Testsketch wartet aus demselben Grund 2 Sekunden am Anfang. - Damit erklärt sich auch, warum es mit geöffnetem seriellen Monitor fast immer klappte: Dessen USB-Anmeldung verzögert den Start und ersetzte damit unbeabsichtigt die Wartezeit. - Der Wert steht in pins_config.h. Läuft der Start zuverlässig, lässt er sich vorsichtig senken; springt die Anzeige nicht an, ist er der erste Wert zum Erhöhen. Version 1.6.17: - Der I2C-Stoerimpulsfilter aus 1.6.16 wirkt: Nach dem Panel-Start melden sich wieder alle drei Bausteine, Bridge und Touch bleiben ansprechbar. - Das Pruefbild aus 1.6.15 war allerdings wirkungslos und damit als Test untauglich: Es wurde zwar gesetzt, doch unmittelbar danach startete LVGL und schrieb in den Bildspeicher, womit das Pruefbild wieder verschwand. Der Test sah deshalb genauso aus wie der Fehler, den er finden sollte. - Mit WS7_TEST_PATTERN = 1 endet der Hochlauf jetzt direkt nach dem Pruefbild: Beleuchtung an, Farbbalken stehen, kein LVGL. Damit ist die Frage eindeutig zu beantworten, ob die Anzeigekette bis zum Panel arbeitet. Version 1.6.16: - Ursache des schwarzen Bildes gefunden. Der Start-Log zeigte es eindeutig: Vor dem Panel-Start meldeten sich alle drei I2C-Bausteine (Touch 0x14, Audio 0x18, Bridge 0x45), danach nur noch der Audio-Baustein. Es fielen also genau die beiden weg, die am Displaykabel haengen - der Bus selbst arbeitete weiter. Sobald die DSI-Ausgabe laeuft, stoeren deren schnelle Signale auf das lange Flachbandkabel ein, und ohne Filterung bringen diese Stoerspitzen die I2C-Uebertragung aus dem Tritt. Die Bridge liess sich daraufhin nicht mehr ansprechen, das Panel blieb dunkel. - Der I2C-Bus laeuft fuer das Waveshare-Panel jetzt mit Stoerimpulsfilter und internen Abschlusswiderstaenden, so wie es auch das Waveshare-Beispiel tut. Beides fehlte, weil die Bus-Einrichtung urspruenglich von den JC-Panels uebernommen wurde, die kein Flachbandkabel dieser Laenge haben. - Das erklaert rueckwirkend auch, warum sich der Fehler so sprunghaft verhielt: Ob eine Uebertragung durchkam, hing von der Stoerlage ab. Version 1.6.15: - Diagnose fuer das schwarze Bild, das der Log bisher nicht erklaeren konnte: Alle Schritte liefen fehlerfrei durch, trotzdem blieb die Anzeige leer. - Die drei Weckbefehle an das Panel (MADCTL, Sleep Out, Display On) liefen bislang ungeprueft durch und sind jetzt in die Fehlerausgabe einbezogen. - Neuer Schalter WS7_TEST_PATTERN in pins_config.h: zeigt statt der Oberflaeche Prueffarbbalken an. Sie entstehen im DSI-Baustein selbst und benutzen weder Bildspeicher noch LVGL. Damit laesst sich in einem Durchgang trennen, ob die Anzeigekette bis zum Panel arbeitet oder ob der Fehler weiter oben liegt. - Das Ende des Hochlaufs wird gemeldet ("Bringup fertig" / "LVGL laeuft"). Bisher endete die Ausgabe nach dem Panel-Start, und ein Haengenbleiben in LVGL war von einem fehlenden Bild nicht zu unterscheiden. Version 1.6.14: - Der Touch-Controller wird jetzt erst angesprochen, nachdem die Bridge freigegeben und die Hintergrundbeleuchtung eingeschaltet ist. Der GT9271 haengt an derselben Versorgung und antwortet vorher nicht auf I2C - deshalb schlug seine Initialisierung bisher schon beim Kaltstart fehl. In der Werks-Testskizze steht die Touch-Initialisierung aus demselben Grund hinter dem Einschalten der Beleuchtung; beim Uebertragen in die Firmware war diese Reihenfolge verloren gegangen. - Die Wartezeit dazwischen steht als WS7_TOUCH_POWER_MS in pins_config.h (Vorgabe 120 ms). - Neu im Start-Log: eine Liste aller Bausteine am I2C-Bus, einmal vor und einmal nach dem Panel-Start. Erwartet werden 0x45 (Bridge) und 0x14 (Touch). Damit ist auf einen Blick zu sehen, ob ein Baustein gar nicht antwortet, statt aus Treiberfehlern raten zu muessen. Version 1.6.13: - Ursache des schwarzen Bildes gefunden: ein haengender I2C-Bus. Trifft ein Reset des P4 mitten in eine laufende Uebertragung, bleibt der angesprochene Baustein in seiner Bitausgabe stehen und haelt die Datenleitung dauerhaft auf Masse. Damit schlaegt jede weitere Uebertragung fehl. Bridge und Touch-Controller haengen an Dauerstrom, weshalb dieser Zustand jeden Reset und sogar das Flashen ueberlebt - nur echtes Stromabziehen loest ihn. Die Folge: Die Bridge wird nie initialisiert, das Bild bleibt schwarz, und weil sie ihre Register behaelt, brennt die Hintergrundbeleuchtung weiter. - Vor dem Anlegen des I2C-Busses wird die Taktleitung jetzt von Hand getaktet, bis der Baustein die Datenleitung freigibt, danach folgt eine Stopp-Bedingung. Das ist der in der I2C-Spezifikation vorgesehene Weg und laeuft bei freiem Bus wirkungslos durch. - Fehlerbehebung: Schreibzugriffe auf die Bridge liefen stillschweigend ins Leere. Genau deshalb war der Fehler so schwer zu finden - das Bild blieb ohne jeden Hinweis schwarz. Sie melden Fehler jetzt im Klartext. - Fehlerbehebung: In pins_config.h stand seit 1.6.10 "#elsealle" statt "#else". Der Tippfehler traf nur den Zweig des 4,3-Zoll-Panels, das damit nicht mehr uebersetzbar war. Beide Panel-Varianten sind jetzt wieder gegengebaut. Version 1.6.12: - Die Abschaltfolge für die Bridge aus 1.6.11 ist zurückgenommen. Sie hat den Fehler nicht behoben, sondern verschlimmert: Nach dem Nullsetzen von C0/C2/AC kam das Panel auch direkt nach dem Flashen nicht mehr hoch, die normale Einschaltfolge holt es aus diesem Zustand nicht zurück. Der Start entspricht damit wieder 1.6.10. - Stattdessen zwei Diagnosen, um die Ursache des schwarzen Bildes nach einem Reset einzugrenzen: Der Startgrund wird beim Hochlauf ausgegeben (1 = Kaltstart, alles andere Warmstart), und das Anfordern der Stromversorgung für die MIPI-Strecke wird jetzt auf Fehler geprüft - bislang lief dieser Schritt als einziger ungeprüft durch. Version 1.6.10: - WS7_PARTIAL_REFRESH ist jetzt auch im Auslieferungsstand 1. Am Gerät geprüft: kein Flackern, und der Gewinn ist der größte der drei Tempo-Maßnahmen - vor allem während eines Bezugs, wo die Zeitanzeige zehnmal je Sekunde weiterläuft. - Der Hintergrund der Seiten ist deckend statt durchsichtig. Sichtbar ändert sich nichts, die Ebenen darunter haben dieselbe Farbe; LVGL muss sie beim Scrollen aber nicht mehr mitzeichnen und durchmischen. - Neuer Schalter WS7_PERF_MONITOR in pins_config.h: blendet unten rechts Bilder je Sekunde und Prozessorlast ein. Damit lässt sich beantworten, ob weitere Mühe beim Zeichnen überhaupt noch etwas bringt, statt ins Blaue zu optimieren. Version 1.6.9: - Fehlerbehebung: Ein Tipp auf einen Knopf löste oft mehrfach aus. Der GT9271 lässt gelegentlich einen Messzyklus aus oder liefert ein unplausibles Paket; der Hersteller-Treiber kann "gerade nichts Neues" nicht von "Finger weg" unterscheiden und meldet beides als losgelassen. Seit die Oberfläche mit 1.6.8 doppelt so oft abtastet, wurde daraus sichtbar Drücken-Loslassen-Drücken-Loslassen. - Vor den Treiber ist deshalb ein Filter gesetzt: Er verwirft unplausible Rohwerte und hält den letzten gültigen Berührpunkt noch WS7_TOUCH_HOLD_MS lang (Vorgabe 40 ms). Losgelassen wird erst gemeldet, wenn wirklich nichts mehr kommt. Der Wert steht in pins_config.h; 0 schaltet die Überbrückung ab. Zu groß gewählt verzögert er das Loslassen und dämpft den Schwung beim Wischen. - Der Filter hängt sich zur Laufzeit in den Treiber ein, die Herstellerdateien bleiben unverändert. Version 1.6.8: - Scrollen und Wischen laufen am Waveshare-Panel flüssiger: LVGL rechnet dort jetzt im 16-Millisekunden-Takt statt alle 33 ms. Dieser Wert steuert nicht nur die Bildrate, sondern auch, wie oft der Touch abgetastet und wie fein eine Animation gerechnet wird - mit 30 Schritten je Sekunde war vor allem das Ziehen mit dem Finger sichtbar ruckelig. Das Panel läuft mit 60 Hz, mehr als 16 ms bringt also nichts. - Kommt das Zeichnen einmal nicht hinterher, wird ein Bild später fertig; kaputt geht dabei nichts. Die JC-Panels bleiben bei 33 ms. Version 1.6.7: - Der Menue-Knopf oben links fängt Tipps jetzt auch knapp daneben ab. Mit 48x36 Pixeln war er auf dem 7-Zoll-Panel ein sehr kleines Ziel; gemessen wurde ein Fehlgriff von rund 10 Pixeln neben der Fläche, weshalb sich das Menü scheinbar nicht öffnen ließ. Optisch bleibt der Knopf unverändert, die Trefferfläche wächst um 20 Pixel nach allen Seiten. Sie wirkt nur innerhalb der Kopfleiste - dem Seiteninhalt darunter wird nichts genommen. - Die Touch-Zuordnung selbst war korrekt: Eine Messung mit WS7_TOUCH_DEBUG hat gezeigt, dass Achsen und Spiegelung stimmen. Version 1.6.6: - Neuer Schalter WS7_TOUCH_DEBUG in pins_config.h: Auf 1 gesetzt, gibt jeder Berührpunkt seine Rohwerte und die daraus errechnete Bildposition auf der seriellen Konsole aus. Gedacht zum Einmessen des Touch, wenn Bedienelemente nicht reagieren - insbesondere am oberen Bildrand, wo die 44 Pixel hohe Kopfleiste sitzt. Version 1.6.5: - Zwei der drei Tempo-Maßnahmen aus 1.6.4 haben sich am Gerät als untauglich erwiesen und stehen wieder auf ihrem alten Wert. Sie bleiben als Schalter erhalten, mit Notiz, woran sie gescheitert sind. * WS7_COLOR_BITS wieder 24: Die Bridge dieses Panels nimmt kein RGB565 an, mit 16 Bit kommt kein brauchbares Bild. * WS7_PARTIAL_REFRESH wieder 0: Der Menü-Vorhang ließ sich nicht mehr öffnen. Er ist halbtransparent und wird deshalb in den gerade aktiven Bildpuffer eingemischt; die nächste Zustandsmeldung der S3 zeichnet aber in den zweiten Puffer, der ihn nie bekommen hat - der Vorhang war also sofort wieder weg. Nutzbar wäre der Modus erst, wenn der LVGL-Port die geänderten Bereiche zwischen beiden Puffern abgleicht. - WS7_PARALLEL_RENDER bleibt eingeschaltet: LVGL zeichnet weiterhin mit zwei Threads auf beiden Prozessorkernen. Von den drei Maßnahmen trägt nur diese. Version 1.6.4: - Waveshare 7" (H): Drei Maßnahmen gegen die träge Bedienung am großen Panel. 1280x720 sind 2,4-mal so viele Pixel wie beim 4,3-Zöller, und bis 1.6.3 wurde bei jeder Änderung das komplette Bild in 24 Bit neu gezeichnet. * Farbtiefe RGB565 statt RGB888 (WS7_COLOR_BITS): halbiert die Datenmenge je Bild. Feinere Farbabstufungen entfallen, sichtbar allenfalls in den dunklen Verläufen der Rundanzeige - die JC-Panels laufen seit jeher so. * Nur geänderte Bildbereiche neu zeichnen statt des ganzen Bildes (WS7_PARTIAL_REFRESH, LVGL-Direct-Mode mit zwei Puffern). Eine sich ändernde Temperaturanzeige kostet damit ein paar tausend statt 921.600 Pixel. * LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen (WS7_PARALLEL_RENDER). - Jeder der drei Schalter steht in pins_config.h und lässt sich einzeln zurückstellen; die README nennt zu jedem, woran man erkennt, dass er zurück muss. Die JC-Panels sind von allen dreien nicht betroffen. - Nebeneffekt: Der Framebuffer-Bedarf sinkt von rund 8,3 MB auf 3,7 MB PSRAM. Version 1.6.3: - Waveshare ESP32-P4-Pico: UART zur Hauptplatine liegt jetzt auf TX = GPIO20 und RX = GPIO21 (vorher GPIO17/GPIO18). Die JC-Panels bleiben bei GPIO33/GPIO31. - Das Bild steht in der tatsächlichen Einbaulage richtig herum, die 180-Grad-Drehung aus 1.6.1 ist deshalb wieder abgeschaltet (WS7_ROTATE_180 = 0). Sie bleibt als Schalter erhalten, falls das Panel später anders montiert wird. - Der Touch war dagegen oben/unten spiegelverkehrt: Der Digitizer sitzt gegenüber dem Bild um die Hochachse gedreht. WS7_TOUCH_MIRROR_RAW_X steht dafür jetzt auf 1. Bild- und Touch-Ausrichtung sind damit zwei getrennte Schalter, weil sie an diesem Panel eben nicht zusammenfallen. Version 1.6.2: - Kommt das Panel nicht hoch, stürzt der P4 nicht mehr wortlos ab. Die Bringup-Schritte melden ihren Fehler jetzt im Klartext auf der seriellen Konsole (auch bei abgeschaltetem Core-Debug-Level), zusammen mit PSRAM-Größe, freiem PSRAM und dem tatsächlich benötigten Framebuffer-Bedarf. Vorher endete ein fehlgeschlagener Panel-Aufbau in einem Speicherauszug, aus dem die Ursache nicht hervorging. - Schlägt der Panel-Aufbau fehl, läuft die Firmware ohne Anzeige weiter, statt ein zweites Mal abzustürzen: UART-Verbindung und OTA bleiben offen, die S3 kann also neu flashen. Alle Oberflächenfunktionen prüfen dafür, ob das Dashboard überhaupt aufgebaut wurde. - Fehlerbehebung: Findet der Touch-Controller nicht statt, lieferte der Hersteller-Treiber einen bereits freigegebenen Zeiger zurück, der ungeprüft weiterverwendet wurde. Das Display läuft in diesem Fall jetzt einfach ohne Bedienung weiter. Version 1.6.1: - Waveshare 7" (H): Bild und Touch lassen sich um 180 Grad drehen, wenn das Panel auf dem Kopf eingebaut ist. Schalter WS7_ROTATE_180 in pins_config.h, Vorgabe ist gedreht. Die Drehung übernimmt der PPA-Grafikbeschleuniger des ESP32-P4 - die Software-Rotation des LVGL-Ports rechnet nur in RGB565 und wäre für dieses Panel unbrauchbar. - Der Touch dreht mit, sonst läge die Bedienung spiegelbildlich zum Bild. Version 1.6.0: - Neu: Dieselbe Firmware läuft jetzt auch auf einem Waveshare ESP32-P4-Pico mit dem Waveshare 7inch DSI LCD (H) (1280x720). Umgeschaltet wird über „JC_PANEL_TYPE" in config.h; WS_PANEL_7H ist ab dieser Version die Vorgabe, JC_PANEL_43 und JC_PANEL_70 bleiben unverändert verfügbar. - Das Waveshare-Panel hängt hinter einer Bridge, die ausschließlich RGB888 annimmt. LVGL rechnet für dieses Panel deshalb mit 24 statt 16 Bit Farbtiefe. lv_conf.h liest dazu JC_PANEL_TYPE aus config.h, damit Sketch und LVGL-Bibliothek garantiert dieselbe Farbtiefe benutzen; display_hal.cpp bricht den Build ab, falls sie auseinanderlaufen. Der Panelwechsel muss aus diesem Grund in config.h erfolgen und nicht per Compiler-Flag. - Bringup ohne Hersteller-Panel-Treiber: DSI-Bus, Kommandokanal und DPI-Panel werden direkt angelegt. Entscheidend ist die Legacy-Referenztaktquelle PLL_F20M - mit der Standardquelle bleibt der Bildschirm auf ESP32-P4 Rev. 1.3 / ECO2 schwarz. Die Zeitbasis (2 Lanes zu 1250 Mbit/s, 80 MHz DPI-Takt, Austastlücken 64/64/64, rund 60 Hz) steht als WS7_*-Werte in pins_config.h und ist dort anpassbar, falls das Bild reißt. - Panel-Freigabe und Helligkeit laufen beim Waveshare nicht über einen PWM-Pin, sondern über Register der Bridge auf I2C-Adresse 0x45. Die Hintergrundbeleuchtung wird bewusst erst eingeschaltet, wenn die DSI-Ausgabe steht - sonst blitzt beim Start Bildrauschen auf. Standby-Abdunklung und „Uhrzeit im Standby" funktionieren wie bei den JC-Panels. - Touch: Der GT9271 des Waveshare-Panels benutzt dieselbe Registerbelegung wie der GT911, liegt aber auf I2C-Adresse 0x14 und meldet im Hochformat. X und Y werden deshalb getauscht und auf die Bildfläche begrenzt; Ausreißer des Controllers landen nicht mehr als Klick am Bildrand. Sollte die Bedienung spiegelverkehrt reagieren, lässt sich das mit WS7_TOUCH_MIRROR_RAW_X / _Y in pins_config.h umdrehen. - Der Framebuffer wächst auf 3 x 2,8 MB (rund 8,3 MB PSRAM). Auf dem P4-Pico mit 32 MB PSRAM ist das unkritisch. - Die UART-Pins zur Hauptplatine sind für das Waveshare-Board getrennt eingestellt, weil dessen 40-poliger Header eine andere Belegung hat als die JC-Panels: TX = GPIO17, RX = GPIO18 (JC-Panels unverändert TX = GPIO33, RX = GPIO31). Version 1.5.0: - Neu: Dieselbe Firmware unterstützt jetzt auch das 7-Zoll-Display Guition JC1060P470C-I-W (JD9165, 1024x600) zusätzlich zum bisherigen 4,3-Zöller JC4880P443C-I-W (ST7701, 480x800). Umgeschaltet wird über „JC_PANEL_TYPE" in config.h (JC_PANEL_43 / JC_PANEL_70) oder per Compiler-Flag -DJC_PANEL_TYPE=70. Vorgabe bleibt das 4,3-Zoll-Panel, dessen Verhalten sich nicht ändert. - Panel-Treiber esp_lcd_jd9165.c/.h aus dem Hersteller-Paket übernommen; board_bringup.c legt je nach Panel den passenden DSI-Bus, die DPI-Zeitbasis und den Herstellertreiber an. - pins_config.h liefert Auflösung, LCD-Reset-Pin (4,3": GPIO5, 7,0": GPIO27) und Ausrichtung panelabhängig. Das 7-Zoll-Panel ist nativ Querformat, deshalb entfällt dort die 270-Grad- Rotation samt PPA-Beschleunigung. - Der GT911 des 7-Zöllers meldet Rohkoordinaten im Raster 800x480 statt 1024x600. Die Umrechnung hängt am process_coordinates-Hook von esp_lcd_touch, damit die Herstellerdatei esp_lcd_touch_gt911.c unverändert bleibt. Ohne sie wäre nur der linke obere Bildteil bedienbar. - Die Oberfläche rechnet nicht mehr mit fest verdrahteten 480 Pixeln Höhe, sondern mit DISP_VER_RES. Layout und Schriften bleiben sonst unverändert: Das Dashboard arbeitet fast durchgehend mit Prozentmaßen, und die feineren Pixelabstände des 7-Zöllers (170 statt 213 dpi) lassen dieselben Schriftgrößen physisch größer erscheinen. - Die UART-Verkabelung ist bei beiden Panels gleich (P4 GPIO33 = TX, GPIO31 = RX). Beim 7-Zöller liegen diese Pins allerdings auf der FPC-Buchse FPC4 (1,0 mm, 16-polig) statt auf einer Stiftleiste - dort wird ein Adapterkabel gebraucht. Version 1.4.2: - Bug-Fix: Beim Aufwecken über Antippen erschien die Auswahl „Espresso oder Cold Extraction" manchmal nicht. Der Dialog entschied nach einer anderen Bedingung, ob er die Auswahl ANZEIGT (verlangte zusätzlich cxArmable), als er beim Absenden benutzte, um die Rückfrage der S3 zu UNTERDRÜCKEN. In der Lücke dazwischen zeigte er nur „Aufwecken", sendete aber „wakeEspresso" - und damit war die Frage auch auf der S3 erledigt. Beide Stellen benutzen jetzt dieselbe Funktion wake_choice_offered(). - Hat der Dialog die Auswahl nicht angeboten, sendet er wieder „deactivateStandby". Dann öffnet die S3 ihr eigenes Auswahlfenster, und die Frage kommt trotzdem - derselbe Weg wie beim Aufwecken über den Schalter. Die Auswahl kann damit nicht mehr ersatzlos entfallen. Version 1.4.1: - Passend zu S3 5.6.2: Die Auswahl beim Aufwecken erscheint auch dann, wenn der Cold-Extraction-Modus bereits aktiv ist - sie geht in beide Richtungen. „Espresso" schaltet den Modus dann ab. - Der Cold-Extraction-Knopf zeigt den Ist-Zustand: Bei aktivem Modus ist er hervorgehoben und heißt „Cold Extraction (aktiv lassen)", sonst „Cold Extraction (Wasser bleibt kalt)". Version 1.4.0: - Die Auswahl „Espresso oder Cold Extraction" erscheint jetzt auch beim Aufwecken über den Schalter (braucht S3-Firmware ab 5.6.0). Meldet die S3 ein offenes Auswahlfenster (cxWakeChoice), blendet das Display den Dialog von sich aus ein - ohne Antippen - und zeigt die verbleibende Bedenkzeit als Countdown. „Abbrechen" entfällt in diesem Fall, weil es nichts abzubrechen gibt: Läuft die Zeit ab, heizt die Maschine normal auf. - Der Espresso-Knopf sendet „wakeEspresso" statt „deactivateStandby", sobald die Auswahl relevant ist. Damit wird die Entscheidung auf der S3 vermerkt und nicht direkt danach erneut gefragt. - Der Cold-Extraction-Knopf beendet den Standby nur noch, wenn er überhaupt aktiv ist - im Auswahlfenster nach dem Aufwecken schaltet er nur den Modus. Version 1.3.0: - Der Aufweck-Dialog wird zur Auswahl: „Womit aufwecken?" mit den Knöpfen „Espresso" (heizt normal auf) und „Cold Extraction (Wasser bleibt kalt)". Braucht S3-Firmware ab 5.5.0. Bei „Cold Extraction" wird erst der Modus scharf geschaltet und dann der Standby beendet, damit der Wasserkreis nicht zwischendurch anheizt. - Steuerbar über die neue Einstellung „Beim Aufwecken fragen" (Cold-Extraction-Seite, Abschnitt Grundeinstellung; identisch zur Web-UI). Ist sie aus, erscheint wieder der bisherige Dialog mit „Aufwecken" und „Abbrechen" - der Zwischenschritt entfällt dann komplett. Version 1.2.1: - Bug-Fix: Während einer kalten Extraktion zeigten Waage-Kachel und Live-Bezugsschirm das Zielgewicht des normalen Espresso-Bezugs (bbwTarget) statt des Ziels der kalten Extraktion (cxTarget). Außerdem erschienen Gewichtsanzeige und Fortschrittsbalken nur, wenn Brew-by-Weight aktiv war - bei kalter Extraktion ist das typischerweise aus, obwohl ein Ziel existiert. Beide Anzeigen nutzen jetzt cxTarget, sobald cxShot gesetzt ist. Version 1.2.0: - Neue Seite „Cold Extraction" mit eigenem Menüeintrag (braucht S3-Firmware ab 5.4.0). Dort stehen jetzt alle Parameter der kalten Extraktion und lassen sich direkt am Display ändern: Freigabetemperatur, Vorbenetzung (Dauer + Pumpenleistung), Hauptbezug (Pulsperiode + Pumpenleistung), Zielgewicht, maximale Bezugsdauer sowie der Pumpenschutz. Gespeichert wird über das erweiterte saveBrew-Kommando. - Der Modus-Schalter ist von der Temperatur-Seite auf die neue Seite umgezogen (eine Stelle statt zwei). Der Knopf „Aufwecken mit Cold Extraction" im Standby-Dialog bleibt unverändert. - Brew-Control-Seite neu gegliedert: Statt einer durchlaufenden Liste unter Zwischenüberschriften liegt jede Funktion (Pre-Infusion, Brew-by-Time, Brew-by-Weight, Dampf-Timer) jetzt in einer eigenen Karte mit Titel und einer Zeile, die erklärt, was sie tut. Die neue Cold-Extraction-Seite nutzt dieselbe Gliederung. - Eingabefelder werden nur beim Öffnen der Seite aus dem Zustand gefüllt, damit laufende State-Pushes eine begonnene Eingabe nicht überschreiben (gleiches Verhalten wie auf der Brew-Control-Seite). Version 1.1.3: - Aufweck-Dialog hat einen dritten Knopf: „Aufwecken mit Cold Extraction" (braucht S3 ab 5.3.5). Er stellt den Modus scharf und beendet erst danach den Standby - in dieser Reihenfolge, damit der Wasserkreis gar nicht erst anheizt. Ohne diesen Weg musste man normal aufwecken (Maschine heizt an) und den Modus danach umschalten. Der Knopf erscheint nur, wenn die Funktion freigeschaltet und umschaltbar ist und der Modus nicht ohnehin schon läuft. - Der Schalter „Cold Extraction" auf der Temperatur-Seite hängt jetzt am neuen State-Feld cxArmable statt an cxAllowed: umschaltbar auch im Standby und bei warmem Kessel, gesperrt nur während eines laufenden kalten Bezugs. Bei älterer S3-Firmware fällt das Feld auf cxEnabled zurück, der Schalter bleibt also bedienbar. - Erklärzeile im Standby: „Nach dem Aufwecken bleibt der Wasserkreis aus." Version 1.1.2: - Cold Extraction: Fehlt eine nutzbare Waage, weist das Display jetzt dauerhaft darauf hin. Ohne Waage greifen weder Zielgewicht noch Stillstands-Erkennung, der Bezug endet erst nach der maximalen Bezugsdauer (braucht S3-Firmware ab 5.3.4). - Statuszeile: „Cold Extraction aktiv - ohne Waage, Ende nach Zeit" (gelb) statt des blauen Normalhinweises; beim Aktivieren zusätzlich kurz die Meldung zum neuen cxNotice-Code 4. - Erklärzeile unter dem Schalter und die Parameter-Anzeige auf der Brew-Seite ergänzen den Hinweis; bei aktivem Modus ohne Waage nennt die Zeile die Zeit statt des Zielgewichts. Version 1.1.1: - Compiler-Warnungen des P4-Builds aufgeräumt (rein technisch, keine Funktionsänderung): - „LV_FS_DEFAULT_DRIVE_LETTER is deprecated": Die Option heißt ab LVGL 9.3 LV_FS_DEFAULT_DRIVER_LETTER. Der alte Name funktionierte zwar noch, löste aber in lv_api_map_v9_1.h ein #warning aus - und zwar in JEDER Übersetzungseinheit, die lvgl.h einbindet. Das allein waren rund 60 Warnungen pro Build, die alles andere zugedeckt haben. In lv_conf.h umbenannt. - „bitwise operation between different enumeration types is deprecated": LV_PART_* und LV_STATE_* sind in LVGL 9 zwei verschiedene Enum-Typen; sie direkt mit | zu verknüpfen ist in C++20 abgekündigt. Neues Makro TH_SEL(part, state) in theme.h castet beide auf lv_style_selector_t (ohnehin uint32_t). Betraf 5 Stellen in ui.cpp und theme.h. - Bug-Fix: Der Puffer für die Cold-Extraction-Infozeile auf der Brew-Seite war mit 192 Bytes zu klein - der Text ist rund 205 Zeichen lang (das „°" zählt als zwei Bytes), die letzte Zeile wurde also abgeschnitten. Jetzt 256 Bytes. Version 1.1.0: - Cold Extraction am Display bedienbar (braucht S3-Firmware ab 5.3.2): - Neuer Schalter „Cold Extraction" auf der Seite „Temperaturen" unter „Modi", darunter eine Erklärzeile mit dem aktuellen Zustand bzw. dem Sperrgrund. Schalter und Zeile bleiben unsichtbar, solange die S3 die Funktion nicht freigeschaltet meldet (auch bei älterer S3-Firmware, die die Felder gar nicht sendet). - Einschalten ist nur bei erteilter Freigabe möglich (Wasserkessel kalt genug, kein Standby / Wartung / Tuning); ausschalten immer, außer während eines laufenden kalten Bezugs. Gesendet wird gezielt startColdExtraction/stopColdExtraction statt eines Toggles, damit ein abgewiesener Befehl den Schalter nicht in einen nie bestätigten Zustand bringt. - Statuszeile: eigener Slot direkt hinter der Sicherheitsmeldung. Zeigt dauerhaft „Cold Extraction aktiv - Wasserkreis heizt nicht", bei fehlender Freigabe den Grund, während der Pumpen-Zwangspause den Pumpenschutz und transient einen abgewiesenen Start bzw. einen Abbruch wegen fehlenden Zulaufs. - Wasser-Kachel im Dashboard zeigt bei aktivem Modus „Cold Extraction - Heizen aus" statt eines Sollwerts, der nicht erreicht wird; der Aufheiz-Countdown ist dann unterdrückt. - Phasenleiste und Live-Bezugsschirm benennen die erste Phase eines kalten Bezugs „Vorbenetzung" (keine Pause-Phase) und zeigen die Pumpenpause an. - Brew-Seite: Cold-Extraction-Parameter als Anzeige (Freigabeschwelle, Vorbenetzung, Zielgewicht, Timeout) mit Hinweis, dass sie in der Web-UI eingestellt werden. - Statistik-Seite: kalte Bezüge sind mit „(kalt)" markiert und gehen nicht in die mittlere Bezugsdauer ein - gleiche Regel wie in der S3-Statistik. - Bug-Fix: Das Limit für eingehende UART-Zeilen (PROTO_RX_LINE_MAX) lag bei 2048 Bytes, während die State-Zeile der S3 bereits rund 2,1 KB erreicht - mit langem Status-, Profil- oder SSID-Text konnte sie darüber liegen. In dem Fall wurde die GANZE Zeile verworfen und das Display fror auf dem letzten Stand ein, ohne dass die Verbindung als tot erkannt wurde. Das Limit ist jetzt 4096 Bytes; der RX-Puffer selbst bleibt bei 2 KB reserviert, weil der interne RAM knapp ist und eine Arduino-String nicht ins PSRAM alloziert werden kann. Version 1.0.13: - Profil-Schnellwahl + Anzeige des aktiven Profils (braucht S3-Firmware ab 5.1.1): - Neuer Profil-Chip im Header (auf allen Seiten sichtbar): zeigt das zuletzt geladene bzw. gespeicherte Profil; ein „*" hinter dem Namen bedeutet, dass seitdem profil-relevante Einstellungen geändert wurden. Lange Namen werden gekürzt; ohne bekanntes Profil (oder mit älterer S3-Firmware) bleibt der Chip unsichtbar. - Antippen des Chips öffnet die Profil-Schnellwahl: ein Overlay mit allen gespeicherten Profilen, das aktive mit Häkchen und Akzentfarbe hervorgehoben. Ein Tap lädt das Profil direkt (Toast bestätigt, Chip aktualisiert sich mit dem nächsten State) — zwei Berührungen vom Dashboard zum Profilwechsel statt Umweg über die Profile-Seite. - Profile-Seite: das aktive Profil wird in der Liste mit Häkchen-Symbol und Akzentfarbe markiert. Version 1.0.12: - Verlauf-Chart: Flackernde Heizleistungs-Kurven in den großen Zeitfenstern behoben. Die Dezimierung pickte pro Chart-Punkt ein Einzelsample, dessen Abtast-Raster mit jedem Sekundentick um eine Position wanderte — die schnell schaltende Heizleistung (PWM) sprang dadurch sichtbar zwischen zwei Kurvenbildern hin und her. Jetzt wird über den gesamten Zeitabschnitt eines Chart-Punkts gemittelt: das Bild steht ruhig, und die Leistungs-Kurve zeigt die tatsächliche mittlere Heizleistung statt zufälliger Momentwerte. Im 2-min-Fenster (1 Sample je Punkt) ändert sich nichts. Version 1.0.11: - Verlauf-Seite ausgebaut (nur P4, keine S3-/Protokolländerung nötig): - Umschaltbares Zeitfenster: Buttons „2 min / 10 min / 30 min / 60 min" in der Kopfzeile. Intern läuft eine 1-s-Historie als Ringpuffer über volle 60 Minuten; das Chart zeigt weiterhin 120 Punkte und dezimiert je Fenster. Dadurch ist beim Fensterwechsel der komplette Verlauf sofort da (kein leeres Chart, kein Neuaufbau). Die Wahl wird P4-lokal im NVS gespeichert und überlebt Neustarts. - Gestrichelte Soll-Linien für Wasser und Dampf im Chart (Farbe der jeweiligen Kurve, gedimmt). Die Y-Skala bezieht die Soll-Werte mit ein, damit die Linien im Bild liegen — aber nur für Kreise, deren Ist-Kurve im Fenster sichtbar ist (ein kalter Dampfkessel zieht die Skala nicht auseinander). - Heizleistung zuschaltbar: Button „Leistung" blendet Duty-Cycle Wasser/Dampf als gedimmte Zusatzkurven auf einer zweiten Achse (0–100 %) ein, inkl. Live-Legende. Einstellung ebenfalls P4-lokal im NVS. - Feinere Kurven: Die Temperatur-Historie wird jetzt in Zehntelgrad geführt und gezeichnet (vorher ganzzahlig gerundet) — PID-Schwingungen um ±1 °C sind damit sauber ablesbar. - Die ~29 KB Historie liegen im PSRAM (heap_caps_malloc, wie die LVGL-Framebuffer) — als statische Arrays sprengten sie den internen RAM (Linker: 107 % belegt). - Shot-Zusammenfassung: Karte auf 560 px verbreitert und Spaltenabstand zwischen Dauer/Gewicht/Flow deutlich vergrößert (28 px statt 10 px) — die drei Werte standen zu nahe beisammen und waren schlecht lesbar. - PID-AutoTune sichtbar gemacht: Während eines Tuning-Laufs erscheint auf der Verlauf-Seite eine Live-Karte (mit Spinner) — je Kreis Laufzeit, aktuelle Phase (heizt/kühlt ab) und Schwingungshub samt Mittelpunkt (Min/Max der Ist-Temperatur seit Start). Nach dem Ende zeigt die Karte ~30 s das Ergebnis (Erfolg/Abbruch samt Grund, farbcodiert). Die PID-Tuning-Meldung in der Statuszeile ist jetzt antippbar und springt zur Verlauf-Seite, wo die Schwingung auch als Kurve zu sehen ist. Version 1.0.10: - Live-Bezugsschirm (abschaltbar): Beim Start eines echten Bezugs blendet sich ein Vollbild-Overlay weich ein — große Bezugszeit, Live-Gewicht und Flow samt Flow-Verlaufskurve der letzten 30 Sekunden (nur bei verbundener Waage), Fortschrittsbalken Richtung Zielgewicht (Brew-by-Weight) bzw. Zielzeit (Brew-by-Time) und Pre-Infusion-Phasenhinweis mit Restzeit. Über das X oben rechts für den laufenden Bezug schließbar; beim nächsten Bezug erscheint er wieder. Ein/Aus-Schalter auf der Info-Seite unter „Darstellung", die Einstellung wird P4-lokal im NVS gespeichert und überlebt Neustarts. Während Flush und Reinigungsassistent erscheint das Overlay bewusst nicht. - Shot-Zusammenfassung aufgewertet: Die Karte nach Bezugsende blendet jetzt weich ein/aus (Fade), wirft einen Schlagschatten und zeigt Dauer, Endgewicht und mittleren Flow als große Werte mit gedimmter Beschriftung statt reiner Textzeilen (Gewicht/Flow nur bei aktiver Waage). - Pre-Infusion-Phasenanzeige auf dem Dashboard: Während eines Bezugs mit aktiver Pre-Infusion zeigt eine Schrittleiste die Phasen „Pre-Infusion → Pause → Extraktion" an — erledigte Schritte mit Haken, die aktive Phase hervorgehoben (Gold) inkl. Restzeit-Countdown (100-ms-Takt). Die aktive Phase kommt quelltreu von der S3 (neues State-Feld "piState", ab S3-Firmware 5.0.12); bei älterer S3-Firmware wird sie zeitbasiert aus den konfigurierten Phasendauern abgeleitet. Ist keine Pause konfiguriert (0 s), wird der Pause-Schritt ausgeblendet. - Temperatur-Seite: Solltemperaturen für Wasser und Dampf werden jetzt über radiale Drehregler (Arc, 270°) mit großem Wert mittig und −/+-Feinjustage eingestellt. Gesendet wird entprellt (nach kurzer Bedienpause bzw. sofort beim Loslassen des Reglers oder Verlassen der Seite), damit Drag-Gesten die S3 nicht mit setTemp-Kommandos und EEPROM-Schreibzugriffen fluten. Tippen in die Reglermitte löst bewusst keinen Wertsprung aus (ADV_HITTEST: nur Ring/Griff reagieren). - Dashboard-Feinschliff (nur P4, keine S3-/Protokolländerung nötig): - Weiche Temperatur-Zustandsfarben: Der große Ist-Wert färbt sich stufenlos über den Abstand zum Soll (kontinuierliche Farbinterpolation statt harter Stufen) — Blau beim Aufheizen, Gold kurz vor dem Ziel, Grün im Zielband (±0,5 °C), Richtung Warngelb bei deutlichem Überschwinger. Dazu neue „BEREIT"-Pille im Header (auf allen Seiten sichtbar), wenn der Wasserkessel — und der Dampfkessel, sofern er heizt — im Zielband liegt, kein Fehler/ Standby/Eco aktiv ist und kein Aufheiz-Countdown läuft; mit Hysterese gegen Flackern an der Bandgrenze, erscheint und verschwindet weich (Fade). - Umschaltbares Temperatur-Design: Die Dashboard-Temperaturanzeige gibt es jetzt in fünf Varianten — „Klassisch" (bisherige Karten mit Prozentbalken), „Instrumente" (freistehende Rundinstrumente im Manometer-Look: Metall-Bezel mit Verlauf und Schlagschatten für eine leichte 3D-Wirkung, 270°-Bogen füllt sich in der Zustandsfarbe, Soll-Wert in der Bogen-Lücke), „Minimal" (komplett rahmenlos, nur große Werte mit dünner Ist/Soll-Linie), „Soft-3D" (Neumorph: Fläche fast im Hintergrundton wirkt herausgedrückt — dunkler Schatten unten rechts, heller Lichtschein oben links, eingelassener Balken) und „Thermometer" (vertikale Säulen, die sich von unten in der Zustandsfarbe füllen, mit Glanzstreifen als Glas-Effekt und rundem Kolben unten). Außer bei „Klassisch" folgt auch die Füllfarbe von Balken/Bogen/Säule stufenlos der Zustandsfarbe des Ist-Werts. Umschalter auf der Info-Seite unter „Darstellung"; die Wahl wird P4-lokal im NVS gespeichert und überlebt Neustarts. Standard: Instrumente. - Konsolidierte Statuszeile: Die sechs gestapelten Dashboard-Banner (Sicherheit, Dampf, Reinigung, PID-Tuning, Wartung, Aufheiz-Countdown) teilen sich jetzt EINE feste einzeilige Meldung — mehrere aktive Hinweise rotieren alle 4 s weich durch (Fade) statt das Layout zu verschieben, Priorität Rot > Gelb > Blau. Wartungs- und Reinigungsmeldung bleiben antippbar (Serviceseite bzw. Reinigungs-Sub-Screen), Überlängen laufen als Laufschrift durch. Version 1.0.9: - Weiche Übergänge (dezente Fade-Animationen) hinzugefügt: - Start-Animation: Boot-Splash mit Logo, Untertitel, Lade-Spinner ("Verbinde mit Maschine...") und Firmware-Stand; blendet sich beim Start weich ein und beim ersten State von der S3 (Verbindung steht) wieder aus. - Einschlaf-Animation: Die Standby-Uhr wird beim Wechsel in den Standby weich eingeblendet. - Aufweck-Animation: Beim Aufwecken blendet das Standby-Overlay weich aus und gibt das Dashboard frei. - Umsetzung speicher-neutral über das 'opa'-Style (kein opa_layered/Vollbild-Puffer), um den LVGL-Speicherpool nicht zu belasten. Bei ausgeschalteter Standby-Uhr (Display aus) gibt es weiterhin keine Einschlaf-Animation (schwarzer Bildschirm bietet keine Anzeigefläche). Version 1.0.8: - Statistik-Seite hinzugefügt Version 1.0.7: - Brew-by-Weight-Gewichtseingabelimit auf 150g erhöht, um auch Heißwasserbzug für Americano oder ähnliches via BBW zu ermöglichen Version 1.0.6: - Boot-Loop-Schutz implementiert: P4-Boot-Loop-Schutz + „Update-Modus", der den UART-OTA offenhält. Wenn die P4-Firmware in eine Absturzschleife läuft, erkennt sie das (RTC-Zähler wie beim S3) und startet in einen abgespeckten Modus, der bewusst das riskanteste überspringt — vor allem die Display-/LVGL-Init (der wahrscheinlichste P4-Absturzgrund, siehe unser LVGL-Mem-Pool-Thema) — und nur den UART-Empfang + OTA-Receiver laufen lässt. Dann kann der S3 die P4-Firmware jederzeit per UART neu flashen, auch wenn die normale P4-Oberfläche kaputt ist. (Optional: eine ganz simple statische „Update-Modus"-Bildschirmmeldung, falls das Panel-Bringup als sicher genug gilt.)