Digitale Wohnwagen Wasserwaage 2.0

Dieses Projekt hatte ich schon mal vorgestellt und es hatte bereits einen Vorgänger.
Hier möchte ich aber ein bisschen teifer in die Details eingehen und einen Austausch ermöglichen.

Hardware:

  • ESP32 C3 Supermini
  • MPU 6050
  • LM2596

Dazu gesellt sich nun noch ein Spannungsteiler um die Batterieladung darzustellen.
Hier sollte man wissen, dass die meisten ESP32 am ADC nur 2,6V vertragen und nicht 3,3V!
Dann geht´s mit 5,2k & 1k gut auf PIN0 oder PIN1. Berechnen lassen kann man das gut hier.

Für den Supermini habe ich verschiedene Pinouts gefunden, was die Verwendung von I2C erschwert hat.
Der PIN8 wird zwar auch von der OnBoard LED verwendet, korrekt verkabelt, läuft die Kommunikation mit dem MPU 6050 problemlos.

Der MPU 6050 kann auch die Temperatur ausgeben, die ist aber natürlich stark von der Eigenerwärmung abhängig.

Geplant ist noch eine Ansicht der Front & Seite mit der Neigung. Je nach eigener Vorliebe.

Die Einrichtung ist für den Wertebereich auf der Libelle, die Ausrichtung des MPU6050 und die Nullung gedacht:

Ein erweitertes Menü erlaubt aber auch eine abweichendes Pinout und Widerstände.

Der “Voltage Threshold” gleicht die Dioden des Verpolungsschutzes und die Widerstände aus.

Für den Gyro und die Spannung gibt es ein Diagramm zur Anzeige:

Ist alles etwas Spielerei, so wie der “Serieller” Monitor im Browser. Also quasi eher eine Debug-Ansicht als ein wirkliches Feature.

Der Rest ist praktisch genauso wie in Version 1.0, nur etwas optimiert.

Die Webseite ist auf dem ESP gehostet und der ESP startet einen Hotspot. Verbindet man sich damit, öffnet sich automatisch die Seite. Am Campingplatz schalte ich nur die 12V Spannungsversorgung an und das Smartphone macht alles von allein, wenn es den Hotspot bereits kannte.

Per Upload kann man jede Datei für die Webseite austauschen oder auch die Firmware hochladen. OTA ging in meinem Netzwerk nicht verlässlich, ist aber noch an Board.

Ab und an habe ich den Fehler “ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH” erhalten, anstelle dass wieder die index.html dargestellt wird. Für den ESP8266 gibt es die Lösung vorab die Länge als “unknown” zu melden und das klappt tatsächlich:

webServer.setContentLength(CONTENT_LENGTH_UNKNOWN);

Ein bisschen teste ich noch, dann werde ich alles auf GitHub bereitstellen.
Dann folgt auch das neue 3d gedruckte Gehäuse :flexed_biceps:

Der Code steht nun auf GitHub bereit:

Es folgen noch ein paar Screenshots, die Verkablung und ein paar Erklärungen.

Die JavaScript und CSS Dateien wurden nochmal überarbeitet und optimiert. Wobei vom Gefühl die Ladezeit immer noch extrem gut ist, auch wenn alleine das CSS über 400 Zeilen hat.

Momentan läuft das Ganze auf meinem Schreibtisch sehr verlässlich. Das neue 3D Case befindet sich noch im Designprozess, dann wir das Ganze wieder im Wohnwagen verbaut.

Bist Du schon bereit für Anmerkungen oder soll ich mich noch zurückhalten?

Für konstruktives Feedback bin ich immer offen :slight_smile:

Das kündigt man aber selten so an :rofl:

"ESP32" bezeichnet eine Familie von µCs, da stellt sich die Frage, mit welcher Hardware Du getestet hast. Auch finde ich auf die Schnelle nicht, wie MPU6050 angeschlossen ist. Eventuell gibt es auch da verschiedene Boards. Ein Schalt- oder Verkabelungsplan könnte hilfreich sein.

Mir ist vollkommen bewußt, daß zwischen der eigenen Dokumentation und einer für eine Veröffentlichung tauglichen Arbeit steckt, daher meine vorsichtige Frage :innocent:

Bisher mache ich die Nivelierung mit einer kleinen Wasserwaage, aber es ist nicht ausgeschlossen, daß ich Dein Projekt nachbaue.

Bisher habe ich das Ganze auf dem angesprochenen ESP32 C3 Supermini, dem ESP-WROOM-32 DevBoard und dem ESP32-S3-WROOM-1 DevBoard mit doppel USB-C getestet.

Würde also sagen: Läuft auf jeder ESP32 Variante.
Man muss nur schauen wo man das I2C Pinout findet und SCL & SDA verbinden. 3,3V & GND natürlich auch.
Der Aufbau des Spannungsteilers kann man immer mit 5,2k & 1k Ohm wählen. Dann kommen bei 15V unter 2,5V am Eingangspin an.

Bei den oben genannten Modellen verträgt nur der ADC des ESP32-S3 bis zu 3,3V auf dem Eingang.
Welche Pins des Boards ADC unterstützen muss man dann auch mal recherchieren. Der Supermini hat 0 & 1, die anderen 33-36 (und noch ein paar mehr).

// set the ADC attenuation to 11 dB (up to ~2.6V input)
analogSetPinAttenuation(voltagePin, ADC_11db);

Die Doku ergänze ich wie gesagt noch auf der Landingpage von GitHub. Hatte ich beim Vorgänger auch schon recht detaliert gemacht. Nehme Deine Fragen aber mal mit :slight_smile:
Der Upload der Webseite auf den ESP ist auch immer ein Thema, den man nicht gut genug beschreiben kann.

Mit der Libelle hat es mich immer genervt, dass ich vorne kurbel und optimaler Weise im Wohnwagen messe. Auf der Deichsel ist eine Abdeckung und der Fahrradhalter :man_shrugging: Stelle ich den Wohni auf einen Keil, bin ich mal davor oder dahinter. Oder sogar im Auto.
Nicht immer ist eine (verlässliche) Ansagerin mit dabei :rofl:

Glücklicherweise habe ich da ein sehr verläßliches Exemplar erwischt :heart_eyes:

Für mich als Bastler wäre das daher nur eine nette Spielerei :blush:

Das könntest Du erwähnen und dann gleich verraten, wo sich SCL & SDA verstecken. Auch den Anschluß von MPU6050 könntest Du exemplarisch zeigen. Drei Schaltpläne und erste Stolpersteine sind aus dem Weg geräumt :wink:

Die Schaltpläne liefere ich noch nach, habe gerade mal den ersten Entwurf skizziert.

Es folgen noch ein Video, ein 3D Case und vielleicht eine komplette Installationsanleitung, auch für nicht Arduinokundige. Die “alte” Lösung hatte schon ordentlich viele Klicks und auch einiges an Nachfragen.

Das wäre dann der nächste Schritt: Alles als BIN-Datei zusammenpacken, für z.B. die drei oben genannten Boards. Und dann bereitstellen per Web-Installer. So wie z.B. WLED das macht.
Dann steckt man das Board an, geht auf eine Webseite, drückt auf “Installieren” und fertig!

Das motiviert, eine ordentliche Dokumentation anzubieten, finde ich.

Beim ESP32-S3 habe ich recht lange mit SPI "gekämpft", weil es bei vier SPI-Schnittstellen recht viele Möglichkeiten gibt. Flexibilität ist gut, kann aber auch verwirren. Da ist es gut, ein paar Fixpunkte zu haben. Daher würde ich dem Schaltbild Priorität vor dem WEB-Installer geben.

Meine letzte Software Idee ist umgesetzt:

Das 3D gedruckte Gehäuse ist fertig und beherbergt die Komponenten einigermaßen platzsparend übereinander. Wenn ich nicht eine recht große Lochrasterplatine verwendet hätte :sweat_smile:

Die Idee den MPU und ESP Supermini steckbar und damit austauschbar zu machen erscheint gut, ist aber gar nicht so praktikabel.

