Einfache Möglichkeit verschiedene Zugangsdaten zum Laufzeit einzugeben und zu speichern. Zum Beispiel WLAN, Passwort, MQTT Zugangsdaten, NTP Server. Ich habe das Programm INI WiFi-Manager genannt, weil die Daten in einer Konfigurationsdatei im SPIFFS gespeichert werden. Da drin lassen sich alle möglichen Werte und Einstellungen für Ihr Gerät speichern und verwalten. Beim Start des INI WiFi-Managers wird ein Access Point eingerichtet und Sie können mit dem PC oder beliebigen Mobilgerät mit dem Access Point verbinden und über den Browser die Einstellungen Ihres Programms ändern oder ansehen.
- Speichern von Zugangsdaten und beliebigen Einstellungen in setup.ini in SPIFFS
- Editieren und einsehen über Webinterface
- Hochladen (Upload) über Setup Webseite vom Rechner
- Hochladen als SPIFFS –Daten mit Arduino DIE
- Bei Verwendung von FTP in Ihrem Projekt, Hochladen über FTP
- INI-Datei lässt sich gut strukturieren durch Absätze und Kommentare.
- INI-Datei lässt sich leicht um beliebige Parameter erweitern.
- Typische Zeile: Hostname = MeinESP # URL ist http://MeinESP.local
Funktionsweise von INI WiFiManager
Normaler Start: setup.ini wird Zeile für Zeile gelesen und Variablen mit Werten aus INI-Datei gefühlt.
Setup Modus: Es wird ein Access Point mit einem Webserver eingerichtet. Die Hauptseite ermöglicht die Konfigurationsdatei „setup.ini“ zu editieren oder hochzuladen. Auch der Neustart (Reset) über Webinterface kann gemacht werden.
Setup Modus kann auf verschiedene Weisen gestartet werden.
- TXD und RXT vom ESP32 sin verbunden während des Starts
- Vordefinierte Pin mit Masse Verbunden während des Starts. Zum Beispiel GPIO22 (mit LED) beim LOLIN32.
- Setup Modus startet auch wenn es nicht klappt mit WLAN zu verbinden.
- Setup Modus startet wenn INI – Datei fehlt oder SPIFFS sind unformatiert. In dem Fall werden SPIFFS automatisch formatiert und die Konfigurationsdatei „setup.ini“ erzeugt.
Das INI WiFiManager Projekt habe ich in 3 Dateien unterteilt. So wollte ich die Übersichtlichkeit verbessern.
INI.ino – Hauptprogramm und Vorlage für Ihr Projekt.
INIwifimanager.h – Funktionen von WiFiManager
INI_Setup_html.h – Index Webseite Webinterface von WiFiManager
Das Laden der Variablen erfolgt in Funktion „DatenLaden“. Diese Funktion wird beim Lesen jeder Zeile der INI-Datei von INI WiFiManager ausgeführt. Es werden 2 Strings übergeben: Parameter und Wert. Ganz wichtig! Argument wird in Kleinbuchstaben umgewandelt unabhängig davon wie es in der INI – Datei steht. Also bitte den suchenden Text in Kleinbuchstaben eingeben.
1 2 3 4 5 6 |
void DatenLaden (String argument, String Wert) { if (argument.indexOf ( "ssid" ) >= 0) ssid = Wert; if (argument.indexOf ( "passwort" ) >= 0) password = Wert; if (argument.indexOf ( "hostname" ) >= 0) host = Wert; } |
Weitere Möglichkeiten verschiedene Datenarten einzulesen
Zugangsdaten für Setup Modus, wenn noch nichts eingestellt ist, sind
SSID: astral
Passwort: tiramisu
IP: 192.168.4.1
Dass kann aber in der Datei „INIwifimanager.h“ in Zeilen 11 und 13 geändert werden.
Quellcode Arduino Sketsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#include <WiFi.h> #include <ESPmDNS.h> #include <SPIFFS.h> #include <WiFiClient.h> #include <string.h> #include <FS.h> #include <WebServer.h> WebServer server(80); #define debug true #define SetupPin 22 // INI wifimanager starten mit LOW-Pegel an SetupPin #include "INIwifimanager.h" String ssid, password, host; //****************************************************************************** // Diese Funktion wird beim lesen eder Zeile der INI-Datei ausgeführt * //****************************************************************************** void DatenLaden (String argument, String Wert) { if (argument.indexOf ( "ssid" ) >= 0) ssid = Wert; if (argument.indexOf ( "passwort" ) >= 0) password = Wert; if (argument.indexOf ( "hostname" ) >= 0) host = Wert; } void setup() { char inser; Serial.begin(115200); Serial.println(""); if (!INI_Einlesen()) Einstellen(); // INI -Datei einlesen, wenn geht nicht, starte INI WiFiManager //****************************************************************************** // Setup Weiche, Erkennen ob TXD/RXD gebrückt sind * //****************************************************************************** while (Serial.available())inser = Serial.read(); // RX - Buffer leern Serial.println("Start"); delay(10); inser = Serial.read(); if (inser != 'S') goto weiter; inser = Serial.read(); if (inser != 't') goto weiter; Einstellen(); // starte INI WiFiManager wenn TXD / RXD verbunden sind weiter: //****************************************************************************** pinMode(SetupPin, INPUT_PULLUP); // starte INI WiFiManager wenn SetupPin Low ist if (!digitalRead(SetupPin)) Einstellen(); //****************************************************************************** // Starte WiFi Verbindung * //****************************************************************************** if (debug)Serial.println("Warte auf Verbindung"); WiFi.mode(WIFI_STA); WiFi.begin(ssid.c_str(), password.c_str()); Serial.println(""); int timeout = 20; // versuche 10 sekunden zu verbinden while (WiFi.status() != WL_CONNECTED) { delay(500); if (debug) Serial.print("."); timeout--; if (!timeout) { if (debug) Serial.println(""); if (debug) Serial.println("Verbindung zum " + ssid + " klappt nicht!"); Einstellen(); // starte INI WiFiManager, wenn verbindung mit WLAN fehlschlaegt } } if (debug) Serial.println(""); if (debug) Serial.print("IP Addresse: "); if (debug) Serial.println(WiFi.localIP()); MDNS.begin(host.c_str()); if (debug) Serial.println("Offnen Sie http://"+ host +".local in Ihrem Browser"); server.onNotFound([]() { server.send(404, "text/plain", "FileNotFound"); }); server.on("/", []() { // index.html an Browser senden File file = SPIFFS.open("/index.html", "r"); size_t sent = server.streamFile(file, "text/html"); file.close(); }); server.begin(); if (debug)Serial.println("HTTP Server gestartet"); } void loop() { server.handleClient(); } |
Download Projekt
Download Arduino Projekt INI WiFiManager, es wird Bibliothek WebServer_tng benötigt.
Hier habe ich für Sie bereits kompiliertes Programm bereitgestellt.
Download INI WIFI-Manager_Firmware Sie haben die Möglichkeit ohne Arduino und ohne jegliche Installation die Firmware (BIN-Datei) in das ESP32-Modul zu laden. Ein Tool und die BAT-Datei mit Kommandozeilenbefehlen sind im Archiv enthalten. Sie müssen lediglich in der Bath-Datei den richtigen COM-Port einstellen und dann diese Datei ausführen.
So können Arrays mit Daten gefüllt werden.
Beispiel Relais zum GPIOs Zuordnung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int Relais[4]; // Zuordnung von Relais zu GPIOs void DatenLaden (String argument, String Wert) { String Aufzaeleung; int Nr; String NrStr; Aufzaeleung = "relais"; // Relais0 = 19 # Relais 0 an GPIO 19 angeschlossen if (argument.startsWith ( Aufzaeleung ) > 0) { NrStr = argument.substring ( Aufzaeleung.length()); Nr = NrStr.toInt(); Relais[Nr] = Wert.toInt(); } } // Im Setup for (int i = 0; i < 4; i++) pinMode(Relais[i], OUTPUT); |
digitalWrite(Relais[2], 1); // Relais 2 einschalten
digitalWrite(Relais[3], 0); // Relais 3 ausschalten
2 Werte getrennt durch „/“ Zeichen einlesen Zum Beispiel
Zugangsdaten = MeinWiFi/MeinPasswort # kommentar
1 2 3 4 5 6 7 8 9 10 11 |
String wert1, wert2; void DatenLaden (String argument, String Wert) { if (argument.indexOf ( "zugangsdaten" ) >= 0) { int inx = Wert.indexOf ( "/" ) ; // 2 Werte getrent durch "/" Zeichen wert1 = Wert.substring ( 0, inx ) ; // Zugangsdaten = MeinWiFi/MeinPasswort wert2 = Wert.substring ( inx + 1 ) ; } } |
Integer, Float, C String einlesen
1 2 3 4 5 6 7 8 9 10 |
int zahl; const char* cstring; float gleitkomazahl; void DatenLaden (String argument, String Wert) { if (argument.indexOf ( "zahl" ) >= 0) zahl = Wert.toInt(); if (argument.indexOf ( "cstring" ) >= 0) cstring = Wert.c_str(); if (argument.indexOf ( "gleitkomazahl" ) >= 0) gleitkomazahl = Wert.toFloat(); } |
Zugangsdaten für Mehrere WLAN-Netzwerke anlegen
Das Bibliothek WiFiMulti.h ermöglicht die Eingabe von mehreren Zugangsdaten.
ESP32 verbindet sich mit einem eingetragenen WiFi-Netzwerk. Sind mehrere eingetragene WiFi-Netzwerke in der Reichweite, wird es mit WiFi-Netzwerk mit Stärkstem Signal verbunden.
Inhalt der INI – Datei bei WifiMulti Modus
# WLAN Einstellungen
Zugangsdaten = Test/Pass
Zugangsdaten = O2Box/4365765467654
Zugangsdaten = kischkin/karamba
Hostname = MeinESP # URL ist http://MeinESP.local
1 2 |
#include <WiFiMulti.h> WiFiMulti wifiMulti; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void DatenLaden (String argument, String Wert) { String wert1, wert2; if (argument.indexOf ( "zugangsdaten" ) >= 0) { int inx = Wert.indexOf ( "/" ) ; // 2 Werte getrent durch "/" Zeichen wert1 = Wert.substring ( 0, inx ) ; // Zugangsdaten = MeinWiFi/MeinPasswort wert2 = Wert.substring ( inx + 1 ) ; wifiMulti.addAP(wert1.c_str(), wert2.c_str()); } if (argument.indexOf ( "hostname" ) >= 0) host = Wert; } |
Das Wort „Zugangsdaten“ kommt 3 Mal in der setup.ini Datei vor. Es wird entsprechend 3 Mal die Funktion wifiMulti.addAP(wert1.c_str(), wert2.c_str());
ausgeführt. So werden die Zugangsdaten für 3 WiFi – Netzwerke eingetragen.
An das WifiMulti angepasste Setup Funktion.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
void setup() { char inser; Serial.begin(115200); Serial.println(""); if (!INI_Einlesen()) Einstellen(); // INI -Datei einlesen, wenn geht nicht, starte INI WiFiManager //****************************************************************************** // Setup Weiche, Erkennen ob TXD/RXD gebrückt sind * //****************************************************************************** while (Serial.available())inser = Serial.read(); // RX - Buffer leern Serial.println("Start"); delay(10); inser = Serial.read(); if (inser != 'S') goto weiter; inser = Serial.read(); if (inser != 't') goto weiter; Einstellen(); // starte INI WiFiManager wenn TXD / RXD verbunden sind weiter: //****************************************************************************** pinMode(SetupPin, INPUT_PULLUP); // starte INI WiFiManager wenn SetupPin Low ist if (!digitalRead(SetupPin)) Einstellen(); //****************************************************************************** // Starte WiFi Verbindung * //****************************************************************************** if (debug)Serial.println("Warte auf Verbindung"); Serial.println(""); if (wifiMulti.run() != WL_CONNECTED) Einstellen(); if (debug) Serial.println("Verbunden mit " + WiFi.SSID()); if (debug) Serial.print("IP Addresse: "); if (debug) Serial.println(WiFi.localIP()); MDNS.begin(host.c_str()); if (debug) Serial.println("Offnen Sie http://" + host + ".local in Ihrem Browser"); // restlich code genau wie Oben |