Der ESP8266 bietet 4kByte EEPROM (Adafruit Huzzah), welches durch das Programm gelesen und beschrieben werden kann. Es eignet sich ideal zum Speichern von sich nicht allzu häufig ändernden Daten, wie z.B. Konfigurationen. Zu beachten ist, dass das EEPROM nur einige 10.000 Schreibzyklen verkraftet. Deshalb wird das Speichern von Messdaten nicht empfohlen. Konfigurationsdaten ändern sich nur selten, sind also dort gut aufgehoben.

Natürlich kann man seine Programmkonfiguration auch im Programm selbst als Konstanten vereinbaren. Bei jeder Änderung muß dann jedoch das Programm angepasst und neu auf den Chip hochgeladen werden. Dieses Dokument beschreibt einen Sketch, welcher Konfigurationen im EEPROM ablegt und von dort auch einlesen kann.

 

EEPROM Library

Im Hauptprogramm muß folgende Library eingebunden werden:

#include <EEPROM.h>

Des weiteren sind die eigenen Datenstrukturen einzubinden:

#include "myTypes.h"

 

Definition der Datenstruktur

Da man Variablentypen nicht byteweise ins EEPROM schreiben möchte, definiert man sich eine eigene Datenstruktur mit allen Parametern. Diese wird als eigene Tab in der Arduino IDE mit dem Filenamen 'myTypes.h' angelegt und ist folgendermassen aufgebaut:

#ifndef myTypes_h
#define myTypes_h

#include <WString.h>

// Types 'byte' und 'word' doesn't work!
typedef struct {
  int valid;                        // 0=no configuration, 1=valid configuration
  char SSID[31];                    // SSID of WiFi
  char password[31];                // Password of WiFi
  int  useMQTT;                     // 0=Don't use, 1=use MQTT
  char MQTTHost[31];                // Ip address or hostname of MQTT broker
  char MQTTPort[11];                // Port of MQTT broker
  char MQTTpubCH0[61];              // MQTT publish CH0 topic
  char MQTTpubCH1[61];              // MQTT publish CH1 topic
  char MQTTsubCH0[61];              // MQTT subscribe CH0 topic
  char MQTTsubCH1[61];              // MQTT subscripe CH1 topic
  int useCH0;                       // 0=Don't use, 1=use channel 0
  int useCH1;                       // 0=Don't use, 1=use channel 1
} configData_t;

#endif

Das Strukturtemplate wird als 'configData_t' benannt und kann NICHT in einer normalen .ino-Datei vereinbart werden, es muß eine Datei mit der Endung '.h' sein. Der Dateiname muß dem im Hauptprogramm entsprechen:

#include "myTypes.h"

Im Hauptprogramm kann das Strukturtemplate über

configData_t cfg;

auf den Variablennamen 'cfg' zugewiesen werden.

 

EEPROM-Funktionen

EEPROM löschen

Für das Löschen wird folgende Funktion erstellt:

void eraseConfig() {
  // Reset EEPROM bytes to '0' for the length of the data structure
  EEPROM.begin(4095);
  for (int i = cfgStart ; i < sizeof(cfg) ; i++) {
    EEPROM.write(i, 0);
  }
  delay(200);
  EEPROM.commit();
  EEPROM.end();
}

Gegenüber der Programmierung von Arduino-Boards ist neu, dass erst geschrieben wird, wenn ein 'EEPROM.commit()' aufgerufen wird. Anschließed wird der RAM-Puffer mit 'EEPROM.end()' wieder freigegeben. Das EEPROM wird durch diese Routine mit '0' beschrieben.

 

EEPROM-Parameter schreiben

Das Schreiben erfolgt ebenfalls sehr einfach über die Funktion

void saveConfig() {
  // Save configuration from RAM into EEPROM
  EEPROM.begin(4095);
  EEPROM.put( cfgStart, cfg );
  delay(200);
  EEPROM.commit();                      // Only needed for ESP8266 to get data written
  EEPROM.end();                         // Free RAM copy of structure
}

'cfgStart' ist eine globale Variable, welche die Startdresse der Struktur im EEPROM enthält.

 

EEPROM-Parameter auslesen

Das Auslesen der Parameter ins RAM erfolgt analog:

void loadConfig() {
  // Loads configuration from EEPROM into RAM
  EEPROM.begin(4095);
  EEPROM.get( cfgStart, cfg );
  EEPROM.end();
}

 sdf

 

Parameter im Programm benutzen

Im Sketch muß man nach dem Boot in setup() die Parameter vom EEPROM ins RAM laden:

loadConfig();

und kann jetzt auf sie zugreifen und sie ggf. auch modifizieren:

Serial.print(cfg.SSID); // Ausgeben des Werts auf der Konsole
cfg.password = "MeinPasswort";

Wichtig ist, dass der Parameter aus der Datenstruktur vom Prefix 'cfg.' angeführt wird.

 

Download des Programms

Das Programm befindet sich im Downloadbereich.