Denn der Gyro hat nur eine Pinreihe auf einer Seite, somit wackelt er. Ein ebenfalls gedruckter Halter verbessert das deutlich, etwas Schaumstoff oder ähnliches muss da mit ein bisschen Druck aushelfen.

Damit der MPU DC-DC Wandler nichts kurzschließt, ist dort ebenfalls ein kleiner, gedruckter Abstandshalter eingesetzt.

Der Deckel hält simpel durch Reibung. Der USB-Port ist von Außen erreichbar. Macht eigentlich gar nicht so viel Sinn, wenn ich darüber nachdenke :rofl:
Ist ja alles per Weboberfläche aktualisierbar oder man kann den ESP entnehmen.

Morgen wird alles wieder verbaut und ein zweiter auf Basis eines “großen” ESP32 gebaut.
Dann geht´s an die Schaltbilder, Webinstaller und etwas mehr Doku.

Der neuste Stand des Codes findet sich wie gewohnt auf GitHub.

Mein Test auf Wokwi war nicht ganz so erfolgreich:
Leider funktioniert der WebServer nicht und auch der Spannungsteiler hat nicht geklappt. Dazu kann man nun einen Schieber verwenden und den MPU kann man steuern in dem man diesen anklickt.
Hat also keinen echten Nutzwert und taugt auch wenig als Schaltplan.

Der Einbau war wie zu erwarten überschaubar einfach.
Mit doppelseitigem Silikonklebeband direkt auf Höhe der Achse unter der Sitzbank angebracht. Dort, wo der vorige ebenfalls schon verbaut war.

Während ich etwas mit den verschiedenen ESP32 Varianten herumgespielt habe, habe ich gesehen, dass der SPIFFS -Upload eine *.spiffs.bin Datei ins %temp% Verzeichnis legt.

Diese habe ich mir mal geschnappt, passend zu der kompilierten Firmware. Nun kann man auf z.B: das ESP Web Tool gehen, die Dateien auswählen und flashen.
Hierzu zwei Anmerkungen:

  1. Man muss wirklich im richtigen Moment den ESP32 in den Boot-Modus versetzen. Am besten auf “Verbinden” klicken, den Port auswählen, Maus auf den Knopf ausrichten und dann Boot halten, RST, Boot loslassen & klicken.
  2. Dann ist es wichtig den Offset korrekt zu setzen!

Für Punkt 2, den Offset muss ich noch etwas recherchieren, inwiefern dieser sich zwischen den Varianten unterscheidet. Klappt aktuell noch nicht so verlässlich, der ESP versandet dann im Bootloop, auch wenn ich das identisch zum Output in der Arduino IDE angebe.

Um aber auch per Web-Oberfläche den Dateiupload verwenden zu können, prüfe ich bei *.bin Dateien ob das Wort “spiffs” vorkommt und flashe mit dem entsprechenden Offset:
Update.begin(UPDATE_SIZE_UNKNOWN, U_SPIFFS);

So kann ich alle für die Weboberfläche notwenigen Datien auf einmal ersetzen. Das klappt auch auf Anhieb.

Denke das ist beides eine spannende Lösung um das initiale Flashen deutlich zu vereinfachen! Und die Hürde für Personen deutlich zu senken, die mit der IDE, den *.ino Dateien und den notwendigen Libraries & Plugins noch keine Kontaktpunkte hatten.

Versuche mal einen 10 µF Elektrolytkondensator zwischen EN und GND, bitte beachte die Polung. Bei meinem ESP32 kommt der dann automatisch in den Boot-Modus.

Ne, damit hat das nichts zu tun. Aus der IDE lässt er sich problemlos ohne Bootmodus beschreiben.
Das ist eine Eigenheit von dem Web-Installer.

Habe da jetzt etwas mehr mit rumgespielt. Wenn man die gesamte Binary nimmt, inklusive Bootloader, Partition und Firmware dauert es Ewigkeiten, klappt aber auch nicht. Versuche es mal einen anderen Webupdater.

Gibt auch die Möglichkeit selbst eine Webseite und die Binarys zu hosten. Das erfordert zwar etwas WebSpace, scheint aber grundsätzlich die selbe Funktionalität zu bieten. Dann auch ohne dass man den ESP nochmal manuell in den Bootmodus versetzen muss.
Allerdings mit dem selben Ergebnis. Der hängt anschließend in einer Bootschleife…
Schätze mal da muss ich noch irgendwie anders die Firmware exportieren.

Wenigstens habe ich nun als Nebenprodukt einen kostenlosen Speicherplatz für Webseiten und kann eine Demo zur Verfügung stellen:
Caravan Leveler 2.0 Web-Demo

Ah OK, das hatte ich anders verstanden :blush:

Flash Firmware & SPIFFS per Webseite

Habe es endlich geschafft. Man muss einfach nur die Anleitung lesen, verstehen und umsetzen :smiley:

Man kann zwar gezielt nur die Firmware überschreiben, dann darf man aber nicht standardmäßig den Flash Mode “override” setzen.
Dazu gibt es dann zwei Varianten, man gibt den bootloader, partitions, boot & die App separat an.
Oder man verwendet direkt die ohnehin von der IDE generierte “merged” Datei, muss dann aber natürlich bei 0x00 starten!

Das war mein Fehler! Ich hatte den Offset immer auf 0x10000 stehen.

Nun kann man freudig aus dem Web die Firmware mit allen Webseiten-Dateien aufspielen und den ESP unmittelbar in Betrieb nehmen.
Dazu gibt es noch ein weiteres Projekt: Improv-WiFi

Das ist eine Library, die man auf dem ESP installieren kann und dann aus dem Browser direkt die Einrichtung des WLANs ermöglicht:

Korrekt implementiert, gibt es dann auch die komplette Palette an Funktionsumfang:

WiFi anpassen funktioniert. Die Serielle Console ebenfalls. “Visit Device” öffnet dann auch unmittelbar die Landingpage auf dem ESP.

Bin echt zufrieden wie schnell ich trotz anfänglichen Startschwierigkeiten so weit gekommen bin.
Werde die Installationsseite noch etwas hübsch machen, die ESP32, ESP32-S3 & ESP32-C3 binarys bereitstellen.
Dann folgt noch je ein Anschlussplan für die drei Lösungen und fertig ist das Projekt.
Erstmal :rofl:

Gibt es einen speziellen Grund, warum nur Chrome und Edge unterstützt werden und nicht Firefox?

Gruß Tommy

Ja, das liegt tatsächlich an Firefox selbst.

Es wird ja eine COM-Port Verbindung aufgebaut, die ja eigentlich vollkommen veraltet ist.
Und wenn es nicht eben die Arduinos und ESP´s gäbe, wäre sie vermutlich auch nie in moderne Browser integriert worden (Edge nutzt ja die Chrome Engine).
Firefox hat sich leider dagegen entschieden, das zu unterstützen :man_shrugging:
Für mich als FF-Poweruser auch sehr schade.

Danke für die Info.

Gruß Tommy

Das Projekt kommt so langsam zum Ende.

Das GitHub-Repo ist auf dem neusten Stand und beinhaltet eigentlich alle Erklärungen, Bilder und Links. Das Pinout der drei von mir getesteten Boards ist aufgelistet. Ein schönes Schaltbild fehlt nur noch. Vielleicht noch ein Video von der Installation + Verwendung.

Der Webupdater hat eine sprechendere Seite bekommen (zugegeben etwas KI generiert). Hab dieser aber nicht wirklich viel Energie gewidmet.

Es ist eine vollständige Demo nutzbar, die ein paar Werte simuliert.

Daher hier mal in Kürze die Linksammlung:

Code auf GitHub

Caravan Leveler 2.0 - Demo

Web Firmware-Installer

Der Installer unterstützt aktuell das ESP32 DevBoard (ESP-WROOM-32), den ESP32-C3-Supermini und den ESP32-S3 Dual USB-C.

Die ESP Web Tools sind wirklich wunderbar!

Im Prinzip bettet man nur einen Button und ein klitzekleines JavaScript auf einer Webseite ein. Dazu noch eine Manifest.json, die alle Boardtypen samt den Pfaden zu den Binaries beinhaltet.
(Die Anleitung findet man in Post 15)

