INI WiFiManager

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.

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

#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

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

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
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

#include <WiFiMulti.h>
WiFiMulti wifiMulti;
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.

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