Aus Raspberry Pi Geek 10/2022

ESP32: Webserver zum Konfigurieren der Einstellungen aufsetzen

© Anthony Brown / 123RF.com

Einstellungssache

Martin Mohr

Bei fertiggestellten ESP32-Projekten lässt sich im Normalfall die Konfiguration nicht mehr nachträglich verändern. Mit einem kleinen Trick gelingt das dennoch.

Sie stellen ein cooles ESP32-Projekt fertig, und ein Kollege möchte es auch benutzen. Genau jetzt fällt Ihnen auf, dass die WLAN-Verbindungsdaten fest im Programm eingebaut sind und Sie für jedes neue Netzwerk ein eigenes Image bauen müssen. Das geht doch eleganter, oder?

Die Idee des Autors besteht darin, den ESP32 mit einer Konfigurationsschnittstelle auszustatten, die es erlaubt, unkompliziert die Parameter für Programme zu verändern und dauerhaft zu speichern. Genau zu diesem Zweck verfügt der ESP32 über einen 4 MByte großen Flash-Speicher. Darin könnte man die WLAN-Verbindungsdaten abspeichern, was das eingangs beschriebene Problem schon einmal zur Hälfte löst. Zusätzlich gilt es, eine einfache Möglichkeit zu schaffen, um die Parameter zu editieren.

Hier hilft die Tatsache, dass der ESP32 bei Bedarf auch selbst als WLAN-Access-Point arbeitet. Es lässt sich entsprechend ein Access Point mit Webserver hochfahren. Dann verbinden wir uns mit einem Client mit dem Netz und editieren die Parameter über diesen Webserver. Um von außen vorzugeben, in welchem Betriebsmodus der ESP32 arbeitet, spendieren wir ihm einen zusätzlichen Schalter. Befindet sich er sich im Konfigurationsmodus, startet der Access Point mit dem Webserver. Im normalen Modus läuft wie gewohnt das Programm in der Funktion loop(). Nach Abschluss der Konfiguration stellen Sie den Schalter wieder auf Normalbetrieb und starten den ESP32 neu.

Testaufbau

Der Testaufbau für dieses Projekt gestaltet sich relativ einfach. Es besteht aus einem NodeMCU-ESP32-Board [1], einem Schalter zur Auswahl des Modus, einer LED und einigen passiven Bauelementen, die wir zum Betrieb der Schaltung benötigen. Die LED soll im normalen Betriebsmodus blinken.

Den Schaltplan des Aufbaus zeigt Abbildung 1. Besonderes Augenmerk verdient hier der 10-µF-Kondensator, der dafür sorgt, dass der Upload von Images in den ESP32 fehlerfrei klappt. Allerdings weisen einige NodeMCU-ESP32-Boards einen Fehler auf, der ein automatisches Hochladen der Images verhindert.

Abbildung 1: Der Schaltplan für den Testaufbau.

Abbildung 1: Der Schaltplan für den Testaufbau.

Bei näherer Betrachtung des Schaltplans fällt auf, dass es am Schalter keinen Pullup-Widerstand gibt. Dessen Aufgabe übernimmt das im ESP32 vorhandene Exemplar, das sich per Software mit dem Kommando pinMode(MODE_SWITCH, INPUT_PULLUP); aktivieren lässt.

Die einzelnen Komponenten der Schaltung sitzen auf zwei kreativ verbundenen Breadboards (Abbildung 2), sodass man an alle Pins des NodeMCU ESP32 gut herankommt. Als Entwicklungsumgebung für die Programme dient die Arduino IDE. Wie Sie sie installieren und einrichten, zeigt der Artikel “Schneller Einstieg” aus RPG 01-02/2022 [2].

Abbildung 2: Der Aufbau auf zwei miteinander verbundenen Breadboards sorgt für optimale Zugänglichkeit der Komponenten.

