🛠 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.

Objetivos

Aprovechar el menor espacio de almacenamiento del UNO: los 1 KB de EEPROM del ATmega328P, que sobreviven a los cortes de alimentación (a diferencia de los 2 KB de SRAM). Diseñará un formato de registro, escribirá solo cuando el valor cambie (la EEPROM tiene una resistencia de escritura finita, del orden de 100 000 ciclos por celda) y verificará la recuperación tras el reinicio.

Material

Código completo

// 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 change
    Serial.print(F("nouveau max=")); Serial.println(maxVu);
  }

  // Bouton : dump du contenu à la demande.
  if (digitalRead(BTN) == LOW) {
    Serial.print(F("etat 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);
}

Verificación esperada

Registre un máximo, desconecte el USB (o conecte el jack), vuelva a conectar: el Monitor muestra «Restaure max=...» con el valor conservado — la SRAM se pierde, la EEPROM no. Verifique también el desgaste: con un umbral que provoca escrituras permanentes, consume ciclos de escritura innecesariamente; el código solo hace put cuando hay un cambio real.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales