ESP8266 et OTA et eeprom

Bonjour,

La fonction OTA est superbe et en particulier la mise à jour automatique d'un programme juste en changeant la source sur un serveur mais j'utilise aussi l'éeprom pour stocker quelques variables.

La base OTA

/* 
 * 

  @ Auther     : Young-min Ji (E-Mail : sookmook@sookmook.org)
  @ Period     : From 2021/05/15 To 2021/05/19
*****************************************************************************/

#include <stdio.h>
#include <string.h>
#include <ESP8266WiFiMulti.h>                                  //#include <WiFiMulti.h> pour esp32
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>                                 //#include <HTTPClient.h> pour esp32
#include <ESP8266httpUpdate.h>                                 //#include <HTTPUpdate.h>pour esp32
#include <ArduinoOTA.h>
#include <EEPROM.h>

long cv = 1676492214 ;                                         //  valeur de la date du fichier bin enregistré

#define WIFI_CONNECT_SSID "xxx"                                 // Mettre le ssid de la box
#define WIFI_CONNECT_PSWD "yyyyyyyy"                           // et son password
#define WIFI_CONNECT_WAIT_TIME  500
#define WIFI_CONNECT_WAIT_LIMIT 20
ESP8266WiFiMulti  wifiMulti;                                   // WiFiMulti wm ;pour esp32

String otaDirURL      = "http://zzzzzzzzzz/bin/" ;         // To edit for your own code.
String otaCheckURL    = otaDirURL + "otaCheck.php" ;
String otaBinFilename = "truc.bin" ;                           // To edit for your own code.
String otaBinURL      = otaDirURL + otaBinFilename ;
 
void ReSet(){
  ESP.restart() ;  }

void Connect2Network(){
  int cc = 0 ;
  WiFi.persistent(true);                                    // save WiFi configuration in flash - optional
  WiFi.setAutoReconnect(true);
  Serial.println("--------------------------------------------------") ;
  Serial.printf("Try connecting to WiFi with SSID '%s'\n", WIFI_CONNECT_SSID) ;
  wifiMulti.addAP(WIFI_CONNECT_SSID, WIFI_CONNECT_PSWD) ;        // et les autres ssid
  
  
  
  delay(WIFI_CONNECT_WAIT_TIME) ;
  while (wifiMulti.run() != WL_CONNECTED) {
      if (cc++ >= WIFI_CONNECT_WAIT_LIMIT) {
          Serial.println("\nWiFi not connected") ; 
          delay(WIFI_CONNECT_WAIT_TIME * 5) ;
          ReSet() ;    } 
      else Serial.print(".") ;
      delay(WIFI_CONNECT_WAIT_TIME) ; }
  Serial.println("\nWiFi connected.") ;
  Serial.print("SSID : ") ; Serial.println(WiFi.SSID()) ;
  Serial.print("My IP Address  : ") ;
  Serial.println(WiFi.localIP().toString()) ;  }

void EEPROM_WriteData(void){
  int i ;
  byte data[EEPROM_SIZE] ;
  memcpy(data, EEPROM_ID_STR, EEPROM_ID_STR_SIZE) ;
  memcpy(data + EEPROM_ID_STR_SIZE, &cv, sizeof(cv)) ;
  for (i = 0; i < EEPROM_SIZE; i++) EEPROM.write(i, data[i]) ;
  EEPROM.commit() ;}

void EEPROM_ReadData(void){
  int i ;
  byte data[EEPROM_SIZE] ;
  for (i = 0; i < EEPROM_SIZE; i++) data[i] = (byte)EEPROM.read(i) ;
  if (memcmp(data, EEPROM_ID_STR, EEPROM_ID_STR_SIZE - 1) == 0) {
         memcpy(&cv, data + EEPROM_ID_STR_SIZE, sizeof(cv)) ;  }}

void OTA_Update(void){
  int hrc ;
  t_httpUpdate_return hur ;
  long nv ;
  HTTPClient http ;
  WiFiClient otaClient ;
  http.begin(otaClient, otaCheckURL) ;
  hrc = http.GET() ;
  if (hrc > 0) {
         Serial.print("HTTP Response code : ") ;
         Serial.println(hrc) ;
         nv = http.getString().toInt() ;
         Serial.print("Current version : ") ;
         Serial.println(cv) ;
         Serial.print("    New version : ") ;
         Serial.println(nv) ;  } 
  else {
         Serial.print("Error code : ") ;
         Serial.println(hrc) ;  }
  http.end() ;
  if (hrc <= 0) return ;
  if (nv > cv) {                                                          // New version
         Serial.println("OTA Updating...") ;
         ESPhttpUpdate.rebootOnUpdate(false) ;
         hur = ESPhttpUpdate.update(otaClient, otaBinURL) ;
         switch (hur) {
            case HTTP_UPDATE_FAILED :
                Serial.printf("HTTP_UPDATE_FAILED Error (%d): %s\n\n",
                ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()) ;
                break ;
            case HTTP_UPDATE_NO_UPDATES :
                Serial.println("HTTP_UPDATE_NO_UPDATES\n") ;
                break ;
            case HTTP_UPDATE_OK :
                cv = nv ;
                EEPROM_WriteData() ;
                Serial.println("HTTP_UPDATE_OK\n") ;
                ReSet() ;
                break ;    }  }}

void setup(){
  Serial.begin(115200) ;
  Serial.println(__FILE__);
  Serial.println("\n<<< ESP32 OTA basic - Booting >>>");
  EEPROM.begin(EEPROM_SIZE) ;
  EEPROM_WriteData() ;
  Connect2Network() ;
  OTA_Update() ;

// You can add your own code from here.

}

void loop()
{
}

Serait-il possible de réserver des adresses en eeprom pour les données à conserver pendant la mise à jour OTA ?
Par exemple pour conserver les identifiants d'une box entrés auparavant ?

Si oui par exemple en faisant commencer i à 50 dans void EEPROM_WriteData(void) et
void EEPROM_ReadData(void)

Merci d'avance

bonjour @fr

as-tu constaté un écrasement, lors d'une mise à jour par OTA, de la petite portion de mémoire Flash utilsée pour émuler de l'EEPROM ?

je n'ai jamais fait le test mais si l'on en croit cet échange la petite partition en Flash nommée 'EEPROM' n'est pas altérée, idem pour SPIFFS : Doubt about EEPROM and OTA - Everything ESP8266

a condition bien entendu de conserver le même partitionnement d'une version à l'autre du code, (choix effectué pour 'Flash Size'

Bonjour al1fch,

Je n'ai rien tenté mais avec ta réponse je pense que cela va être possible
Merci

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.