Exemple d'utilisation avancée de structure avec EEPROM.put()

par skywodd | | Langue : C++ | Licence : GPLv3

Description :

Exemple d'utilisation avancée de structure avec EEPROM.put().

Variante avec versionnage et détection de première utilisation.

Code source :

Voir le code source brut | Télécharger arduino_struct_2.ino | Télécharger arduino_struct_2.ino.zip

/**
 * Exemple d'utilisation de structure avec EEPROM.put().
 * Variante avec versionnage et détection de première utilisation.
 */

#include <EEPROM.h>

/** Le nombre magique et le numéro de version actuelle */
static const unsigned long STRUCT_MAGIC = 123456789;
static const byte STRUCT_VERSION = 2;

/** La structure qui contient les données */
struct MaStructure {
  unsigned long magic;
  byte struct_version;

  int valeur_1; // Depuis la struct_version = 0
  float valeur_2; // Depuis la struct_version = 1
  char valeur_3[16]; // Depuis la struct_version = 2
};

/** L'instance de la structure, globale, car utilisé dans plusieurs endroits du programme */
MaStructure ms;

void setup() {
  Serial.begin(9600);
  
  // Charge le contenu de la mémoire
  chargeEEPROM();

  // Affiche les données dans la structure
  Serial.print("Valeur 1 = ");
  Serial.println(ms.valeur_1);

  Serial.print("Valeur 2 = ");
  Serial.println(ms.valeur_2);

  Serial.print("Valeur 3 = ");
  Serial.println(ms.valeur_3);
}

void loop() {
} 

/** Sauvegarde en mémoire EEPROM le contenu actuel de la structure */
void sauvegardeEEPROM() {
  // Met à jour le nombre magic et le numéro de version avant l'écriture
  ms.magic = STRUCT_MAGIC;
  ms.struct_version =  STRUCT_VERSION;
  EEPROM.put(0, ms);
}

/** Charge le contenu de la mémoire EEPROM dans la structure */
void chargeEEPROM() {

  // Lit la mémoire EEPROM
  EEPROM.get(0, ms);
  
  // Détection d'une mémoire non initialisée
  byte erreur = ms.magic != STRUCT_MAGIC;

  // Valeurs par défaut struct_version == 0
  if (erreur) {

    // Valeurs par défaut pour les variables de la version 0
    ms.valeur_1 = 42;
  }
  
  // Valeurs par défaut struct_version == 1
  if (ms.struct_version < 1 || erreur) {

    // Valeurs par défaut pour les variables de la version 1
    ms.valeur_2 = 13.37;
  }

  // Valeurs par défaut pour struct_version == 2
  if (ms.struct_version < 2 || erreur) {

    // Valeurs par défaut pour les variables de la version 2
    strcpy(ms.valeur_3, "Hello World!");
  }

  // Sauvegarde les nouvelles données
  sauvegardeEEPROM();
}