Abbildung 2: Der Aufbau auf zwei miteinander verbundenen Breadboards sorgt für optimale Zugänglichkeit der Komponenten.

Flash-Speicher

Bevor wir mit dem Projekt starten, sehen wir uns den im ESP32 verbauten Flash-Speicher noch einmal genauer an. Prinzipiell ähneln Flash-Speicher dem guten alten EEPROM (Electrically Erasable Programmable Read-Only Memory). Beide Speichertypen stellen nach einer bestimmten Anzahl von Schreibzyklen ihren Dienst ein – ein wichtiger Punkt, den Sie beim Einsatz dieser Speicher immer beachten müssen.

Der ESP32 verkraftet laut Hersteller bis zu 100 000 Schreibzyklen. Glaubt man einigen Quellen aus dem Internet, quittiert er aber zuweilen auch schon nach nur 10 000 Zyklen den Dienst. Um die Sache kurz zu machen: Auf den Flash-Speicher sollten Sie so wenig wie möglich schreiben. Es ist definitiv keine gute Idee, Messwerte im Sekundentakt darin abzuspeichern. Lesezugriffe auf den Flash-Speicher dagegen sind unkritisch und lassen sich unbegrenzt oft ausführen.

Flash-Speicher tragen ihren Namen deshalb, weil er sich im Vergleich mit EEPROMs blitzschnell beschreiben lässt. Das liegt daran, dass es EEPROMs erlauben, sie byteweise zu löschen und neu zu beschreiben, bei Flash-Speicher funktioniert das hingegen nur blockweise. Der Blockzugriff bringt hier den enormen Geschwindigkeitsgewinn. Der Verzicht auf den byteweisen Zugriff erlaubt zudem eine recht kostengünstige Produktion dieser Art von Speicher. Unser Beispielprogramm schreibt mit der Funktion EEPROM.write() zunächst nur in einen Puffer. Das endgültige Abspeichern im Flash geschieht erst mit dem Aufruf der Funktion EEPROM.commit().

Sowohl EEPROMs als auch Flash-Speicher besitzen die je nach Blickwinkel mehr oder weniger angenehme Eigenschaft, Inhalte ewig zu speichern. Daher kommt es vor, dass schon Daten im Speicher lagern. Sie stammen möglicherweise von einem vorherigen Projekt, oder es handelt sich um Zufallsdaten aus dem Produktionsprozess. Solche Überbleibsel sorgen nicht selten in einem Programm für ernsthafte Probleme. Daher löschen wir den Flash-Speicher des ESP32 vor der ersten Benutzung mit einem Skript (Listing 1).

Der Code löscht die ersten 512 Byte des Flash-Speichers, weil wir im folgenden Programm nur diesen Teil verwenden. Möchten Sie mehr Platz schaffen, passen Sie einfach die Konstante EEPROM_SIZE entsprechend an (Zeile 2). Die erste For-Schleife ab Zeile 6 schreibt Nullen an jede Speicherstelle, der folgende Aufruf EEPROM.commit() speichert die Daten dauerhaft im Flash des ESP32. Als Kontrollinstanz liest die zweite For-Schleife ab Zeile 10 noch einmal alle Speicherstellen aus und zeigt sie auf dem seriellen Monitor an. Es sollten nur Nullen erscheinen. Falls nichts auf dem seriellen Monitor erscheint, drücken Sie noch einmal den Taster EN auf dem NodeMCU-Board, um das Programm neu zu starten.

Listing 1

Flash-Speicher löschen

#include <EEPROM.h>
#define EEPROM_SIZE 512
void setup() {
  Serial.begin(115200);
  EEPROM.begin(EEPROM_SIZE);
  for (int i = 0 ; i < EEPROM_SIZE; i++) {
    EEPROM.write(i, 0);
  }
  EEPROM.commit();
  for (int i = 0 ; i < EEPROM_SIZE; i++) {
    Serial.println(EEPROM.read(i));
  }
}
void loop() {}
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben