🛠 Data logger sur EEPROM : persistance sans usure
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
- 1 Arduino UNO R3 + câble USB-B (ou alimentation jack 7–12 V pour tester l'autonomie)
- 1 LDR + 10 kΩ en pont diviseur sur A1
- 1 bouton poussoir sur pin 2 vers GND (validation d'enregistrement)
- L'ATmega328P est sur support : en cas de pépin, on remplace la puce pour quelques euros, la carte reste vivante.
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
- put/get dans loop à chaque tour : à 10 écritures/s vous approchez des 100 000 cycles/cellule en quelques jours. Écrivez sur événement ou avec un deadband.
- Oublier l'en-tête magique : au premier démarrage, l'EEPROM vierge vaut 0xFF partout (65535) et votre « max » est faux pour toujours.
- Écrire une float (4 octets) sans y penser : EEPROM.put la gère, mais un EEPROM.write octet par octet mal ordonné donne des valeurs incohérentes.
- Attention aux clones : certains clones bas de gamme ont des fusibles configurés différements ; si l'EEPROM semble morte, testez la bibliothèque avec un croquis minimal avant de douter du code.
- Confondre EEPROM (1 Ko, persistante) et flash (32 Ko, dont 0,5 Ko de bootloader) : pour de gros volumes, il faut une carte SD SPI, pas l'EEPROM.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino