Files
Dual-PID/JC_Display_Firmware/README.md
T
raw-designsandClaude Opus 5 92c1446824 feat(P4): 7-Zoll-Display JC1060P470C-I-W unterstützen (1.5.0)
Dieselbe Display-Firmware bedient jetzt wahlweise das bisherige 4,3-Zoll-Panel
JC4880P443C-I-W (ST7701, 480x800) oder das neue 7-Zoll-Panel JC1060P470C-I-W
(JD9165, 1024x600). 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 ändert sich nicht.

- src/lcd/esp_lcd_jd9165.c/.h aus dem Hersteller-Paket übernommen;
  board_bringup.c legt je nach Panel DSI-Bus, DPI-Zeitbasis und Herstellertreiber an.
- pins_config.h liefert Auflösung, LCD-Reset (4,3": GPIO5, 7,0": GPIO27) und
  Ausrichtung panelabhängig. Das 7-Zoll-Panel ist nativ Querformat, deshalb
  entfallen dort die 270-Grad-Rotation und die PPA-Beschleunigung.
- lvgl_port_v9.h bezieht LVGL_PORT_H/V_RES aus pins_config.h statt fest 480/800.
- 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.
- ui.cpp rechnet nicht mehr mit fest verdrahteten 480 Pixeln Höhe, sondern mit
  DISP_VER_RES. Layout und Schriften bleiben sonst unverändert.
- Hersteller-Paket des 7-Zöllers unter JC_Display_Firmware_7zoll/ abgelegt;
  Werkzeuge, Archive und mitgelieferte Fremdbibliotheken per .gitignore
  ausgeschlossen (587 MB im Original, 21 MB im Repo).

Kompiliertest ESP32-P4, beide Varianten:
  4,3": 1.173.768 B Flash (37 %), 322.880 B RAM (98 %)
  7,0": 1.138.752 B Flash (36 %), 322.600 B RAM (98 %)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 02:35:40 +02:00

