🛠 Data logger sur EEPROM : persistance sans usure

Arduino UNO R3 · avance · Schéma : IMG-uno-r3-avance-1-datalogger-eeprom.svg — UNO R3 avec LDR sur A1, puce ATmega328P en évidence avec la mention EEPROM 1 Ko, bouton de sauvegarde sur pin 2.

Objectifs

Exploiter le plus petit espace de stockage de l'UNO : les 1 Ko d'EEPROM de l'ATmega328P, qui survivent aux coupures d'alimentation (contrairement aux 2 Ko de SRAM). Vous allez concevoir un format d'enregistrement, n'écrire que quand la valeur change (l'EEPROM a une endurance d'écritures finie, de l'ordre de 100 000 cycles par cellule), et vérifier la reprise après redémarrage.

Matériel

Code complet

// Logger de maximum de luminosité, persistant en EEPROM (1 Ko).
#include <EEPROM.h>

const uint8_t LDR = A1;
const uint8_t BTN = 2;

// Adresse 0 : un en-tête « magique » pour détecter une EEPROM jamais initialisée.
const uint16_t MAGIC = 0xA5A5;
uint16_t maxVu = 0;
uint16_t dernierEnregistre = 0;

void setup {
  Serial.begin(9600);
  pinMode(BTN, INPUT_PULLUP);

  uint16_t entete = 0;
  EEPROM.get(0, entete);
  if (entete != MAGIC) {
    // Première initialisation : pas de données valides.
    EEPROM.put(0, MAGIC);
    EEPROM.put(2, (uint16_t)0);
    maxVu = 0;
    Serial.println(F("EEPROM initialisee"));
  } else {
    EEPROM.get(2, maxVu);
    Serial.print(F("Restaure max=")); Serial.println(maxVu);
  }
}

void loop {
  int v = analogRead(LDR);

  if (v > maxVu) {
    maxVu = v;
    EEPROM.put(2, maxVu);        // écrivons SEULEMENT quand ça changé
    Serial.print(F("nouveau max=")); Serial.println(maxVu);
  }

  // Bouton : dump du contenu à la demande.
  if (digitalRead(BTN) == LOW) {
    Serial.print(F("état EEPROM[2..3]="));
    Serial.println(EEPROM.read(2) | (EEPROM.read(3) << 8));
    delay(300);                  // anti-rebond grossier pour ce bouton de debug
  }

  Serial.print(F("ldr=")); Serial.println(v);
  delay(100);
}

Vérification attendue

Notez un maximum, débranchez l'USB (ou branchez le jack), rebranchez : le Moniteur affiche « Restaure max=... » avec la valeur conservée — la SRAM est perdue, l'EEPROM non. Vérifiez aussi l'usure : avec un seuil qui fait écrire en permanence, vous consommez des cycles d'écriture inutilement ; le code ne fait put que sur changement réel.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels