Update README.md
This commit is contained in:
parent
7cdb899e01
commit
10859fc2fc
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -57,3 +57,4 @@ hardware/gerber/*.drl
|
|||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
CLAUDE.md
|
||||
503
README.md
Normal file
503
README.md
Normal file
|
|
@ -0,0 +1,503 @@
|
|||
# CharGraph-Basic
|
||||
|
||||
Ein ESP8266-basiertes Firmware-Update-System mit Web-Interface für die OTA (Over-The-Air) Programmierung von Mikrocontrollern.
|
||||
|
||||
## 🎯 Projektbeschreibung
|
||||
|
||||
CharGraph-Basic ist ein vollständige FOTA-Update-Lösung für ESP8266-Mikrocontroller. Das Projekt bietet:
|
||||
|
||||
- **Web-basierte Benutzeroberfläche** für Firmware-Updates und Gerätekonfiguration
|
||||
- **Zwei Update-Modi**: Direkter Upload und URL-basiertes Herunterladen
|
||||
- **Echtzeit-Fortschrittsanzeige** während des Update-Prozesses
|
||||
- **Responsive Design** mit Dark-Mode-Unterstützung
|
||||
- **GZIP-komprimierte HTML** (82,6% Kompression) für minimalen Flash-Speicherverbrauch
|
||||
- **Dual-Mode WiFi** (Access Point + Station) für flexible Konnektivität
|
||||
- **Fehlerbehandlung** und Status-Reporting
|
||||
- **EEPROM-basiertes Tracking** von Update-Status und Versionsinfo
|
||||
|
||||
## ✨ Features
|
||||
|
||||
### Hardware-Unterstützung
|
||||
- **Zielplattform**: ESP8266 (ESP-12E/F kompatibel)
|
||||
- **Flash-Speicher**: 4MB (2MB für Sketch, 2MB OTA-Reserve)
|
||||
- **CPU-Frequenz**: 160MHz
|
||||
- **Serial-Geschwindigkeit**: 115200 Baud
|
||||
- **Spezial-Unterstützung** für ESP8266-Clone-Boards (DIO Flash-Mode)
|
||||
|
||||
### WiFi & Netzwerk
|
||||
- **AP-Modus**: Access Point mit eigenem SSID für drahtlose Verbindung
|
||||
- Standard SSID: `CharGraph-01`
|
||||
- Standard Passwort: `MeinPasswort123`
|
||||
- IP-Adresse: `192.168.4.1`
|
||||
- **Station-Modus**: Verbindung zu existierendem WLAN (für URL-basierte Updates)
|
||||
- **DNS-Server**: Integrierter DNS-Server für AP-Zugang
|
||||
|
||||
### Web-Interface
|
||||
- **Moderne, responsive UI** mit Gradient-Hintergrund
|
||||
- **Dark-Mode** für bessere Lesbarkeit in verschiedenen Lichtverhältnissen
|
||||
- **Live-Systeminformationen**:
|
||||
- Firmware-Version
|
||||
- Build-Datum und -Zeit
|
||||
- Verfügbarer Flash-Speicher
|
||||
- Sketch-Größe
|
||||
- Chip-ID und Flash-Größe
|
||||
- **Firmware-Upload** via Browser (Multipart-Form)
|
||||
- **URL-basierte Updates** mit Fortschrittsanzeige
|
||||
- **Fehler-Anzeige** und Status-Feedback
|
||||
|
||||
### OTA Update-System
|
||||
- **Sichere Flash-Programmierung** via ESP8266 Updater-Klasse
|
||||
- **Fortschritts-Callbacks** für Echtzeit-Feedback
|
||||
- **Auto-Restart** nach erfolgreichem Update
|
||||
- **Fehlerbehandlung** mit aussagekräftigen Fehlermeldungen
|
||||
- **EEPROM-Logging** von Update-Status
|
||||
|
||||
## 🔧 Anforderungen
|
||||
|
||||
### Hardware
|
||||
- ESP8266 Mikrocontroller (D1 Mini, NodeMCU, oder ESP-12E/F Module)
|
||||
- USB-zu-Serial-Adapter (für Upload während Entwicklung)
|
||||
- Stromversorgung (3,3V/500mA minimum)
|
||||
|
||||
### Software
|
||||
- **Python 3.x** (für Build-Skripte)
|
||||
- **PlatformIO** (für Build und Upload)
|
||||
- **Texteditor/IDE** (VS Code mit PlatformIO-Extension empfohlen)
|
||||
|
||||
#### Abhängigkeiten (in Firmware)
|
||||
- Arduino Framework für ESP8266
|
||||
- ESP8266WiFi Library
|
||||
- ESP8266WebServer Library
|
||||
- DNSServer Library
|
||||
- ESP8266httpUpdate Library
|
||||
- Updater Library (für OTA)
|
||||
- EEPROM Library (für Persistierung)
|
||||
- Wire Library (für I2C)
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
### 1. Repository klonen
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd CharGraph-Basic
|
||||
```
|
||||
|
||||
### 2. Abhängigkeiten installieren
|
||||
```bash
|
||||
# PlatformIO installieren (falls nicht vorhanden)
|
||||
pip install platformio
|
||||
|
||||
# Erforderliche Python-Module für HTML-Generierung
|
||||
pip install gzip # Ist standardmäßig enthalten
|
||||
```
|
||||
|
||||
### 3. Konfiguration anpassen
|
||||
Bearbeite `src/main.cpp`:
|
||||
|
||||
```cpp
|
||||
// Zeile 18-19: WiFi-Zugangsdaten für Station-Mode
|
||||
const char* ssid = "DEIN_WLAN_SSID";
|
||||
const char* password = "DEIN_WLAN_PASSWORT";
|
||||
|
||||
// Zeile 21-22: Access Point Einstellungen
|
||||
char AP_SSID[AP_SSID_LENGHT] = "CharGraph-01";
|
||||
char AP_PASSWORD[AP_PASSWORD_LENGTH] = "MeinPasswort123";
|
||||
|
||||
// Zeile 37: Firmware-Versionsnummer
|
||||
char firmwareVersion[32] = "BASIC";
|
||||
```
|
||||
|
||||
### 4. Serielle Verbindung konfigurieren
|
||||
Bearbeite `platformio.ini`:
|
||||
|
||||
```ini
|
||||
[env:esp8266clone]
|
||||
upload_port = COM13 # Angepasst an Ihr System (COM3, /dev/ttyUSB0, etc.)
|
||||
```
|
||||
|
||||
### 5. Build und Upload
|
||||
```bash
|
||||
# Projekt bauen
|
||||
pio run -e esp8266clone
|
||||
|
||||
# In ein Gerät hochladen
|
||||
pio run -e esp8266clone -t upload
|
||||
|
||||
# Mit seriellem Monitor starten
|
||||
pio device monitor -e esp8266clone
|
||||
```
|
||||
|
||||
## 🚀 Verwendung
|
||||
|
||||
### Auf das Gerät zugreifen
|
||||
|
||||
1. **Verbindung herstellen**:
|
||||
- WLAN nach `CharGraph-01` suchen
|
||||
- Mit Passwort `MeinPasswort123` verbinden
|
||||
- Im Browser zu `192.168.4.1` navigieren
|
||||
|
||||
2. **Web-Interface öffnen**:
|
||||
- Automatische Umleitung zur Konfigurationsseite
|
||||
- Falls nicht: `http://192.168.4.1/`
|
||||
|
||||
### Firmware aktualisieren
|
||||
|
||||
#### Methode 1: Direkter Upload
|
||||
1. Im Web-Interface zum Abschnitt "Firmware-Upload" navigieren
|
||||
2. Binärdatei (`.bin`) auswählen
|
||||
3. "Upload" klicken
|
||||
4. Fortschritt beobachten
|
||||
5. Gerät startet automatisch neu
|
||||
|
||||
#### Methode 2: URL-basiertes Update
|
||||
1. Im Web-Interface zur Option "Update von URL" navigieren
|
||||
2. URL zur Firmware-Binärdatei eingeben
|
||||
3. "Update starten" klicken
|
||||
4. Gerät lädt und installiert Firmware
|
||||
5. Automatischer Neustart
|
||||
|
||||
#### Methode 3: Über REST-API
|
||||
```bash
|
||||
# Firmware-Information abrufen
|
||||
curl http://192.168.4.1/ota/info
|
||||
|
||||
# Status des laufenden Updates
|
||||
curl http://192.168.4.1/ota/status
|
||||
|
||||
# Update von URL starten
|
||||
curl -X POST "http://192.168.4.1/ota/url?url=http://example.com/firmware.bin"
|
||||
|
||||
# Firmware-Datei hochladen
|
||||
curl -F "file=@firmware.bin" http://192.168.4.1/ota/upload
|
||||
```
|
||||
|
||||
### Serielle Konsole nutzen
|
||||
```bash
|
||||
# Monitor starten
|
||||
pio device monitor -e esp8266clone
|
||||
|
||||
# Baud-Rate (Standard: 115200)
|
||||
pio device monitor -e esp8266clone -b 115200
|
||||
```
|
||||
|
||||
Die serielle Ausgabe zeigt:
|
||||
- Verbindungsstatus
|
||||
- IP-Adressen
|
||||
- Update-Fortschritt
|
||||
- Fehler und Debugging-Informationen
|
||||
|
||||
## 📁 Projektstruktur
|
||||
|
||||
```
|
||||
CharGraph-Basic/
|
||||
├── src/
|
||||
│ └── main.cpp # Hauptanwendungscode
|
||||
├── include/
|
||||
│ └── html.h # Auto-generierte GZIP-komprimierte HTML
|
||||
├── html/
|
||||
│ └── index.html # HTML-UI Quellcode
|
||||
├── platformio.ini # PlatformIO Konfiguration
|
||||
├── html_to_header.py # Build-Script für HTML-Komprimierung
|
||||
├── .gitignore # Git-Ignorierregeln
|
||||
└── README.md # Diese Datei
|
||||
```
|
||||
|
||||
### Wichtige Dateien
|
||||
|
||||
| Datei | Zweck |
|
||||
|-------|-------|
|
||||
| `src/main.cpp` | Web-Server, WiFi-Setup, OTA-Handler, API-Endpoints |
|
||||
| `html/index.html` | Web-Interface (UI/UX) |
|
||||
| `include/html.h` | Komprimierte HTML für Flash-Speicher (Auto-generiert) |
|
||||
| `html_to_header.py` | Python-Script zur HTML-Komprimierung |
|
||||
| `platformio.ini` | Build-Konfiguration, Compiler-Flags, Abhängigkeiten |
|
||||
|
||||
## 🔌 API-Dokumentation
|
||||
|
||||
### REST-API Endpoints
|
||||
|
||||
#### GET `/`
|
||||
Serviert die Hauptseite (HTML-Interface).
|
||||
|
||||
**Response**: HTML (GZIP-komprimiert)
|
||||
|
||||
```
|
||||
Content-Type: text/html
|
||||
Content-Encoding: gzip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### GET `/ota/info`
|
||||
Gibt Geräteinformationen und Update-Status zurück.
|
||||
|
||||
**Response**: JSON
|
||||
```json
|
||||
{
|
||||
"version": "BASIC",
|
||||
"buildDate": "Jan 25 2026",
|
||||
"buildTime": "17:00:00",
|
||||
"freeSpace": 204800,
|
||||
"sketchSize": 307200,
|
||||
"chipId": "12a4b5c",
|
||||
"flashSize": 4194304,
|
||||
"otaReady": true
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### POST `/ota/upload`
|
||||
Multipart-File-Upload für direkte Firmware-Installation.
|
||||
|
||||
**Request**:
|
||||
```
|
||||
Content-Type: multipart/form-data
|
||||
Body: [binary firmware data]
|
||||
```
|
||||
|
||||
**Response**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Update erfolgreich"
|
||||
}
|
||||
```
|
||||
|
||||
oder bei Fehler:
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": "Begin failed"
|
||||
}
|
||||
```
|
||||
|
||||
**Mögliche Fehler**:
|
||||
- `"Begin failed"` - Flash-Programmierer konnte nicht initialisiert werden
|
||||
- `"Write failed"` - Daten konnten nicht geschrieben werden
|
||||
- Andere Update-Fehler von der ESP8266 Updater-Klasse
|
||||
|
||||
---
|
||||
|
||||
#### POST `/ota/url?url=<firmware-url>`
|
||||
Lädt Firmware von URL und installiert sie.
|
||||
|
||||
**Parameter**:
|
||||
- `url` (Query-Parameter): Vollständige URL zur `.bin`-Datei
|
||||
|
||||
**Request**: POST ohne Body
|
||||
|
||||
**Response**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Update gestartet"
|
||||
}
|
||||
```
|
||||
|
||||
**Fehlerbehandlung**:
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": "URL fehlt"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### GET `/ota/status`
|
||||
Gibt aktuellen Update-Fortschritt zurück.
|
||||
|
||||
**Response**: JSON
|
||||
```json
|
||||
{
|
||||
"inProgress": false,
|
||||
"progress": 100,
|
||||
"error": "",
|
||||
"elapsed": 45000
|
||||
}
|
||||
```
|
||||
|
||||
**Felder**:
|
||||
- `inProgress`: Boolean - Lädt Update gerade
|
||||
- `progress`: Integer (0-100) - Prozentuale Fortschrittsanzeige
|
||||
- `error`: String - Fehlermeldung (leer bei Erfolg)
|
||||
- `elapsed`: Integer - Millisekunden seit Update-Start
|
||||
|
||||
---
|
||||
|
||||
#### GET `*` (Alle anderen Routen)
|
||||
Leitet zu `/` um (Fehlerbehandlung).
|
||||
|
||||
**Response**: HTTP 302 Redirect
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Konfiguration
|
||||
|
||||
### Hardware-Einstellungen (`platformio.ini`)
|
||||
|
||||
```ini
|
||||
[env:esp8266clone]
|
||||
board = esp12e # ESP8266 Variant
|
||||
framework = arduino # Arduino Framework
|
||||
platform = espressif8266 # ESP8266 Platform
|
||||
|
||||
# Flash-Einstellungen für Clone-Kompatibilität
|
||||
board_build.flash_mode = dio # DIO statt QIO
|
||||
board_build.f_cpu = 160000000L # CPU-Frequenz
|
||||
board_build.f_flash = 40000000L # Flash-Frequenz
|
||||
|
||||
# Memory-Layout
|
||||
board_build.ldscript = eagle.flash.4m2m.ld # 2MB Sketch + 2MB OTA
|
||||
|
||||
# Serial-Einstellungen
|
||||
upload_speed = 115200
|
||||
monitor_speed = 115200
|
||||
monitor_dtr = 1 # RTS/DTR für Clone-Reset
|
||||
monitor_rts = 1
|
||||
```
|
||||
|
||||
### Build-Flags (`platformio.ini`)
|
||||
|
||||
```cpp
|
||||
-DDEBUG_MODE=false // Debug-Ausgabe aktivieren (false/true)
|
||||
-DDEBUG_SOURCE=true // Firmware Debug-Messages
|
||||
-DDEBUG_ESP_CORE=false // ESP-Core Debug
|
||||
-DDEBUG_ESP_WIFI=0 // WiFi-Debug
|
||||
-DNDEBUG // Assertions deaktivieren
|
||||
-DUSE_RTC=false // RTC-Unterstützung
|
||||
-DTEST_RGB=false // RGB-Tests deaktivieren
|
||||
-DPOWERLOSSDETECT=false // Stromausfall-Erkennung
|
||||
```
|
||||
|
||||
### Anwendungskonfiguration (`src/main.cpp`)
|
||||
|
||||
```cpp
|
||||
// EEPROM-Speicheradressen für OTA-Tracking
|
||||
#define ADDR_OTA_VERSION 166 // Firmware-Version (32 Bytes)
|
||||
#define ADDR_OTA_BUILD_DATE 198 // Build-Datum (20 Bytes)
|
||||
#define ADDR_OTA_FLAGS 218 // Status-Flags (1 Byte)
|
||||
|
||||
// Access Point Einstellungen
|
||||
IPAddress apIP(192, 168, 4, 1); // AP-IP-Adresse
|
||||
char AP_SSID[14] = "CharGraph-01";
|
||||
char AP_PASSWORD[17] = "MeinPasswort123";
|
||||
|
||||
// Station Mode (für URL-Updates)
|
||||
const char* ssid = "YOUR_SSID";
|
||||
const char* password = "YOUR_PASSWORD";
|
||||
```
|
||||
|
||||
## 🔄 Build-Prozess
|
||||
|
||||
Das Projekt nutzt einen **Pre-Build-Script** (`html_to_header.py`) zur Vorkomprimierung der HTML:
|
||||
|
||||
1. HTML-Datei (`html/index.html`) wird gelesen
|
||||
2. Mit GZIP (Kompressionslevel 9) komprimiert
|
||||
3. Als Hex-Array in Header-Datei (`include/html.h`) geschrieben
|
||||
4. Konstanten definiert:
|
||||
- `HTML_PAGE_GZIP[]` - Komprimierte Daten
|
||||
- `HTML_PAGE_GZIP_LEN` - Größe der komprimierten Daten
|
||||
|
||||
**Kompression-Ergebnis**:
|
||||
- Original: ~122 KB
|
||||
- Komprimiert: ~20 KB
|
||||
- Ratio: 82,6% Einsparung
|
||||
|
||||
### Nach HTML-Änderungen
|
||||
```bash
|
||||
# Script manuell ausführen (optional, wird automatisch bei Build ausgeführt)
|
||||
python html_to_header.py
|
||||
|
||||
# Dann normal bauen
|
||||
pio run -e esp8266clone
|
||||
```
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Upload schlägt fehl
|
||||
```
|
||||
error: espcomm_open failed
|
||||
```
|
||||
**Lösung**:
|
||||
1. USB-Kabel prüfen
|
||||
2. Richtigen COM-Port in `platformio.ini` einstellen
|
||||
3. Device Manager (Windows) oder `dmesg` (Linux) prüfen
|
||||
4. DTR/RTS-Einstellungen in Konfiguration überprüfen
|
||||
|
||||
### Gerät nicht erreichbar
|
||||
**Problem**: Kann sich nicht mit AP verbinden
|
||||
|
||||
**Lösungen**:
|
||||
1. SSID/Passwort überprüfen (Standard: CharGraph-01 / MeinPasswort123)
|
||||
2. Gerät mit serieller Konsole verbinden, um Fehler zu sehen
|
||||
3. Power-Cycle durchführen (ausschalten, 2-3 Sek. warten, einschalten)
|
||||
|
||||
### Update schlägt mit "Begin failed" fehl
|
||||
**Problem**: OTA-Update kann nicht initialisiert werden
|
||||
|
||||
**Gründe**:
|
||||
- Firmware-Datei ist zu groß (>2MB)
|
||||
- Nicht genug freier Speicher
|
||||
- Fehlerhafte Firmware-Binärdatei
|
||||
|
||||
**Lösung**:
|
||||
1. Firmware-Größe prüfen: `ls -lh firmware.bin`
|
||||
2. Serielle Ausgabe für Error-Details prüfen
|
||||
3. Firmware mit korrekter ESP8266-Konfiguration neu bauen
|
||||
|
||||
### Speicherfehler bei Build
|
||||
```
|
||||
MemoryError: python memory exceeded
|
||||
```
|
||||
**Lösung**: Größere Binärdatei komprimieren - System RAM reicht nicht aus
|
||||
|
||||
```bash
|
||||
# Fallback: HTML ohne maximale Kompression (Level 6)
|
||||
# In html_to_header.py ändern:
|
||||
compressed = gzip.compress(html_bytes, compresslevel=6)
|
||||
```
|
||||
|
||||
### Serial-Monitor zeigt Müll
|
||||
**Problem**: Lesbar-Output wie `¿¬?ü╬¬¬`
|
||||
|
||||
**Lösung**: Baud-Rate überprüfen (sollte 115200 sein)
|
||||
```bash
|
||||
pio device monitor -e esp8266clone -b 115200
|
||||
```
|
||||
|
||||
## 🔒 Sicherheitshinweise
|
||||
|
||||
### ⚠️ WiFi-Zugangsdaten
|
||||
- Zugangsdaten sind im Quellcode hardcodiert
|
||||
- Für Produktion: Sichere Speicherung (z.B. EEPROM-Verschlüsselung) erwägen
|
||||
- Standard-Passwort ändern und neu kompilieren
|
||||
|
||||
### ⚠️ OTA-Updates
|
||||
- Keine Authentifizierung/Autorisierung auf API-Endpoints
|
||||
- Für Netzwerk-Updates HTTPS/TLS erwägen (verbraucht zusätzliche Resources)
|
||||
- Update-Quelle validieren (URL-Schema prüfen)
|
||||
|
||||
### ⚠️ Firmware-Binärdateien
|
||||
- Keine Signaturen-Verifizierung im Moment
|
||||
- Updates nur aus vertrauenswürdigen Quellen installieren
|
||||
|
||||
## 📝 Lizenz
|
||||
|
||||
[Lizenz eintragen, z.B. MIT, Apache 2.0, GPL, etc.]
|
||||
|
||||
## 👤 Autor & Support
|
||||
|
||||
**Projekt**: CharGraph-Basic
|
||||
**Version**: 1.0.0 (BASIC)
|
||||
|
||||
### Weitere Ressourcen
|
||||
- [PlatformIO Dokumentation](https://docs.platformio.org/)
|
||||
- [ESP8266 Arduino Core](https://github.com/esp8266/Arduino)
|
||||
- [ESP8266 Technical Reference](https://www.espressif.com/en/products/socs/esp8266/resources)
|
||||
- [Arduino OTA Update Guide](https://arduino-esp8266.readthedocs.io/en/latest/ota_updates/readme.html)
|
||||
|
||||
---
|
||||
|
||||
**Zuletzt aktualisiert**: 25. Januar 2026
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
// GZIP-komprimierte HTML-Seite
|
||||
const uint8_t HTML_PAGE_GZIP[] PROGMEM = {
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x23, 0x3b, 0x76, 0x69, 0x02, 0xff, 0xed, 0xbd, 0x6b, 0x73, 0x1b, 0x49,
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x01, 0x3e, 0x76, 0x69, 0x02, 0xff, 0xed, 0xbd, 0x6b, 0x73, 0x1b, 0x49,
|
||||
0x92, 0x20, 0xf8, 0x5d, 0xbf, 0x22, 0xc4, 0xea, 0x12, 0x80, 0x2e, 0x00, 0x04, 0xc0, 0x87, 0x28,
|
||||
0x52, 0xa4, 0x8c, 0xe2, 0x43, 0xe2, 0x88, 0xa2, 0x78, 0x04, 0x25, 0xed, 0xd6, 0x63, 0xba, 0x13,
|
||||
0x40, 0x00, 0xc8, 0x62, 0x22, 0x13, 0x9b, 0x99, 0x20, 0x25, 0x56, 0x6b, 0x6d, 0x3e, 0x74, 0x8f,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user