ESP8266: WiFi Passwort etc. ohne Programmieren speichern

Wenn man eine größere Anzahl von ESP8266 basierten Sensoren gebaut hat, ist es unter Umständen etwas nervig, individuelle Parameter im Arduino IDE einzutragen und dann jedes Mal die einzelnen Sensoren mit maßgeschneiderter Individual-Software zu bespielen.

Das gilt um so mehr, wenn man zusätzlich MQTT Parameter eintragen muss oder die Dinger in anderen – ggf. im Voraus nicht bekannten – WiFi Netzen einsetzen will. Hat man ein schönes Gehäuse gebastelt oder den Controller sonstwie verbaut, ist es doppelt nervig.

Ich habe mir verschiedene Lösungen angeschaut, den ESP8266 ohne Neu-Programmieren ins Netz zu bringen – von easy bis komplex :

Update Mai 2024: Durch verschiedene andere Projekte habe ich das IDE auf die Version 2 umgestellt und dabei notgedrungenermaßen einige neue Libraries installiert. Das hatte dann zur Folge, dass meine unten stehenden Sketches nicht mehr funktionierten – das heißt nach dem Einstellen der Credentials ist der Sketch genau einmal durchgelaufen und dann nicht mehr. Nach vielem Rumprobieren habe ich das Problem gelöst, indem ich den Connect explizit mit einem WiFi.begin(); gestartet habe. Die Stelle ist in den Sketches farblich hervorgehoben und kommentiert. Jetzt funktioniert auch die neueste Version des WiFiManagers (2.0.17).

1 – WiFi Setup mit WPS

Der schon verschiedentlich erwähnte Distributor AZ-Deliveries in Deggendorf gibt sich einige Mühe, die Nutzer seiner Produkte mit Anleitungen und Tipps zu versorgen – herzlichen Dank dafür!

Willst Du nur deine WiFi Anmeldedaten wie PSK und SSID flexibel erfassen, ohne den Sketch neu zu kompilieren, dann hilft dir diese gut gemachte Anleitung weiter.

Über einen angeschlossenen Button wird die WPS Routine gestartet, drückt man dann noch die WPS Taste am Router, werden die Daten automatisch übertragen und in einem besonderen Speicherbereich des Controllers abgelegt.

Leider kann ich damit nur die WiFi Einstellungen vornehmen. Andere Daten müssen nach wie vor programmiert werden. Hat man keinen physischen oder administrativen Zugriff auf den Router, hilft die Anleitung leider nichts!

2 – Konfiguration mit der WiFi Manager Library

Einen großen Schritt weiter geht die geniale WiFi Manager Library, die wir in unser IDE einspielen können.

Library Manager des alten Arduino IDE

Sie stellt einen temporären Konfigurations Accesspoint (Captive Portal) mit Webserver, Konfigurationsdialog und WiFi Parameter Handling zur Verfügung. Und nicht nur das. Es lassen sich auch weitere Daten interaktiv eintragen, die im Controller EEPROM hinterlegt werden und sich später programmgesteuert verwenden lassen. Bei mir sind das der MQTT Server, der dazugehörige Username, das MQTT Passwort und die MQTT Topics (Pfade), die ich für die Ablage meiner Messwerte brauche.

Abbildung 1: WiFi Manager Startseite

 

Abbildung 2: Konfigurationsseite mit Erweiterung für MQTT Parameter.

Zum Starten der Konfiguration gibt es wiederum mehrere Möglichkeiten:

2a – Konfiguration nur, wenn keine Verbindung zum WLAN

Hat man den Controller in eine "fremde Umgebung" gebracht und schaltet den Sensor (oder whatever) ein, kann er sich notgedrungen nicht mit dem bekannten WLAN connecten und startet deshalb den Accesspoint zur Konfiguration. Mit einem Smartfone, Tablet oder PC kann man das temporär aufgespannte Netz suchen – bei mir heißt es "RustiSensor" sonst eigentlich "OnDemandAP".  Nach dem Verbinden wird (zumindest bei Apple Endgeräten) automatisch die Konfigurationsseite aufgerufen. Falls nicht, mit dem Browser einfach zu 192.168.4.1 navigieren.

Die Basics findet ihr auf der Github Seite des WiFi Manager Autors: https://github.com/tzapu/WiFiManager. Dort findet sich auch eine Reihe von sehr schönen Anwendungsbeispielen.

Überhaupt auf die Idee gebracht wurde ich von Rui Santos aus Portugal, der eine hervorragende, englischsprachige Site namens randomnerdtutorials.com betreibt und auch viele kostenpflichtigen Tutorials zum Arduino, ESP8266 und ESP32 anbietet. Der eigentliche – kostenlose –  Beitrag befindet sich hinter diesem Link.

Von ihm habe ich auch die Code Snippets für die Verwendung von JSON zur Verarbeitung der abgelegten Parameter. Sein Beitrag ist schon etwas älter und verwendet die JSON Bibliothek der Version 5.x.x. Neuer wäre die Version 6.x.x., aber die ist von der Syntax her nicht kompatibel. Ich habe deshalb im Library Manager die höchstverfügbare 5er Version 5.13.5 ausgewählt.


Abbildung 3: Auswahl älterer Library Version

Alternativ könnte man auch den Code auf Bibliotheksversion 6.x.x umschreiben oder ein ganz eigenes Stringhandling im Code einbauen – z.B. durch Zusammenfassen und Wegspeichern der Extradaten in einem langen String bzw. umgekehrt.

Nebenbei bemerkt: das String bzw. Char Array Handling des Arduino C Dialekts ist richtig grottig. Sowas von unkomfortabel. Python ist da wesentlich einfacher.

Ferner habe ich das neuere LittleFS anstatt SPIFFS zum Speichern der Daten im EEPROM verwendet. Die Compilerwarnungen "…deprecated…" haben zu sehr genervt.

Der Sketch

Für diejenigen, die es interessiert, hier noch der von mir – mit Leihgaben – produzierte Code für einen DHT22 Sensor und MQTT auf Basis eines D1 Mini Controllers. Alle Routinen stecken im Setup {} Bereich, da der Sketch nur einmal durchläuft, anschließend den Controller schlafen legt, um nach dem Aufwachen wieder von vorne anzufangen.

Für viele Fälle reicht das. Nachteil ist natürlich, dass man nicht so ohne Weiteres  an die MQTT Parameter herankommt, wenn man sie einmal gespeichert hat. Entweder geht man mit dem Microcontroller und dessen Stromversorgung nach draußen, wo es keinen Empfang gibt oder man schaltet das WLAN kurz ab – in beiden Fällen würde dann das so genannte "Captive Portal" aufgerufen. Vorteil dieser Lösung ist, dass man keine zusätzliche Hardware verlöten muss.

2b – Konfiguration mit Button starten

Elegant wäre es, wenn man die Konfiguration per Knopfdruck starten könnte – ganz ähnlich wie bei den professionellen Sensoren à la Shelly. Hierzu liefert der Autor des WiFi Managers ein schönes Beispiel, das ich entsprechend modifiziert habe. Im Original ist die Routine im Loop{} Bereich untergebracht und kann jederzeit mittels Knopfdruck gestartet werden.

Da mein Sensor ja die Loop{} Schleife nicht nutzt und immer nur ein paar Sekunden aktiv ist, habe ich die entsprechenden Kommandos in den Setup{} Bereich gepackt und mit der Buttonabfrage versehen.

Der Button wird an einem freien GPIO Pin des Controllers angeschlossen und zieht beim Drücken den Pin auf Low – also gegen Masse. Ein Fritzing Diagramm dafür findet ihr weiter unten.

Ich habe aus bautechnischen Gründen den Pin D4 bzw GPIO 2 verwendet. Die Platine aus dem letzten D1 Mini Beitrag habe ich entspreched angepasst und einen Drucktaster   auf der Rückseite der Trägerplatine zwischen D4 und GND eingelötet.

Abbildung 4: Rückseite mit eingelötetem Button

Die Stromversorgung erfolgt mittels vier AA Akkus, die nominell 4,8 V liefern und somit an den 5V Anschlusspin gelötet werden. Dieser verträgt Spannungen von 3 bis 7V

Der Sketch

Funktioniert schon ganz gut. Ein Nachteil ist allerdings, dass die geänderten Daten nur dann gespeichert werden, wenn man auch die SSID und das WLAN Passwort (PSK) wieder einträgt.

Abbildung 5: Versuchsaufbau auf Breadboard

Abbidung 6: Fritzing Diagramm (Reset Verbindung zwischen D0 und RST – grün – Jumper)

Wenn ihr tiefer einsteigen wollt, kann ich euch das Kapitel über den D1 Mini in Wolles Elektronikkiste nur wärmstens empfehlen!

Wie immer: Fragen oder Kritik sind erwünscht – Kommentarfunktion.

4 Gedanken zu „ESP8266: WiFi Passwort etc. ohne Programmieren speichern

  1. Hallo
    genau das hab ich schon lange gesucht ! Bin 71 Jahre jung und versuche meine grauen Zellen in Schuss zu halten, lerne begierig Alles zum Thema IOT.
    Betreibe auch ca 12 ESP8266 Mini D1 und andere boards mit meinem Netzwerk /Mosquitto und Node red .

    Ich habe den ersten Scetch, meine Arduino IDE compilieren lassen
    und nach Änderung auf die V5.x .Json-version wird bei mir der Code auch fehlerfrei bis auf folgenden
    Eintrag übersetzt :
    exit status 1
    'MQTTClient' does not name a type

    Was kann, sollte ich andern ?

    Vielen Dank im Vorraus

    Martin

    1. Hallo,
      ja Programmieren hält die grauen Zellen frisch.
      Zu deinem Problem: Könnte es sein, dass du die MQTT Library noch nicht installiert hast? https://github.com/256dpi/arduino-mqtt
      Oder über Werkzeuge–>Bibliotheken verwalten–> in Suchfeld rechts oben MQTT eingeben und nachher die Library MQTT by Joel Gaehwiler auswählen.
      Viel Glück und weiter viele gelungene Projekte.
      Chris

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert