Schlagwort-Archive: put

ESP8266 EEProm richtig verwenden

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.

Quelle: www.ullisroboterseite.de
Quelle: www.ullisroboterseite.de

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