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