
Controller
Anderman/Renovent
Display is een liteon De 8 segementen worden in volgorde aan gestuurd met een freq van 500uS Welke segmenten verlicht worden gaat met digit 1 - 4

Display is een liteon De 8 segementen worden in volgorde aan gestuurd met een freq van 500uS Welke segmenten verlicht worden gaat met digit 1 - 4
Sensor is an open-source printed circuit board by Anderman, from the Anderman/Renovent repository on GitHub. It is a 2-layer board with 16 parts on 29 nets, routed with 57 tracks and 32 vias.
Its parts include 10 connectors, 1 capacitor and 1 IC. It belongs with the sensors and measurement boards of this library.



De originele controller is een display met toetsen en 1 IC De IC zet een 3 bit counter om in 8 select lijnen van het display.
Display is een liteon De 8 segementen worden in volgorde aan gestuurd met een freq van 500uS Welke segmenten verlicht worden gaat met digit 1 - 4
Het programma zal dus het continue het display moeten uitlezen en wat er op staat omzetten in een 4 char array. Hiervan met gebruik gemaakt worden van mapping om een 8 bit array om te zetten in een Char. Waarschijnlijk kan de DP los en hebben we een 7 bitarray naar char mapping nodig.
De switches werken als volgt
Er is 1 output Key_node. sw1 (OK) = key_node=1 als C=1 (counter=1) Sw2 (+ ) = key_node=1 als D=1 (counter=5) Sw3 (F ) = key_node=1 als E=1 (counter=6) Sw4 (- ) = key_node=1 als DP=1 (counter=3)
In het ESP32-schema worden de relevante signalen van de originele controller eerst via een SN74LVC245 naar 3V3 gebracht. De ESP32 ziet dus alleen de 3V3-varianten van deze signalen.
Deze acht ingangen zijn voldoende om het gemultiplexte display en de toetsstatus te reconstrueren.
KEY_DOWN gaat via een BSS138-transistor naar de originele schakeling. Daarmee kan de ESP32 een toetsdruk simuleren zonder direct 5V op een GPIO te zetten.
De displaycontroller loopt elke 500 us door de 8 segment-selects. De software leest dus niet "digit 1", daarna "digit 2", enzovoort, maar leest per segment-select in een keer de toestand van alle 4 digitlijnen.
Concreet:
BIT0, BIT1 en BIT2 vormen samen een tellerwaarde van 0..7.Digit1..Digit4 hoog zijn.De mapping van de tellerwaarde naar segment is:
| BIT2 BIT1 BIT0 | index | segment |
|---|---|---|
| 0 0 0 | 0 | A |
| 0 0 1 | 1 | C |
| 0 1 0 | 2 | B |
| 0 1 1 | 3 | DP |
| 1 0 0 | 4 | F |
| 1 0 1 | 5 | D |
| 1 1 0 | 6 | E |
| 1 1 1 | 7 | G |
Schematisch ziet een volledige scan er zo uit:
flowchart LR
A[GPIO snapshot] --> B[Lees BIT0..2]
B --> C[Select-index 0..7]
C --> D[Segment voor deze stap kiezen]
D --> E{Lees Digit1..4 in dezelfde snapshot}
E --> F[Zet dit ene segment in digit 1..4 als die hoog zijn]
F --> G[Werk lopend frame bij]
G --> H{Zijn alle 8 select-stappen gezien?}
H -- nee --> A
H -- ja --> I[4 complete digitmasks klaar]
I --> J[Zet digitmasks om naar displaytekst]Eén interrupt-snapshot doet dus niet alles. Per snapshot gebeurt maar dit:
BIT0..2Pas nadat dit 8 keer gebeurd is, hebben we voor alle 4 digits een volledig segmentmasker.
Je kunt het ook zo lezen: we lezen niet "4 displays na elkaar", maar per segment in een keer alle 4 displays.
Voorbeeld:
BIT2..0 = 000 betekent segment ADigit1 en Digit3 hoog zijn, dan krijgt digit 1 en digit 3 het segment AC op dezelfde manier verdeeld over de 4 digitsKEY_NODE wordt in diezelfde scan meegelezen. Een actieve key tijdens een specifieke select-index betekent een specifieke toets.
De huidige implementatie gebruikt juist een interrupt op BIT0.
Waarom:
KEY_NODEDe implementatie in src/display_reader.cpp werkt zo:
BIT0 triggert onBit0ChangeInterrupt() op elke flank.GPIO.in1.val, zodat alle ingangssignalen uit hetzelfde tijdsmoment komen.BIT0..2 wordt de verwachte select-index bepaald.7 is een volledig frame klaar.Daardoor is de reader robuuster tegen timingglitches en worden half-opgebouwde displaybeelden niet gepubliceerd.
Er is nu een eerste ESP32 software-opzet toegevoegd in de map src.
src/main.cpp start WiFi, de webserver en de display reader.src/wifiSetup.* gebruikt WiFiManager, net als in het andere project.src/display_reader.* leest BIT0..2, Digit1..4 en KEY_NODE in en bouwt daar een stabiel displayframe van op.src/webui/webui.* publiceert een simpele HTTP API en serveert statische bestanden uit SPIFFS.data/index.html is een eenvoudige debugpagina.Na boot:
Beschikbare endpoints:
GET /api/statusPOST /api/keydown/api/status geeft onder andere terug:
KEY_NODEEr is ook een partitions/default.csv toegevoegd zodat de SPIFFS data-partitie beschikbaar is voor de webpagina.
Voor lokaal gebruik zijn deze commando's relevant:
platformio runplatformio run --target buildfsplatformio run --target uploadfsplatformio run --target uploadDe automatische firmware-update leest OTA-bestanden uit release/firmware, release/spiffs en release/latest.json.
Deze artifacts worden lokaal gegenereerd door scripts/generate_build_info.py, dat als PlatformIO build hook meeloopt. De hook:
src en data*.hash in src en ui-hashes.bin naar release/firmware of release/spiffsrelease/latest.json bijVoor een volledige lokale OTA release bouw je beide artifacts:
platformio run -e esp32s3mini_otaplatformio run -e esp32s3mini_ota -t buildfsDaarna kun je de bijgewerkte bestanden in release/ zelf committen of op een andere manier publiceren, zolang release/latest.json en de bijbehorende .bin bestanden bereikbaar blijven voor de ESP32.
Een ESP32-S3 backtrace uit de WebUI of seriele output kun je direct tegen de actuele firmware-ELF symboliseren met:
.\scripts\decode_backtrace.ps1 "0x4037EF71 -> 0x40377C96 -> 0x40376AEF"Het script gebruikt standaard:
.pio/build/esp32s3mini_ota/firmware.elfxtensa-esp32s3-elf-addr2line.exeBelangrijk: decode altijd tegen de ELF van dezelfde firmware-build als waarmee de crash is ontstaan, anders kloppen functies en regelnummers mogelijk niet.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | Conn_01x03 | 123:PinSocket_1x03_P2.00mm_Vertical_female_C2935967 | J33, J34, J35, J36 |
| 4 | Conn_01x03 | 123:PinHeader_1x03_P2.00mm_Vertical_male_C541857 | J37, J38, J39, J40 |
| 4 | MountingHole | 123:MountingHole_2.5mm | H31, H32, H33, H34 |
| 2 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J31, J32 |
| 1 | 100nf | Capacitor_SMD:C_0402_1005Metric | C31 |
| 1 | SHT4x | Sensor_Humidity:Sensirion_DFN-4_1.5x1.5mm_P0.8mm_SHT4x_NoCentralPad | U31 |
16 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Anderman/Renovent repository on GitHub, at the commit this page was made from: the board is Hardware/Esp32/Sensor/Sensor.kicad_pcb and its schematic Hardware/Display/Display.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Anderman before reusing the design.

Anderman/Renovent
Display is een liteon De 8 segementen worden in volgorde aan gestuurd met een freq van 500uS Welke segmenten verlicht worden gaat met digit 1 - 4

google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards

conorpp/u2f-zero
U2F USB token optimized for physical security, affordability, and style

rusefi/rusefi
rusefi - GPL internal combustion engine control unit

VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

hoglet67/RGBtoHDMI
Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

