Skip to the content
PCBKitNew board
2 layers50 × 37 mmAnzeige Simon, the printed circuit board in 3D

ESP32-basierte Steuerung fuer Fallblattanzeigen (MAN/Krone/Vossloh) mit: - WiFi Access Point - Weboberflaeche/HTTP-API - Serieller Ausgabe im Krone-Protokoll - I2C-Transfer von Byte-Werten an 3 Slave-Adressen (ADTrans)

Size
50 × 37 mm
Copper layers
2
Thickness
1.6 mm
Parts
25
Nets
30
Pads
96
Tracks, vias
171, 28
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
23 Aug 2026
Updated
26 Oct 2026

Overview

Anzeige Simon is an open-source printed circuit board by makerspace-wi, from the makerspace-wi/SimonProject repository on GitHub. It is a 2-layer board of 50 × 37 mm with 25 parts on 30 nets, routed with 171 tracks and 28 vias.

It is built around the PCF8574P, 74HC688D and SFH617A-3. Its parts include 8 resistors, 5 connectors and 3 ICs.

Main components

3

README

README.md

Simon Project

ESP32-basierte Steuerung fuer Fallblattanzeigen (MAN/Krone/Vossloh) mit:

  • WiFi Access Point
  • Weboberflaeche/HTTP-API
  • Serieller Ausgabe im Krone-Protokoll
  • I2C-Transfer von Byte-Werten an 3 Slave-Adressen (ADTrans)

Projektziel

Dieses Projekt stellt mit einem ESP32 einen lokalen Access Point bereit. Ueber HTTP-Endpoints koennen Anzeigeinhalte gesetzt oder geloescht werden. Die Ausgabe an die Fallblattmodule erfolgt seriell im Format:

  • Startbyte: 0x88
  • Adresse: adress
  • Wert: flip
  • Endbyte: 0x81

Verwendete Plattform

  • MCU/Board: ESP32 (wemos_d1_uno32)
  • Framework: Arduino
  • Build-System: PlatformIO
  • Webserver: ESP32WebServer
  • mDNS: ESPmDNS
  • I2C: Wire

Konfiguration: platformio.ini

Build und Upload

Build

bash
~/.platformio/penv/bin/platformio run

Upload (Beispiel)

bash
~/.platformio/penv/bin/platformio run -t upload

Netzwerkverhalten

Beim Start erzeugt der ESP32 einen Access Point:

  • SSID: fallblatt.local
  • Passwort: Fallblattanzeige

Zusatz: mDNS wird mit Hostname fallblatt initialisiert.

HTTP-Endpoints

Implementierung in src/main.cpp.

1) Startseite

  • GET /
  • Liefert die HTML-Oberflaeche aus MAIN_page (Datei src/web.h).

2) Anzeige loeschen

  • GET /clear
  • Loescht/neutralisiert alle angesteuerten Fallblattpositionen.

3) Anzeige setzen

  • GET /flip
  • Erwartete Query-Parameter:
    • b = Betreiber
    • g = Gattung
    • n = Zugnummer
    • s = Abfahrtsstunde
    • m = Abfahrtsminute
    • i1 = Info 1
    • i2 = Info 2
    • d = Zwischenziel
    • z = Ziel

Beispiel:

text
/flip?b=1&g=2&n=42&s=12&m=34&i1=5&i2=6&d=7&z=8

Hinweis:

  • Der Endpoint /flip steuert zusaetzlich 3 I2C-Module (ADTrans) ueber I2C_ADDR_1..3.
  • Je nach Laenge der Zugnummer werden Ziffern auf UART-Fallblattmodule und I2C-Module verteilt.

4) Zweites Modul (direkt im Programm gesteuert)

Die zweite serielle Schnittstelle (19200 Baud, BREAK-Protokoll) wird ohne eigenen HTTP-Endpoint direkt im Programmablauf gesteuert.

Aktuell erfolgt die Ansteuerung am Ende von /flip mit:

  • Zieladresse aus MODULE2_DIRECT_ADDR
  • Position aus dem bereits berechneten Feld ziel

Damit geht die Kommunikation fuer das zweite Modul nicht separat ueber den Webserver.

I2C-Konfiguration

Standardwerte in platformio.ini:

  • I2C_ADDR_1=0x38
  • I2C_ADDR_2=0x39
  • I2C_ADDR_3=0x3A

Optionale Pinbelegung (auskommentiert):

  • I2C_SDA_PIN
  • I2C_SCL_PIN

Wenn beide Pins gesetzt sind, wird Wire.begin(SDA, SCL) verwendet. Andernfalls nutzt das Projekt Wire.begin() mit Board-Default.

Genutzte IO-Pins

Aktueller Stand gemaess platformio.ini und src/main.cpp:

  • Debug-UART (Serial): ueber USB-Seriell (Monitor 115200 Baud).
  • Signal-UART (Serial2, 4800 Baud, 8E2):
    • TX: GPIO17 (UART_SIGNAL_TX_PIN)
    • RX: GPIO16 (UART_SIGNAL_RX_PIN)
  • Modul-2-UART (Serial1, 19200 Baud, 8N1, BREAK-faehig):
    • TX: GPIO26 (UART_MODULE2_TX_PIN)
    • RX: GPIO27 (UART_MODULE2_RX_PIN)
    • Optional RS485 Driver-Enable: UART_MODULE2_RS485_DE_PIN (Standard -1 = aus)
  • I2C (Wire):
    • Aktuell keine festen Pins im Build-Flag gesetzt.
    • Es werden daher die Board-Defaults verwendet (Wire.begin()).
    • Optional konfigurierbar ueber I2C_SDA_PIN und I2C_SCL_PIN in platformio.ini.

Hinweis:

  • Auf vielen ESP32-Boards liegt USB-Debug intern auf UART0 (typisch TX0=GPIO1, RX0=GPIO3).
  • Fuer die Fallblattansteuerung wird ausschliesslich Serial2 genutzt.
  • Die ADTrans-I2C-Module werden mit sendByte(...) angesteuert (kein separater HTTP-I2C-Endpoint).

Fallblatt-Adressen (seriell)

Die adressierten Module sind in src/main.cpp festgelegt, u. a.:

  • Logo: 0x05
  • Gattung: 0x04
  • Zeichen 1/2: 0x03, 0x02
  • Stunde/Minute: 0x01, 0x00
  • Info 1/2: 0x07, 0x06
  • Zwischenziel/Ziel: 0x08, 0x09

Troubleshooting

Build-Task in VS Code schlaegt fehl, Terminal-Build funktioniert

Symptom:

  • VS-Code-Task meldet Fehler, manueller Build ist erfolgreich.

Pruefung/Fix:

  • Sicherstellen, dass /.vscode/tasks.json den PlatformIO-Pfad aus dem Python-Environment nutzt.
  • Build direkt testen:
bash
~/.platformio/penv/bin/platformio run

Include-Fehler / IntelliSense findet Header nicht

Symptom:

  • Meldung wie "Aktualisieren Sie Ihren includePath".

Pruefung/Fix:

  • Einmal erfolgreichen Build ausfuehren, damit PlatformIO die Projektmetadaten aktualisiert.
  • VS Code neu laden, falls die Meldung bestehen bleibt.
  • In platformio.ini das richtige Environment pruefen (ESP32_WROOM).

Upload funktioniert nicht

Symptom:

  • run -t upload bricht mit Port- oder Verbindungsfehler ab.

Pruefung/Fix:

  • USB-Kabel/Port wechseln.
  • Board-Typ in platformio.ini pruefen (wemos_d1_uno32).
  • Upload separat testen:
bash
~/.platformio/penv/bin/platformio run -t upload

I2C-Geraet reagiert nicht

Symptom:

  • Ziffern auf den ADTrans-Modulen fehlen oder bleiben auf Leerwert.

Pruefung/Fix:

  • I2C-Adressen in platformio.ini mit den Slave-Adressen abgleichen (I2C_ADDR_1..3).
  • Falls eigene Pins noetig sind, I2C_SDA_PIN und I2C_SCL_PIN in platformio.ini aktivieren.
  • GND zwischen ESP32 und I2C-Slaves gemeinsam verbinden.

mDNS/Hostname nicht erreichbar

Symptom:

  • fallblatt.local wird nicht aufgeloest.

Pruefung/Fix:

  • Direkt per IP aufrufen statt Hostname.
  • Sicherstellen, dass das Endgeraet im Access-Point des ESP32 eingebucht ist.
  • AP-Daten pruefen: SSID fallblatt.local, Passwort Fallblattanzeige.

Hinweise

  • Das Projekt ist fuer die aktuelle ESP32-PlatformIO-Umgebung ausgelegt.
  • Bei Problemen zuerst Build lokal pruefen und die Werte in platformio.ini kontrollieren.
  1. OMEGA-Modul über RS485 ansteuern Das OMEGA-Modul hängt an Serial1 (RS485, Pins 26/27, 19200 Baud, 8N1). Du hast bereits die Funktion module2SetPosition(), die den Befehl 0xC0 (Set Position) sendet. Diese kannst du für das OMEGA-Modul verwenden – aber mit der richtigen Adresse deines OMEGA-Moduls.

Statt:

cpp setflip(logoadress, betreiber); schreibst du:

cpp // Betreiber an OMEGA-Modul über RS485 senden // MODULE2_DIRECT_ADDR muss die tatsächliche Adresse des OMEGA-Moduls sein module2SetPosition(static_cast<uint8_t>(MODULE2_DIRECT_ADDR), static_cast<uint8_t>(betreiber & 0xFF));

Super einfach, wir machen es Schritt für Schritt. Das Tool ist ein kleines Programm, das über die serielle RS485-Schnittstelle Befehle an Module mit Adresse 0 bis 255 sendet.

Siehe auch: README.md

Was das Tool macht

Es sendet immer ein Telegramm im Format: BREAK + FF + COMMAND + ADDR + optionale Daten.

Du gibst an: Port, Command, und Zieladresse(n).

Zieladressen können sein: eine Adresse, ein Bereich oder alle 0..255.

Einmalige Einrichtung

Terminal im Projekt öffnen und in den Ordner wechseln: cd "/Users/dieter/Documents/PlatformIO/Projects/Simon Project/omega-rs485-tool"

Virtuelle Umgebung anlegen: python3 -m venv .venv

Aktivieren: source .venv/bin/activate

Abhängigkeit installieren: pip install -r requirements.txt

Erster Test ohne Senden

Damit siehst du nur, was gesendet würde: python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd C8 --addr 29 --dry-run

Wenn das gut aussieht: --dry-run entfernen.

Einfaches echtes Senden

TEST-Command C8 an Adresse 29: python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd C8 --addr 29

An alle Adressen 0..255: python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd C8 --all

Beispiel mit Antwort lesen

Firmware-Version lesen, erwartet 2 Antwort-Bytes: python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd D4 --all --read-bytes 2 --delay-ms 5

Ausgabe zeigt dann pro Adresse TX und ggf. RX.

Häufige Stolpersteine

Falscher Port: dann kommt meist sofort ein Öffnungsfehler.

Falsche Baudrate: hier ist 19200 Standard.

RS485-Richtung/Adapter: bei manchen Adaptern muss DE/RE korrekt geschaltet sein.

Erst immer mit einer Adresse testen, dann Bereich oder all.

Wenn du willst, gehen wir jetzt zusammen live durch deinen ersten echten Lauf, und ich sage dir genau, welchen Befehl du als Nächstes eingibst.

Top, dann ist hier Kommando 2 (Full-Scan 0..255 mit TEST-Befehl C8):

~/.platformio/penv/bin/python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd C8 --all --delay-ms 5

Optional erst als Trockenlauf:

~/.platformio/penv/bin/python omega_rs485_tool.py --port /dev/cu.usbserial-0001 --cmd C8 --all --delay-ms 5 --dry-run

So gibst du den seriellen Port wieder frei:

Laufendes Python-Skript stoppen Im Terminal, in dem das Tool läuft: Control + C Erst dadurch wird die serielle Verbindung geschlossen. Virtuelle Umgebung verlassen Befehl: deactivate Falls Port trotzdem noch blockiert ist Prüfen, welcher Prozess den Port hält: lsof | grep cu.usbserial Dann den betreffenden Prozess beenden: kill -9 PID Kurz gesagt:

Für den Port ist vor allem Control + C wichtig. deactivate beendet nur die venv, nicht automatisch ein laufendes Skript.

Parts

25
QtyValueFootprintReferences
510kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR4, R5, R6, R7, R8
3BefestigungMountingHole:MountingHole_3.2mm_M3_ISO14580H1, H2, H3
3~Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP1, JP2, JP3
24,7kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2, R3
2GND TPConnector_Wire:SolderWirePad_1x01_SMD_1x2mmGND1, GND2
110kResistor_THT:R_Array_SIP7RN1
1330Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1
174HC688Package_DIP:DIP-20_W7.62mm_Socket_LongPadsU1
1AnzByteConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ5
1DatenConnector_JST:JST_XH_B6B-XH-A_1x06_P2.50mm_VerticalJ2
1I2CConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ1
1MoGNDConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ3
1PCF8574PPackage_DIP:DIP-16_W7.62mmU2
1SFH617Package_DIP:DIP-4_W7.62mmU3
1VccConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ4

Questions

How big is the Anzeige Simon PCB?

It measures 50 × 37 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Anzeige Simon use?

25 parts, built around the PCF8574P, 74HC688D and SFH617A-3. 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.

Where can I download the Anzeige Simon KiCad files?

From the makerspace-wi/SimonProject repository on GitHub, at the commit this page was made from: the board is doc/Anzeige_Simon10/Anzeige_Simon.kicad_pcb and its schematic doc/Anzeige_Simon10/Anzeige_Simon.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Anzeige Simon design in my own project?

Its repository states no licence, so its author keeps all rights: ask makerspace-wi before reusing the design.

Similar boards

  • 2 layers304.6 × 105.7 mmMPPT Booster 4kW Hardware, the printed circuit board in 3D

    MPPT Booster 4kW Hardware

    HNadeemTahir/AI_Inverter_Project

    NgSpice Digital Twin of a complete off-grid solar power system: H-Bridge inverter (220V/50Hz, PI control, electro-thermal IGBT modeling) and 4kW MPPT boost converter (UC3843 analog control, KCL summing node, gate drive…

    115 parts5
  • 2 layers80.3 × 58.8 mmAtapiduino, the printed circuit board in 3D

    Atapiduino

    nthpulse/atapiduino_pcb

    PCB for Carlos Durandal's Atapiduino project

    14 parts1
  • 2 layers70 × 133.5 mmSunCommander RelayModule, the printed circuit board in 3D

    SunCommander RelayModule

    m47eus2/SunCommander-PCB

    PCB boards for energy optimalization device. Contactors control for power switching with full optical isolation. Multiple current measurments made with current transformers.

    77 parts
  • 2 layers130 × 62 mmESC SERVO KRS, the printed circuit board in 3D

    ESC SERVO KRS

    PriX-Y/UTL-Pad---Ulimated-Macro-pad

    i made this macro with with Statis - HackClub

    30 parts
  • 2 layersHouse midget, the printed circuit board in 3D

    House midget

    Sharoun-Madoya/home_midget

    167 partsMIT
  • 2 layers100 × 100 mmFt150ts E, the printed circuit board in 3D

    Ft150ts E

    z-XOF-z/FT150TS

    Tablero digital + launcher para Android que funciona solo con el teléfono del manubrio y está listo para una tarjeta ESP32 en la moto.

    71 parts
  • 4 layers120 × 98 mmExbus proto, the printed circuit board in 3D

    Exbus proto

    clydeshaffer/gametank

    design files for the gametank hardware implementation

    871 parts150