167 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JC-Touch-Display-Firmware (ESP32-P4)
Client-Firmware für die Guition-Smart-Displays **JC4880P443C-I-W (4,3")** und
**JC1060P470C-I-W (7,0")**, die als UART-Touch-Bedienung für die
Dual-PID-Siebträgersteuerung dienen. Beide Panels teilen sich denselben Sketch; das
Zielpanel wird über **`JC_PANEL_TYPE`** in [`config.h`](config.h) gewählt.
Die **Hauptplatine (ESP32-S3, `Dual_PID_FastHeatUp.ino`)** bleibt die Steuerzentrale
inkl. WLAN/Webinterface. Dieses Display ist ein **reiner UART-Client**: es empfängt den
Zustand und sendet Bedienkommandos. Protokoll: siehe
[`../Doku/JC-Display_UART-Protokoll.md`](../Doku/JC-Display_UART-Protokoll.md).
## Panel-Auswahl
In [`config.h`](config.h):
```c
#define JC_PANEL_TYPE JC_PANEL_43 // 4,3" JC4880P443C-I-W (Vorgabe)
#define JC_PANEL_TYPE JC_PANEL_70 // 7,0" JC1060P470C-I-W
```
Alternativ ohne Quelltextänderung per Compiler-Flag `-DJC_PANEL_TYPE=70`. Der Schalter
steuert Panel-Treiber, Auflösung, Rotation, LCD-Reset-Pin und die Touch-Skalierung; UI,
Protokoll und Pinbelegung des UART bleiben identisch.
## Hardware
Vendor-Pakete: 4,3" im Ordner `JC4880P443C_I_W/`, 7,0" im Repo-Ordner
`../JC_Display_Firmware_7zoll/`.
| Komponente | 4,3" JC4880P443C-I-W | 7,0" JC1060P470C-I-W |
|---|---|---|
| Haupt-MCU (UI) | ESP32-P4 | ESP32-P4 |
| WLAN/BT (hier ungenutzt) | ESP32-C6 | ESP32-C6 |
| Display | ST7701, 480×800 IPS, MIPI-DSI | JD9165, 1024×600 IPS, MIPI-DSI |
| LVGL-Ausrichtung | Rotation **270°** (PPA) → 800×480 | **keine** Rotation, nativ 1024×600 |
| Touch | GT911, I²C SDA=GPIO7 / SCL=GPIO8 | GT911, I²C SDA=GPIO7 / SCL=GPIO8 |
| Touch-Rohkoordinaten | 480×800 (= Panelraster) | **800×480** → wird auf 1024×600 skaliert |
| LCD-Reset | GPIO5 | **GPIO27** |
| Backlight | GPIO23 (LEDC-PWM) | GPIO23 (LEDC-PWM) |
| Framebuffer (3×, RGB565) | 3 × 750 KB ≈ 2,3 MB PSRAM | 3 × 1,2 MB ≈ 3,6 MB PSRAM |
| Freie Expansion-IO | Stiftleiste **JP1**: GPIO 52/51/50/49/35/34/33/32/31/30/29/28 | FPC 1,0 mm 16-pol. **FPC4**: GPIO 34/33/32/31/30/29/28 · **FPC3**: 48/47/46/45/5/4/3/2 |
> Beim 7-Zöller ist die Expansion-IO **kein Stiftleisten-Header**, sondern eine
> FPC-Buchse (1,0 mm Raster, 16-polig) — für die UART-Verdrahtung wird ein
> FPC-Breakout/Adapterkabel gebraucht. Schaltplan: `../JC_Display_Firmware_7zoll/5-Schematic/4_CONN.png`.
## Verkabelung zur Hauptplatine (UART, gekreuzt)
Für **beide** Panels dieselben P4-Pins (4,3": Header JP1, Schaltplan
`JC4880P443C_I_W/5-Schematic/4_USB&IO.png` · 7,0": FPC-Buchse FPC4):
```
S3 GPIO43 (TX) ----> P4 GPIO31 (RX) (DISPLAY_UART_RX_PIN)
S3 GPIO44 (RX) <---- P4 GPIO33 (TX) (DISPLAY_UART_TX_PIN)
S3 GND ------ P4 GND
```
> Die rechte JP1-Spalte (`C6_U01TXD`/`C6_I10RXD`/…) gehört zum **ESP32-C6** — nicht
> verwenden. 3,3-V-Logik beidseitig → keine Pegelwandlung nötig.
## Projektstruktur (eigener Code)
| Datei | Zweck |
|---|---|
| `JC_Display_Firmware.ino` | setup()/loop(), verdrahtet die Module |
| `config.h` | Pins, UART, Protokoll-Parameter |
| `machine_state.h` | Spiegel des `state`-Objekts der S3 |
| `protocol_client.h/.cpp` | UART-Protokoll: hello/state/ack/profiles/… + Heartbeat |
| `ui.h/.cpp` | LVGL-Dashboard (hardwareunabhängig) |
| `display_hal.h/.cpp` | LVGL-/UI-Verdrahtung + Lock-Wrapper |
| `board_bringup.c` | esp_lcd-Hardware-Bringup (C; nur bei `JC_USE_REAL_PANEL=1`) |
## Abhängigkeiten
- **Arduino-ESP32** ≥ 3.1 (mit ESP32-P4-Support), Board: *ESP32P4 Dev Module*,
**PSRAM aktiviert**.
- **LVGL** 9.x + `lv_conf.h`. Tipp: die `lv_conf.h` aus dem Vendor-Beispiel
(`JC4880P443C_I_W/1-Demo/arduino_examples/lvgl_v9_sw_rotation/lv_conf.h`) übernehmen
und `LV_FONT_MONTSERRAT_40` aktivieren (große Temperaturanzeige).
- **ArduinoJson** 7.x.
## Zwei Betriebsmodi (`JC_USE_REAL_PANEL` in `display_hal.h`)
### `0` = Stub-Modus (Standard)
Kompiliert **ohne** Display-Treiber (eigenes Minimal-LVGL, rendert ins Leere). Ideal, um
**Protokoll/UART/Logik** am Schreibtisch zu testen (Debug über USB-CDC `Serial`). Läuft auf
jedem ESP32 mit LVGL+ArduinoJson.
### `1` = echte Hardware (Hersteller-BSP)
`display_hal.cpp` baut auf der **erprobten Hersteller-Portierung** auf. Dazu folgende
Dateien aus `JC4880P443C_I_W/1-Demo/arduino_examples/lvgl_v9_sw_rotation/` **in diesen
Sketch-Ordner kopieren**:
```
pins_config.h
lvgl_port_v9.h
lvgl_port_v9.c
src/lcd/ (esp_lcd_st7701*.c/.h + st7701_lcd.* sowie esp_lcd_jd9165.c/.h)
src/touch/ (komplett: esp_lcd_touch*.c/.h, gt911_touch.*)
```
Diese Dateien liegen bereits im Sketch. `esp_lcd_jd9165.*` stammt aus dem
7-Zoll-Vendor-Paket
(`../JC_Display_Firmware_7zoll/1-Demo/Demo_Arduino/1_2_Lvgl_V9/.../src/lcd/`); je nach
`JC_PANEL_TYPE` wird nur einer der beiden Panel-Treiber eingebunden.
Der Init-Ablauf (MIPI-DSI-PHY-LDO, ST7701 bzw. JD9165, GT911, LEDC-Backlight,
`lvgl_port_init`) ist 1:1 aus dem Vendor-Beispiel `lvgl_sw_rotation.c` übernommen — nur
der Demo-Aufruf (`lv_demo_widgets()`) wurde durch `ui_init()` ersetzt.
Die Touch-Skalierung des 7-Zöllers hängt in `board_bringup.c` am
`process_coordinates`-Hook von `esp_lcd_touch`, damit die Vendor-Datei
`esp_lcd_touch_gt911.c` unverändert bleibt (im Vendor-Demo ist die Umrechnung direkt in
den Treiber gepatcht).
**Wichtig:** Im realen Modus läuft LVGL in einem **eigenen FreeRTOS-Task**. UI-Zugriffe aus
der Arduino-`loop()` (z. B. `ui_update` bei jedem state-Push) sind daher in
`hal_lock()/hal_unlock()` (= `lvgl_port_lock/unlock`) gekapselt — ist in der `.ino`
bereits umgesetzt.
### Ausrichtung
Das Dashboard ist **Querformat**. Beim 4,3-Zöller (physisch 480×800) wird das per
LVGL-Rotation **270°** mit PPA-Beschleunigung erreicht → 800×480. Der 7-Zöller ist nativ
1024×600, dort steht die Rotation auf **0** und PPA ist abgeschaltet. Beides setzt
`pins_config.h` automatisch anhand von `JC_PANEL_TYPE`.
Das Layout arbeitet fast durchgehend mit `LV_PCT`/`LV_SIZE_CONTENT` und skaliert
deshalb mit. Feste Pixelmaße (Rundinstrumente, Thermometer, Buttons) bleiben gleich groß
— auf dem 7-Zöller entsteht dadurch mehr Luft. Die Schriftgrößen bleiben ebenfalls
unverändert: 4,3" ≈ 213 dpi, 7,0" ≈ 170 dpi, gleiche Pixelhöhe wirkt dort physisch
größer.
## Status
**Fertig & hardwareunabhängig:**
- Vollständiger UART-Protokoll-Client (v2): hello-Handshake, state-Parsing, ack/error,
Profile, Heartbeat, Link-Timeout.
- Dashboard: Live-Temperaturen Wasser/Dampf (ist/soll), Duty-Balken, Status-Banner
(Farbe nach `statusKey`), Verbindungs- & WLAN-Anzeige, Bezugs-Timer, Bedien-Buttons.
- Senden für `setPid`, `startAutotune`/`stopAutotune`, `getProfileDetails` vorhanden.
**Board-Bringup:** auf die konkreten JC-Pins/Treiber gesetzt (ST7701 bzw. JD9165, GT911,
Backlight, I²C) — sobald die BSP-Dateien kopiert und `JC_USE_REAL_PANEL=1` gesetzt ist,
lauffähig.
**Noch offen (UI-Ausbau):** weitere Screens — Einstellungen (Brew/Service/Sensor),
Profil-Auswahl/-Editor, PID/AutoTune-Bedienung.
## Inbetriebnahme / Fehlersuche (Lessons learned)
- **Stromversorgung:** Jedes Board **eigene** Versorgung. Zwischen P4 und S3 nur
**GND + TX + RX****kein** 3V3/5V! Den S3 nicht über den 3V3-Header des Displays
speisen (reicht nicht / Regler-Rückspeisung).
- **Pins nach Silkscreen:** Die UART-Pads am Board nach Aufdruck **`GPIO50`/`GPIO51`**
identifizieren, nicht nach Header-Pin-Nummern.
- **S3-Seite:** muss mit `TOUCH_UART_ENABLED 1` geflasht sein und laufen. Da `Serial`
(Debug) und der Touch-UART beide auf GPIO43/44 liegen, ggf. **„USB CDC On Boot:
Enabled"** verwenden, damit der Debug-Port nicht die UART-Pins blockiert.
### Diagnose-Schalter (in `config.h`)
- `SHOW_DEBUG_OVERLAY 1` → blendet unten ein grünes Panel ein: gesendete `hello`,
empfangene Bytes/Zeilen, Parse-Fehler, letzte Rohzeile, Link-Status.
- `UART_SELFTEST_INTERNAL_LOOPBACK 1` → legt TX chip-intern auf RX (ohne Draht/Pins).
Läuft „RX byte" hoch, sind Firmware+UART ok → Problem liegt an Pins/Verkabelung.
**Nach dem Test wieder auf 0!**