Das hatte nicht ganz auf Anhieb geklappt und der ESP-S3 machte noch Probleme. Daher beschreibe ich das Ganze mal etwas detaillierter.

Das esptool nimmt die einzelnen Bestandzeile wie den Code, Bootloader, Partition-Beschreibung und fügt sie in eine einzelne Datei zusammen. Die Datei legt man ab und definiert sie in der Manifest-Datei:

{
  "chipFamily": "ESP32",
  "parts": [
	{ "path": "Caravan_Leveler_2.ino.merged.bin", "offset": 0 },
	{ "path": "spiffs.bin", "offset": 2686976 }
  ]
}

Die spiffs.bin findet man nach dem Aufspielen im Output der Arduino IDE (%temp%\tmp-*-*.spiffs.bin). Leider gibt es aktuell noch keine Möglichkeit die ohne “Upload Spiffs to ESP“ mit angeschlossenem ESP zu erzeugen. Habe dazu mal eine Anfrage an den Entwickler der VSIX gestellt.

Da die “merged.bin” alles enthält, beginnt sie beim offset “0”.

Nun hat mein Webhoster die Eigenheit, Dateien über 10mb zwar hochzuladen und den Erfolg zu bestätigen, sie aber still und heimlich nicht hinzuzufügen.
Der S3 hat 16mb und entsprechend hat die merged.bin 16mb, wovon allerdings 14mb aus 0xff bestehen.
Genau das war die ganze Zeit mein Problem und ich hab´s nicht gesehen (weil ich noch eine andere, ähnlich benannte Datei im Webspace liegen hatte) :roll_eyes:

Aber sei es drum, eine Lösung musste her. Also zurück zu meinen allerersten Versuchen mit Angabe der Speicherbereiche:

{      
  "chipFamily": "ESP32-S3",
  "parts": [		
	{ "path": "ESP32-S3/Caravan_Leveler_2.ino.bootloader.bin", "offset": 0 },
	{ "path": "ESP32-S3/Caravan_Leveler_2.ino.partitions.bin", "offset": 32768 },
	{ "path": "ESP32-S3/boot_app0.bin", "offset": 57344},
	{ "path": "ESP32-S3/Caravan_Leveler_2.ino.bin", "offset": 65536 },
	{ "path": "spiffs.bin", "offset": 2686976 }
  ]
}

Es gibt viele verschiedene Angaben im Internet. Am besten setzt in den Einstellungen der IDE den Haken bei “Show verbose output during“ compile.
Es folgt zwar ein riesen Ausgabetext, dieser hat aber kurz vor dem Upload den merge-Befehl mit den Angaben zum Startbyte und dem Dateipfad der *.bin´s.

Vorsicht: Das Startbyte ist in Hexadezimal, die Manifestdatei benötigt Dezimal!

Dort bekommt man dann auch den Pfad zu der boot_app0.bin Datei heraus.

Kaum macht man das richtig, funktioniert es auch!
Spannender Weise scheint das aufspielen mit der einen großen Datei deutlich schneller zu gehen als mit den 5 in Summe deutlich kleineren.

Zum Schluss war es mir zu nervig alles zusammen zu suchen, kopieren, umzubenennen und auf den Webspace hochzuladen.
Also ChatGpt damit beauftragt eine Liste mit Kopierbefehlen abzuarbeiten, sofern denn die Quelldatei neuer ist als die Zieldatei.
Anschließend sucht sie im Temp-Verzeichnis die neuste SPIFFS-Datei und kopiert auch diese.
In der Manifest.json wird daraufhin die Version mit dem Tagesdatum aktualisiert (2025.10.10).
Hat man WinSCP, kann man auch noch automatisiert dieses Verzeichnis per FTP auf den entsprechenden Webspace schieben.

Nur kompilieren muss man noch selbst :rofl: Das könnte man auch automatisieren, ist aber bei mir schwierig, da ich mehrere portable IDE-Versionen habe und man alles selbst referenzieren müsste.