🛠 Data logger sur EEPROM : persistance sans usure
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
- 1 Arduino UNO R3 + cable USB-B (o fuente de alimentación jack de 7–12 V para probar la autonomía)
- 1 LDR + 10 kΩ en divisor de tensión en A1
- 1 botón pulsador en el pin 2 hacia GND (validación de registro)
- El ATmega328P está en zócalo: en caso de problema, se reemplaza el chip por unos pocos euros y la placa sigue funcionando.
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
- put/get en loop en cada iteración: a 10 escrituras/s, se acercan a los 100 000 ciclos/celda en pocos días. Escriba sobre evento o con una banda muerta.
- Olvidar la cabecera mágica: en el primer arranque, la EEPROM virgen vale 0xFF en todas partes (65535) y su «max» será incorrecto para siempre.
- Escribir un float (4 bytes) sin pensarlo: EEPROM.put lo gestiona, pero un EEPROM.write byte a byte mal ordenado produce valores incoherentes.
- Atención a los clones: algunos clones de gama baja tienen los fusibles configurados de forma diferente; si la EEPROM parece muerta, pruebe la biblioteca con un boceto mínimo antes de dudar del código.
- Confundir EEPROM (1 KB, persistente) y flash (32 KB, de los cuales 0,5 KB son bootloader): para grandes volúmenes, se necesita una tarjeta SD SPI, no la EEPROM.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino