CharGraph-FW/README.md
2026-01-25 21:18:49 +01:00

727 lines
18 KiB
Markdown

# CharGraph-FW - ESP8266 WiFi-Steuerbare Zeichengrafik
Eine vollständige Firmware für eine WiFi-gesteuerte LED-Matrix-Wort-Anzeige auf Basis des ESP8266. Das Projekt zeigt Wörter in beleuchteten Buchstaben an und bietet eine Web-basierte Konfigurationsoberfläche.
## 📋 Inhaltsverzeichnis
- [Projektübersicht](#projektübersicht)
- [Verzeichnisstruktur](#verzeichnisstruktur)
- [Installation und Setup](#installation-und-setup)
- [Build-System](#build-system)
- [Verwendete Bibliotheken](#verwendete-bibliotheken)
- [Hardware-Konfiguration](#hardware-konfiguration)
- [Architektur](#architektur)
- [Konfiguration](#konfiguration)
- [Entwicklung](#entwicklung)
- [Bekannte Probleme und Tipps](#bekannte-probleme-und-tipps)
---
## 🎯 Projektübersicht
**CharGraph-FW** ist eine ESP8266-basierte Firmware für ein 18x18 LED-Matrix-Display. Das Projekt erzeugt eine WiFi-steuerbare Wort-Uhr, die die Zeit durch beleuchtete Buchstaben anzeigt.
### Hauptfunktionen
- **WiFi-Konnektivität**: Access Point (AP) und Station (STA) Modi
- **Zeitanzeige**: NTP-Synchronisation mit deutschem PTB-Zeitserver
- **Web-Interface**: Responsive HTML-Oberfläche zur Konfiguration
- **EEPROM-Speicher**: Persistente Speicherung von Einstellungen
- **WS2812B-Support**: Programmierbare RGB-LED-Ansteuerung
- **RTC-Unterstützung**: Optional DS1307 Real-Time Clock
- **OTA-Updates**: Over-The-Air Firmware-Updates
- **Mehrsprachigkeit**: Unterstützung für benutzerdefinierte Zeichen-Muster
### Zielplattformen
- **ESP8266** (ESP-12E/F kompatibel) - Standardboard
- **D1 Mini** - Alternative Board-Option
---
## 📁 Verzeichnisstruktur
```
CharGraph-FW/
├── src/
│ └── main.cpp # Hauptanwendungsdatei
├── include/
│ ├── common.inc # Zentrale Include-Datei für alle Abhängigkeiten
│ ├── defines.inc # Hardware-Definitionen und Debug-Makros
│ ├── vars.inc # Globale Variablendeklarationen
│ ├── extern.inc # Externe Deklarationen für globale Variablen
│ ├── html.h # Auto-generierte HTML-Header (GZIP-komprimiert)
│ └── [weitere Header-Dateien]
├── lib/
│ ├── rgbPanel/ # RGB-Panel Bibliothek (11x11 LED-Matrix)
│ │ ├── src/
│ │ ├── examples/
│ │ └── library.json
│ ├── CharGraphTimeLogic/ # Zeit-Logik und Wort-Matching
│ │ ├── src/
│ │ ├── examples/
│ │ ├── blackboxtest/ # Unit-Tests
│ │ └── library.json
│ ├── PowerOnDetector/ # Stromausfalls-Erkennung
│ │ ├── src/
│ │ └── library.json
│ └── info/ # Status-Anzeige Informationen
│ ├── src/
│ └── library.json
├── html/
│ └── index.html # Web-Interface HTML-Quelle
├── doc/ # Dokumentation
├── .vscode/ # VS Code Einstellungen
├── .platformio.ini # Projekt-Konfiguration
├── html_to_header.py # Pre-Build Script für HTML-Konvertierung
└── README.md # Diese Datei
```
### Verzeichnis-Beschreibungen
| Verzeichnis | Beschreibung |
|---|---|
| `src/` | Quellcode der Hauptanwendung |
| `include/` | Header-Dateien und Definitionen |
| `lib/` | Lokale Bibliotheken und Module |
| `html/` | Web-Interface Quellen |
| `doc/` | Zusätzliche Dokumentation |
| `.vscode/` | VS Code Editor-Konfiguration |
| `.pio/` | PlatformIO Build-Artefakte (nicht im Repo) |
| `.git/` | Git-Versionskontrolle |
---
## 🚀 Installation und Setup
### Voraussetzungen
- **PlatformIO**: Installiert (als VS Code Extension oder CLI)
- **Python 3.6+**: Für das `html_to_header.py` Script
- **USB-zu-UART Adapter**: Zum Hochladen auf ESP8266
### Schritt 1: Repository klonen
```bash
git clone <repository-url>
cd CharGraph-FW
```
### Schritt 2: Abhängigkeiten aktualisieren
```bash
pio lib update
```
### Schritt 3: Serial Port konfigurieren
Die `platformio.ini` enthält vordefinierte Ports:
- **esp8266clone**: `upload_port = COM13`
- **d1_mini**: `upload_port = COM5`
Diese müssen ggf. an die lokale Umgebung angepasst werden.
### Schritt 4: Projekt bauen und hochladen
```bash
# Bauen und hochladen (Standard: esp8266clone)
pio run --target upload
# Oder für D1 Mini:
pio run -e d1_mini --target upload
```
---
## 🔨 Build-System
### PlatformIO Befehle
```bash
# Projekt kompilieren
pio run
# Kompilieren und hochladen
pio run --target upload
# Für spezifische Umgebung bauen
pio run -e esp8266clone
pio run -e d1_mini
# Clean Build durchführen
pio run --target clean
# Serielle Überwachung starten
pio device monitor
# Abhängigkeiten aktualisieren
pio lib update
```
### Build-Flags (platformio.ini)
Die Datei `platformio.ini` definiert wichtige Compile-Flags:
```ini
build_flags =
-I include
-DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
-DDEBUG_ESP_PORT=Serial
-DDEBUG_MODE=false # true = Debug, false = Produktion
-DUSE_RTC=false # RTC DS1307 Unterstützung
-DTEST_RGB_ONLY=false # RGB-Only Test-Modus
-DPOWERLOSSDETECT=false # Stromausfalls-Detektion
```
### Umgebungen
#### esp8266clone (Standard)
- **Board**: ESP-12E kompatibel
- **CPU-Frequenz**: 160 MHz
- **Flash-Modus**: DIO (kompatibler für Clones)
- **Upload-Port**: COM13
- **Upload-Geschwindigkeit**: 115200 baud
```ini
[env:esp8266clone]
board = esp12e
upload_speed = 115200
upload_port = COM13
board_build.flash_mode = dio
board_build.f_cpu = 160000000L
board_build.ldscript = eagle.flash.4m2m.ld
```
#### d1_mini
- **Board**: Wemos D1 Mini
- **CPU-Frequenz**: 160 MHz
- **Flash-Modus**: DIO
- **Upload-Port**: COM5
- **Upload-Geschwindigkeit**: 115200 baud
```ini
[env:d1_mini]
board = d1_mini
upload_speed = 115200
upload_port = COM5
board_build.flash_mode = dio
board_build.f_cpu = 160000000L
board_build.ldscript = eagle.flash.4m2m.ld
```
### Monitor-Einstellungen
```ini
[common]
monitor_speed = 115200
monitor_dtr = 1 # RTS/DTR für Auto-Reset
monitor_rts = 1
monitor_filters =
default
time
esp8266_exception_decoder
```
---
## 📦 Verwendete Bibliotheken
### Externe Abhängigkeiten
Die Bibliotheken werden in `platformio.ini` unter `lib_deps` definiert:
```ini
lib_deps =
fastled/FastLED @ ^3.6.0
adafruit/RTClib @ ^2.1.1
```
#### FastLED 3.6.0+
- **Zweck**: LED-Steuerung und Animation für WS2812B RGB-LEDs
- **Dokumentation**: [FastLED GitHub](https://github.com/FastLED/FastLED)
- **Hauptfunktionen**:
- Unterstützung für verschiedene LED-Chipsets
- Color-Matching und HSV-Support
- Brightness-Control
#### RTClib 2.1.1+ (von Adafruit)
- **Zweck**: Unterstützung für DS1307 Real-Time Clock Module
- **Optional**: Kann deaktiviert werden mit `USE_RTC=false`
- **Dokumentation**: [Adafruit GitHub](https://github.com/adafruit/RTClib)
### Eingebaute ESP8266 Bibliotheken
Die folgenden Bibliotheken sind Teil des Arduino-Frameworks für ESP8266:
| Bibliothek | Zweck |
|---|---|
| `ESP8266WiFi` | WiFi-Konnektivität |
| `ESP8266WebServer` | HTTP-Server für Web-Interface |
| `DNSServer` | DNS-Datenbank für Captive Portal |
| `EEPROM` | Permanente Speicherung |
| `Wire` | I2C-Kommunikation (RTC) |
| `ArduinoJson` | JSON-Verarbeitung |
### Lokale Bibliotheken (in `lib/`)
#### rgbPanel
- **Pfad**: `lib/rgbPanel/`
- **Beschreibung**: Verwaltung der 11x11 (121 LED) LED-Matrix
- **Hauptfunktionen**:
- Wort-Suche und -Hervorhebung
- Zeit-Display mit speziellen Übergängen
- Farb- und Helligkeitskontrolle
- **Hardware**: WS2812B LEDs auf Pin D6
#### CharGraphTimeLogic
- **Pfad**: `lib/CharGraphTimeLogic/`
- **Beschreibung**: Zeit-Logik und Wort-Matching Algorithmen
- **Enthält**: Unit-Tests im `blackboxtest/` Verzeichnis
- **Hauptfunktionen**:
- Zeitformat-Konvertierung
- Wort-Matching für verschiedene Zeitzonen
#### PowerOnDetector
- **Pfad**: `lib/PowerOnDetector/`
- **Beschreibung**: Erkennung von Stromausfällen und Neustarts
- **Funktionen**:
- Boot-Counter-Verwaltung
- System-State-Persistenz
#### info
- **Pfad**: `lib/info/`
- **Beschreibung**: Verbindungsstatus und Informationsanzeige
- **Funktionen**:
- Status-Display-Funktionen
---
## 🖥️ Hardware-Konfiguration
### Zielplattform: ESP8266
| Eigenschaft | Wert |
|---|---|
| Prozessor | 32-bit Xtensa |
| CPU-Frequenz | 160 MHz (eingestellt) |
| RAM | 160 KB |
| Flash | 4 MB (2 MB Sketch + 2 MB OTA) |
| WiFi | 802.11b/g/n |
### Pin-Belegung
| Pin | Funktion | Standard | Alternativ |
|---|---|---|---|
| D6 | RGB LED Data | WS2812B | - |
| D7 | APA102/SK9822 Data | - | APA102 |
| D5 | APA102/SK9822 Clock | - | APA102 |
| D1 (GPIO5) | I2C SCL | RTC/DS1307 | - |
| D2 (GPIO4) | I2C SDA | RTC/DS1307 | - |
| RX | Serieller Input | - | - |
| TX | Serieller Output | - | Debugging |
### LED-Matrix
- **Typ**: 11x11 addressierbare RGB-LED-Matrix
- **LED-Chip**: WS2812B (NeoPixel)
- **Gesamtzahl LEDs**: 121
- **Stromversorgung**: 5V
- **Datenleitung**: D6 (GPIO12)
- **Maximale Stromaufnahme**: ~7,3 A (bei voller Helligkeit, alle weiß)
### RTC-Modul (optional)
- **Chip**: DS1307
- **Interface**: I2C
- **Addresse**: 0x68
- **Spannungsversorgung**: 3.3V
- **SDA**: D2 (GPIO4)
- **SCL**: D1 (GPIO5)
---
## 🏗️ Architektur
### Kernel-Struktur
Das Projekt folgt einer modularen Architektur mit einem zentralen Include-System:
```
main.cpp
include/common.inc (zentrale Include-Datei)
├── include/defines.inc
├── include/vars.inc
├── include/extern.inc
└── [weitere Header-Dateien]
```
#### Kernkomponenten
| Datei | Zweck |
|---|---|
| `src/main.cpp` | Hauptanwendungseinstiegspunkt mit `setup()` und `loop()` |
| `include/common.inc` | Zentrale Include-Datei für alle Abhängigkeiten |
| `include/defines.inc` | Hardware-Definitionen, Debug-Makros, EEPROM-Adressen |
| `include/vars.inc` | Globale Variablendeklarationen |
| `include/extern.inc` | Externe Variablendeklarationen |
### WiFi-Modi
Das System unterstützt drei Betriebsmodi:
#### 1. Access Point Mode (AP)
- **Verwendung**: Initiale Konfiguration und Setup
- **Features**:
- Captive Portal für automatische Umleitung
- SSID: Konfigurierbar (z.B. "CharGraph")
- Passwort: Konfigurierbar
- IP-Adresse: Standard 192.168.4.1
#### 2. Station Mode (STA)
- **Verwendung**: Normalbetrieb mit bestehender WiFi-Verbindung
- **Features**:
- Automatische Verbindung zu vorgespeichertem WiFi
- DHCP-IP-Zuweisung
- NTP-Zeitsynchronisation
#### 3. Dual Mode
- **Verwendung**: Gleichzeitiger Betrieb als AP und STA
- **Features**:
- Konfiguration über AP möglich während STA-Betrieb
- Flexible Netzwerkverwaltung
### Zeitsynchronisation
#### NTP (Network Time Protocol)
- **Server**: Deutsches PTB (`ptbtime1.ptb.de`)
- **Update-Intervall**: Konfigurierbar
- **Timezone**: Mitteleuropäische Zeit (CET/CEST)
- **DST-Unterstützung**: Automatische Sommerzeit-Berechnung
#### RTC-Fallback
- **Modul**: DS1307 (optional)
- **Verwendung**: Falls NTP nicht verfügbar
- **I2C-Adresse**: 0x68
#### Drift-Korrektur
- **Mechanismus**: Kontinuierliche Drift-Messung und Korrektur
- **Speicherung**: EEPROM-basierte Kalibrierung
### EEPROM-Memory-Layout
Das System nutzt ein ausgefeiltes EEPROM-Layout für persistente Speicherung:
| Bereich | Inhalt | Größe |
|---|---|---|
| 0-511 | Konfiguration (Helligkeit, Farben, WiFi) | 512 B |
| 512-1023 | Zeit-Management (Boot-Zeit, Drift, Sync) | 512 B |
| 1024-1535 | Netzwerk-Einstellungen | 512 B |
| 1536-2047 | Auto-Brightness-Kalibrierung | 512 B |
| 2048+ | Character Pattern Storage (charsoap) | Variabel |
Die genauen Adressen sind in `include/defines.inc` definiert.
---
## ⚙️ Konfiguration
### html_to_header.py - HTML zu Header Konvertierung
**Zweck**: Das Pre-Build-Script konvertiert die HTML-Datei in einen komprimierten C-Header für die Einbettung in die Firmware.
#### Funktionsweise
```python
# Eingabe: html/index.html
# Ausgabe: include/html.h
```
1. **HTML-Datei lesen**: Liest `html/index.html` als UTF-8 Text
2. **GZIP-Kompression**: Komprimiert den HTML-Inhalt mit Kompressionsebene 9
3. **Hex-Array-Generierung**: Wandelt komprimierte Bytes in C-Array um
4. **Header-Datei schreiben**: Erzeugt `include/html.h` mit:
- Größenangaben (Original vs. komprimiert)
- Kompressionsquote
- `HTML_PAGE_GZIP[]` Array
- `HTML_PAGE_GZIP_LEN` Konstante
#### Script-Details
```python
import os
import gzip
html_path = "html/index.html"
header_path = "include/html.h"
# HTML lesen und komprimieren
with open(html_path, 'r', encoding='utf-8') as f:
html_content = f.read()
html_bytes = html_content.encode('utf-8')
compressed = gzip.compress(html_bytes, compresslevel=9)
# Größen berechnen
original_size = len(html_bytes)
compressed_size = len(compressed)
ratio = (1 - compressed_size / original_size) * 100
# Header-Datei generieren mit Komprimierungsstatistik
header_content = f"""// Auto-generiert von html_to_header.py
// Original-Größe: {original_size} Bytes
// Komprimierte Größe: {compressed_size} Bytes
// Kompression: {ratio:.1f}%
#ifndef HTML_H
#define HTML_H
#include <Arduino.h>
// GZIP-komprimierte HTML-Seite
const uint8_t HTML_PAGE_GZIP[] PROGMEM = {{
// ... Hex-Daten ...
}};
const size_t HTML_PAGE_GZIP_LEN = {compressed_size};
#endif // HTML_H
"""
```
#### Integration in Build-Prozess
Das Script wird automatisch vor jedem Build ausgeführt:
```ini
extra_scripts = pre:html_to_header.py
```
**Wichtig**: Änderungen an `html/index.html` werden automatisch beim nächsten Build in die Firmware übernommen.
### Web-Interface (html/index.html)
Das Web-Interface bietet folgende Konfigurationsmöglichkeiten:
- **WiFi-Einstellungen**: SSID und Passwort für Station-Modus
- **Farb-Kontrolle**: RGB-Farbauswahl für LED-Anzeige
- **Helligkeits-Einstellungen**: LED-Helligkeit anpassen
- **Zeichen-Muster**: Upload benutzerdefinierter Zeichenmuster
- **System-Information**: Anzeige von Firmware-Version und Status
---
## 👨‍💻 Entwicklung
### Debug-Modus
Debug-Ausgabe wird durch Makros in `include/defines.inc` kontrolliert:
```c
DEBUG_PRINT(x) // Ausgabe ohne Zeilenumbruch
DEBUG_PRINTLN(x) // Ausgabe mit Zeilenumbruch
DEBUG_PRINTF(...) // Formatierte Ausgabe
```
#### Debug-Flag aktivieren
1. In `platformio.ini` ändern:
```ini
-DDEBUG_MODE=true
```
2. Projekt neu bauen:
```bash
pio run --target clean
pio run --target upload
```
3. Serielle Ausgabe überwachen:
```bash
pio device monitor
```
### Serieller Monitor
```bash
# Mit Standard-Einstellungen starten
pio device monitor
# Mit Filtern (Zeit-Anzeige, Exception-Dekoder)
pio device monitor --filter=default --filter=time --filter=esp8266_exception_decoder
```
### Lokale Bibliotheken entwickeln
Jede Bibliothek in `lib/` hat eine `library.json`:
```json
{
"name": "rgbPanel",
"version": "1.0.0",
"description": "RGB Panel control library",
"keywords": ["LED", "RGB", "FastLED"],
"authors": [{"name": "Author Name"}],
"license": "MIT",
"frameworks": ["arduino"],
"platforms": ["espressif8266"]
}
```
### Unit-Tests
Für `CharGraphTimeLogic` sind Unit-Tests vorhanden:
```bash
# Tests ausführen (wenn unterstützt)
cd lib/CharGraphTimeLogic
# Weitere Anweisungen siehe in der Bibliothek
```
---
## 🔄 OTA (Over-The-Air) Updates
Das System unterstützt Firmware-Updates über WiFi:
### Features
- **Progress Tracking**: Echtzeit-Update-Fortschritt
- **Versionsverwaltung**: Firmware-Version im EEPROM
- **Rollback-Mechanismus**: Fallback auf vorherige Version
- **Sicherheit**: Prüfsummen-Verifikation
### Update-Prozess
1. Neue Firmware über Web-Interface hochladen
2. ESP8266 validiert Update
3. Firmware wird geschrieben
4. System startet mit neuer Version neu
---
## 🐛 Bekannte Probleme und Tipps
### ESP8266 Clone Stabilität
**Problem**: Upload-Fehler bei ESP-12E Clones
**Lösungen**:
1. `flash_mode = dio` statt `qio` (bereits eingestellt)
2. `upload_speed = 115200` verwenden (nicht höher)
3. `monitor_dtr = 1` und `monitor_rts = 1` aktivieren
4. USB-Kabel kurz halten oder hochwertiges Kabel verwenden
5. Externe 5V Stromversorgung verwenden
### WiFi-Verbindungsprobleme
**Problem**: Frequent WiFi-Trennungen
**Lösungen**:
1. Stromversorgung des ESP8266 prüfen (mindestens 500mA)
2. WiFi-Kanal in AP-Modus wechseln
3. RTC-Kalibrierung überprüfen
4. EEPROM-Kalibrierung zurücksetzen
### Speicherlecks
**Debug-Tipp**: Heap-Größe in `loop()` monitoren:
```c
DEBUG_PRINTF("Free heap: %d bytes\n", ESP.getFreeHeap());
```
### LED-Probleme
**Problem**: Einzelne oder alle LEDs zeigen falsche Farben
**Lösungen**:
1. Pin D6 auf Kurzschlüsse prüfen
2. Stromversorgung der LED-Matrix überprüfen (5V, GND)
3. Daten-Line Widerstand (330-470 Ohm) überprüfen
4. `TEST_RGB_ONLY=true` Flag zum Testen verwenden
### RTC-Kommunikation
**Problem**: RTC wird nicht erkannt
**Überprüfung**:
1. I2C-Pins D1 (SCL) und D2 (SDA) verbunden?
2. Pull-Up-Widerstände vorhanden? (4.7k Ohm)
3. I2C-Adresse korrekt? (0x68 für DS1307)
4. `USE_RTC=true` in `platformio.ini` gesetzt?
### Zeitsynchronisation
**Problem**: Zeit wird nicht über NTP synchronisiert
**Überprüfung**:
1. WiFi-Verbindung aktiv?
2. Internetzugang vorhanden?
3. NTP-Server erreichbar? (`ptbtime1.ptb.de`)
4. Firewall blockiert Port 123?
5. System-Zeit mit RTC als Fallback verwenden
---
## 📚 Zusätzliche Ressourcen
### Offizielle Dokumentation
- **ESP8266 Arduino Core**: [GitHub](https://github.com/esp8266/Arduino)
- **FastLED Library**: [GitHub](https://github.com/FastLED/FastLED)
- **PlatformIO**: [Dokumentation](https://docs.platformio.org)
- **Arduino Reference**: [arduino.cc](https://www.arduino.cc/reference)
### Community und Support
- **ESP8266 Community**: [esp8266.com](https://esp8266.com)
- **Arduino Forum**: [forum.arduino.cc](https://forum.arduino.cc)
- **GitHub Issues**: Fehlerberichte und Feature-Anfragen
### Weitere Dateien
- `doc/`: Zusätzliche Dokumentation
---
## 👨‍🔧 Beitragen
Beiträge sind willkommen! Bitte erstellen Sie einen Pull Request mit:
1. Beschreibung der Änderungen
2. Tests für neue Funktionen
3. Dokumentation-Updates
4. Hinweis auf zugehörige Issues
---
## 📞 Support und Kontakt
Bei Fragen oder Problemen:
1. Erstellen Sie einen GitHub Issue mit:
- Fehlerbeschreibung
- Build-Ausgabe
- Serielles Debugging-Output
---
**Zuletzt aktualisiert**: 2026-01-25
**Version**: 1.0
**Entwicklungsumgebung**: PlatformIO + VS Code