> Historisch onderzoek aan één paneel. Voor een nieuw scherm: [README.md](README.md) > en [de vijfpuntskalibratie](docs/CALIBREREN.md); neem geen meetwaarden over. # ESP32-2432S028: stabiele bediening Gebruik **home-like-2432s028.yaml** voor de aangesloten 2,8-inch CYD met ILI9341 en XPT2046. `home-like.yaml` hoort bij het andere ST7789V/GT911-bord. De wifi-, API- en OTA-geheimen blijven in `secrets.yaml`. ## Bediening - Stel `TILE_COUNT` in op het aantal gebruikte tegels (1–10). Bij maximaal zes tegels verdwijnen beide paginaknoppen en de pagina-aanduiding; hogere tegelnummers zijn verborgen. - Pagina 1 bevat tegels 1–6; pagina 2 bevat 7–10. Gebruik de knoppen **Vorige** en **Volgende** onderaan. Slepen is uitgeschakeld. - Kort tikken voert de bestaande tegelactie uit. Lang indrukken opent de bestaande licht-, climate- of vacuumkaart, of de ingestelde lange actie. - Standby begint na tien minuten zonder aanraking (`AUTO_DIM_TIMEOUT: "600"`). - De eerste tik op het gedimde scherm maakt het scherm wakker. - Contacten korter dan `TOUCH_MIN_PRESS_MS` (60 ms op de CYD, 20 ms op de Guition) worden genegeerd. Eén aanraking kan maximaal één tegelactie geven; een verplaatsing groter dan `TOUCH_MOVE_LIMIT_PX` (circa 1 cm: 56 px CYD, 67 px Guition) ten opzichte van het gesettelde eerste contactpunt annuleert de tik; alleen het eerste contact telt; dezelfde tegel wordt 600 ms tegen contactdender beschermd. Een geweigerde tik staat met reden in het log (tag `touch`). - De thermostaat verstuurt de afgeronde, begrensde temperatuur die hij toont. Een lokale temperatuur- of moduskeuze krijgt drie seconden om met HA te synchroniseren. Een ingedrukte bediening voorkomt automatisch dimmen. - Pippa gebruikt de echte `vacuum.s8`-status, zodat docken, schoonmaken, pauzeren en terugkeren onderscheiden worden. Ontbrekende HA-statussen worden als `Niet beschikbaar` getoond. ## Technische keuzes ESPHome 2026.6.2 met ESP-IDF; er zijn geen Arduino-componenten nodig. De displaybus draait op 40 MHz, zoals ESPHome's standaard CYD-profiel. XPT2046 wordt elke 20 ms uitgelezen zonder GPIO36-interrupt. De drukdrempel is 800, na een verdachte hoekmeting bij druk 422. Een lokale XPT2046-driver vereist drie consistente ADC-samples voor een nieuwe aanraking, negeert losse uitschieters en wacht twee drukloze samples af voor loslaten. Dit voegt circa 40–60 ms toe bij aanraken en voorkomt dat een onstabiele eerste meting meteen als een andere knop wordt geïnterpreteerd. De driver staat onder `components/`. De geïnstalleerde interruptdriver probeert op die input-only pin een niet-beschikbare interne pull-up te activeren; de oude firmware logde hiervoor een GPIO-fout. LVGL krijgt 12% tekenbuffer. Geen scrollanimaties en geen extra flitspuls na elke tik. Tegelachtergronden zijn ondoorzichtig. Updates binnen 100 ms worden samengevoegd; ongewijzigde tegellabels en kleuren worden niet opnieuw gezet. De UI-initialisatie draait pas nadat LVGL is gestart. De klok ververst direct bij tijdsynchronisatie. Roboto staat lokaal in `fonts/`, inclusief OFL-licentie. De actieve indeling is 320×240. De oude, uitgecommentarieerde portretpresets zijn nog geen aangepaste paginalay-outs: reserveer bij een andere oriëntatie ook onderaan 34 pixels voor de navigatie en controleer de tegelposities. ## Bouwen en flashen ```sh esphome compile home-like-2432s028.yaml esphome upload home-like-2432s028.yaml --device /dev/cu.usbserial-130 esphome logs home-like-2432s028.yaml --device /dev/cu.usbserial-130 ``` Sluit een lopende seriële loglezer voordat je flasht. De vorige configuratie staat lokaal in `diagnostics/before-2432s028.yaml.bak`; de bijbehorende vorige factorybinary in `diagnostics/before-2432s028.factory.bin`. Deze lokale backups worden niet in Git opgenomen. Teruggaan kan door de backup als configuratie te herstellen en opnieuw te bouwen/flashen; herstel de oude Arduino-toolchain als je de oude configuratie bouwt. ## Tests ```sh clang++ -std=c++17 -Wall -Wextra -Werror tests/test_cyd_ui.cpp -o /tmp/test_cyd_ui /tmp/test_cyd_ui python3 tests/test_layout.py clang++ -std=c++17 -Wall -Wextra -Werror tests/test_touch_filter.cpp -o /tmp/test_touch_filter /tmp/test_touch_filter ``` De C++-test controleert contactdender, korte ruispulsen, opeenvolgende tegels, herhaling binnen één aanraking, `millis()`-overflow en temperatuurafronding. De indelingstest controleert overlap, schermgrenzen, ruimte voor navigatie en het filter vóór beide handlers van alle tien tegels. Met de Python-omgeving van ESPHome (met aioesphomeapi, PyYAML en pyserial): ```sh python diagnostics/capture_serial.py --reset --seconds 120 > diagnostics/runtime.log python diagnostics/run_ui_test.py --host cyd-2432s028.local ``` De API-test leest de encryptiesleutel intern uit `secrets.yaml` en drukt deze niet af. Hij wisselt tien keer van pagina en tekent de vijf overlays in elke ronde. Hij roept geen Home Assistant-acties aan. Raak het scherm tijdens deze circa 11 seconden niet aan. Dit is een teken-/geheugentest; hij vervangt geen fysieke toets van de touchkalibratie of een test van HA-service-effecten. Diagnostiek logt iedere 30 seconden vrije heap en grootste vrije geheugenblok. `DEBUG` is tijdelijk nuttig voor touch- en verbindingsdiagnose. Voor dagelijks gebruik kan `logger.level` op `INFO` zodra de fysieke bediening goed is. ## Touchdiagnose `python diagnostics/control_ui.py touch_diagnostics` opent een apart scherm met vier kruizen. Tijdens deze meting kunnen aanrakingen geen tegelactie uitvoeren. Tik nauwkeurig achtereenvolgens linksboven, rechtsboven, rechtsonder en linksonder. De ruwe en genormaliseerde coördinaten staan in de seriële logs met tag `touch`. Sluit af met `python diagnostics/control_ui.py end_touch_diagnostics`. De kruizen staan op (20,20), (299,20), (299,219) en (20,219) voor landschap 320×240. De huidige kalibratie (X 225–3800, Y 274–3609) is afgeleid uit de drie herhaalde metingen rechtsboven en linksonder op dit fysieke bord. De eerdere metingen linksboven waren onstabiel en zijn bewust niet gebruikt om het hele scherm naar een verkeerde positie te verschuiven. Daarbovenop corrigeert `set_raw_correction(...)` in `on_boot` de gemeten scheefstand. De fit gebruikt de gefilterde hoekmedianen (830,556), (544,3461), (3410,3391) en (3492,372). De vier medianen vallen na correctie binnen vijf pixels van hun meetdoel in de regressietest. Dit zijn bord-specifieke coëfficiënten; neem ze niet blind over op een ander paneel. De `raw=`-logs blijven de fysieke, gefilterde ADC-metingen tonen.