====== Konfigurations-Webseite für WLAN-Einstellungen im EEPROM-Speicher ====== [[uebung:itt11:beispielcode_esp8266|zurück zur Übersicht]] **Achtung:** Dieses Beispiel besteht aus 2 Dateien, welche beide im Sketch-Ordner liegen müssen. /* * Dieses Beispiel zeigt, wie der EEPROM-Speicher dazu verwendet werden kann, * Zugangsdaten für die WiFi-Verbindung variabel zu speichern und bei Bedarf * zu ändern, ohne dass die Firmware neu geflasht werden muss. * Zu diesem Zweck versucht sich der Microcontroller zu einem fest vorgegebenen * Konfigurations-Hotspot zu verbinden. Wenn dieser auffindbar ist, startet er * die Konfigurations-Webseite und lässt sich konfigurieren. Wenn die Verbindung * fehlschlägt, startet der Microcontroller ganz normal. Die Wartezeit für den * Hotspot beträgt bei diesem Beispiel 5 Sekunden (10 * 500ms). * * Der HTML-Code für die Webseite befindet sich in der Datei strings.h, diese darf * nicht fehlen. */ #include #include #include #include "strings.h" // PP-Direktiven #define EEPROM_SIZE 512 #define SSID_SIZE 32 #define SSID_ADDR 0 #define PASS_SIZE 64 #define PASS_ADDR 32 // forward declarations void readEEPROMwifi(char *ssid, char *passphrase); void writeEEPROMwifi(char *ssid, char *passphrase); void handleRoot(); void handleSetWifi(); void handleReset(); // Konstanten const char* cssid = "configAP"; // Access Point-SSID für den Konfigurationsmodus const char* cpassword = "configPassphrase"; // Kennwort für den AP im Konfigurationsmodus const char* hostname = "myMicrocontroller"; char ssid[SSID_SIZE]; char password[PASS_SIZE]; // Variablen ESP8266WebServer server(80); // Instanz für den Konfigurations-Webserver bool configMode = false; /** * Setup */ void setup() { Serial.begin(115200); Serial.setDebugOutput(true); Serial.println(); /* ******** config mode ******** */ Serial.println("Trying config mode, searching for config AP"); WiFi.begin(cssid, cpassword); WiFi.setHostname(hostname); int configCount = 0; while (WiFi.status() != WL_CONNECTED && configCount < 10) { delay(500); configCount++; Serial.print("."); } Serial.println(""); if (WiFi.status() != WL_CONNECTED) { Serial.println("Skipping config Mode"); } else { Serial.println("WiFi connected to config AP"); Serial.print("Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect"); configMode = true; } server.on("/", handleRoot); server.on("/setwifi", handleSetWifi); server.on("/reset", handleReset); server.begin(); if (configMode) { return; } /* ******** no config mode ******** */ /* WiFi connection */ readEEPROMwifi(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.print(" using "); Serial.println(password); WiFi.begin(ssid, password); WiFi.setHostname(hostname); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print(WiFi.localIP()); } /** Loop */ void loop() { if (configMode) { server.handleClient(); } else { Serial.println("Faul sein ist wunderschön, denn die Arbeit hat noch Zeit. (Pipi Langstrumpf)"); delay(5000); } } /** * read ssid and passphrase from eeprom and write into given char arrays */ void readEEPROMwifi(char *ssid, char *passphrase) { EEPROM.begin(EEPROM_SIZE); // read ssid from eeprom for (int i = 0; i < SSID_SIZE; i++) { ssid[i] = char(EEPROM.read(SSID_ADDR + i)); } // read passphrase from eeprom for (int i = 0; i < PASS_SIZE; i++) { passphrase[i] = char(EEPROM.read(PASS_ADDR + i)); } // end eeprom access EEPROM.end(); } /** * write given ssid and passphrase into corresponding eeprom space */ void writeEEPROMwifi(char *ssid, char *passphrase) { EEPROM.begin(EEPROM_SIZE); // write ssid to eeprom for (int i = 0; i < SSID_SIZE; i++) { EEPROM.write(SSID_ADDR + i, ssid[i]); } // write passphrase to eeprom for (int i = 0; i < PASS_SIZE; i++) { EEPROM.write(PASS_ADDR + i, passphrase[i]); } // commit write and end access EEPROM.commit(); EEPROM.end(); } /** * handle GET request for root page access */ void handleRoot() { server.send(200, "text/html", sRootPage); } /** * handle request for set wifi action */ void handleSetWifi() { String ssid_str = server.arg("ssid"); String passphrase_str = server.arg("passphrase"); char ssid[SSID_SIZE]; char passphrase[PASS_SIZE]; ssid_str.toCharArray(ssid, SSID_SIZE); passphrase_str.toCharArray(passphrase, PASS_SIZE); writeEEPROMwifi(ssid, passphrase); server.send(200, "text/html", sSetWifiHandler); readEEPROMwifi(ssid, passphrase); } /** * handle request for reset * */ void handleReset() { server.send(200, "text/plain", "rebooting"); delay(500); ESP.restart(); } #pragma once String sRootPage = "\r\n\ \r\n\ \r\n\ \r\n\ \r\n\ Login Form\r\n\ \r\n\ \r\n\ \r\n\

Konfiguration

\r\n\
\r\n\

WiFi-Zugangsdaten festlegen

\r\n\

\r\n\ \r\n\
\r\n\ \r\n\
\r\n\ \r\n\

\r\n\

\r\n\
\r\n\

Controller neu starten

\r\n\

\r\n\ \r\n\

\r\n\
\r\n\ \r\n\ \r\n"; String sSetWifiHandler = "

WiFi-Konfiguration

\r\n\

WiFi-Einstellungen wurden gespeichert. Für weitere Einstellungen zurück.
\r\n\ Zum Aktivieren der Einstellungen bitte neu starten und Access Point deaktivieren.

\r\n";