Ein neutraler, technischer Überblick, wie die Steuerung der Cocktailmaschine aufgebaut ist.
Die Firmware läuft auf einem ESP32 und ist in Rust geschrieben (auf Basis des ESP-IDF-Frameworks, also mit Standardbibliothek). Sie erfüllt gleichzeitig zwei sehr unterschiedliche Aufgaben: eine Weboberfläche ausliefern und die Schrittmotoren präzise takten. Damit sich beides nicht gegenseitig stört, sind die Aufgaben auf die zwei Prozessorkerne des ESP32 verteilt.
Kern 0 kümmert sich um WLAN und Webserver, Kern 1 ausschließlich um die Motoren. So bleiben die Schritt-Impulse gleichmäßig getaktet, selbst wenn gerade jemand die Weboberfläche lädt.
Der Webserver und die Motorsteuerung teilen keinen direkten Speicher, sondern kommunizieren über zwei klar getrennte Wege:
Sender), die Motorsteuerung holt sie heraus (Receiver) und arbeitet sie der Reihe nach ab. Eine langsame Webseite kann so nie das Motor-Timing stören.Mutex geschützten Speicher, den der Webserver für die Anzeige ausliest.Die komplette Oberfläche ist eine einzelne HTML-Datei mit eingebettetem CSS und JavaScript. Sie wird beim Kompilieren fest in die Firmware eingebacken (include_str!) und beim Aufruf von / ausgeliefert – es gibt also keinen separaten Webspace und keine Build-Pipeline fürs Frontend. Das JavaScript spricht ausschließlich die kleine HTTP-Schnittstelle der Firmware an, z. B.:
Alles, was eingelernt wird – Slot-Positionen, Höhen, Zeiten und die Getränke – wird als JSON serialisiert (mit serde) und im NVS-Flash des ESP32 abgelegt. Es übersteht damit Stromausfall und Neustart und ist von jedem Gerät im WLAN identisch. Empfangene Werte werden vor dem Speichern gegen feste Grenzen geprüft und begrenzt, damit keine fehlerhafte Eingabe gefährliche Zustände erzeugt.
Ein Getränk ist eine Liste von Schritten „Slot × Portionen". Beim Auslösen erzeugt die Firmware daraus eine konkrete Befehlsfolge für die beiden Achsen – sinngemäß:
(falls nötig) Z referenzieren → X referenzieren →
für jede Zutat: X zum Slot → Sync → pro Portion: Z hoch, halten, kurzer Rückhub
(bzw. Pumpe an) → Sync →
am Ende: Z herunter → Referenzfahrt → (optional Ausgabeposition).
Die Sync-Punkte sorgen dafür, dass die Achsen an den richtigen Stellen aufeinander warten – etwa, dass nie dosiert wird, während der Schlitten noch fährt.
Rust (Edition 2021) ESP-IDF (std) esp-idf-svc embedded-svc serde / serde_json anyhow HTML / CSS / Vanilla-JS
| Datei | Aufgabe |
|---|---|
src/main.rs | Start, WLAN, Webserver mit allen Endpunkten, Pin-Zuordnung, Konfiguration laden |
src/servo.rs | Motorsteuerung: Schritt-Impulse, Zustandsmaschine, Sicherheitslogik, Pumpe |
src/settings.rs | Datenmodell der Konfiguration und der Bauplan „Rezept → Befehlsfolge" |
src/config.rs | Zentrale Grenzen: Verfahrwege, Tempo-Limits, Rezept-Limits |
src/servo-control-migrated.html | Die eingebettete Weboberfläche |