Grundlagen
Der ESP8266 verfügt je nach Bestückung des verwendeten ESP-Moduls über ein Flash Speicher, der von 512 Byte bis zu 16KByte reichen kann.
Beim ESP wird hiervon fester Bereich von 4096 Byte für eine „qasi“ EEProm reserviert, welches vom Programm gelesen und auch beschrieben werden kann. Diese Daten bleiben wie das Programm nach einem Neustart erhalten.
Die Größe dieses für den EEProm reservierten Bereichs ist in der spi_flash.h unter SPI_FLASH_SEC_SIZE (4096) definiert.
EEproms eignet sich perfekt zum speichern non Daten bzw. von Daten Strukturen, die nach einem Neustart des ESP wieder zur Verfügung stehen sollen.
Da es sich hierbei aber immer noch um eine Flash Ram handelt und diese vom Hersteller mit einer maximalen beschreibbarkeit von ca. 10.000 mal angegeben werden, sollten hier nur Daten gespeichert werden, die keiner häufigen oder gar zyklischen Änderung unterliegen.
Deshaln eignet sich dieser Speicher auch nicht für Messdaten, für Konfigurationsdaten, die sich aber nur selten ändern, ist er perfekt.
Verwendung
Die definition erfolgt als Arduino-typischer Klassenkonstruktor mit der Klasse EEPROMClass, diese stellt eine Reihe vordefinierter Funktionen bereit, die für das Handling mit dem EEProm notwendig sind.
Mit „void EEPROMClass::begin(size_t size)“ wird das Objekt zunächst initialisiert.
Dabei wird ein interner Puffer mit Namen _datain der angegeben Größe angelegt.
In diesen Bereich, der nun als EEPROM deklarierte ist, wird nun der Puffer eingelesen.
Alle nachfolgende Lese- bzw. Schreib Operationen in disem Zwischenpuffer.
Dieser Zwischenpuffer wird erst dann in den Flash Speicher übertragen, wenn man dies mit der Methode EEPROM.commit(); anfordert oder das Programm die Operation mit einem EEPROM.end(); abschließt.
Die internen Variablen _dirty vermerkt, ob eine Änderung des Dateninhalts stattgefunden hat. Ein Zurückschreiben des Pufferinhalts erfolg deshalb nur dann, wenn auch eine Änderung stattgefunden hat.
Die Methode getDataPtr() liefert den Zeiger auf den internen Pufferspeicher. Bei einem Aufruf dieser Methode wird _dirty gesetzt, da der Pufferinhalt über diesen Zeiger abgeändert werden könnte.
Der Kalssenaufruf EEPROMClass benötigt beim Konstruktor die Angabe der Speicheradresse (Sektornummer) in EEPROM.cpp, _SPIFFS_end ergibt sich aus der in der IDE festgelegten SPIFFS-Konfiguration.
Die vordefinierte Instanz der Klasse EEPROM wir folgt angelegt:
EEEPROMClass EEPROM((((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE));
Um z.B. Konfigurationsdaten in Verbindung mit dem EEPROM zu lesen und zu speichern, bietet es sich an die Daten in einer Structur zu verwalten.
typedef struct { int PHysteresisH1 = 10; // Fall Back Hysteresis für Relais int PThresholdH1 = 100; // Schwellwert für Relais int PHysteresisL1 = 10; // Fall Back Hysteresis für Relais int PThresholdL1 = 50; // Schwellwert für Relais int PRelaisStateL1 = 0; // 0- NO / 1- NC int PRelaisStateH1 = 0; // 0- NO / 1- NC int PRelaisStateErr = 1; // 0- NO / 1- NC int PSerialOutState = 0; // 0- OFF / 1- ON int PWifiState = 0; // 0- OFF / 1- ON int PMode = 0; // 0= relative / 1= Absolut Druck int PACMode = 0; // 0= keine Autocalibration / 1= Autokalibration int PDeltaAC = 10; // Maximale Abeichung Druckdifferenz int PCalibrationTime = 5000; // Calibration Counter Time in ms unsigned long PHoldTime = 500; // Für Abfallverzögerung in ms } PSettings; PSettings psettings;
Um Speicherplatz zu sparen, sollte der Pufferspeicher nicht größer als notwendig initialisiert werden. Die Maximale Größe beträgt 4096.
Lesen von Daten aus dem Pufferspeicher
EEPROM.begin(1024); // Puffergröße die verwendet werden soll EEPROM.get(512, psettings); // Anfangsadresse bei der die definierte Structur abgelegt ist EEPROM.end(); // schließen der EEPROM Operation
Schreiben von Daten in den Pufferspeicher und anschließende Übernahme in den Flash mit commit()
EEPROM.begin(1024); EEPROM.put(0, settings); //Schreiben einer zweiten Structur ab Adresse 0 EEPROM.commit(); EEPROM.end();
Quellen Verweise:
www.ullisroboterseite.de
www.kriwanek.de