🛠 Persister une calibration dans l'EEPROM de l'ATmega (512 octets ou 1 Ko)

Arduino Duemilanove — Fiche carte · intermediaire · Schéma : IMG-duemilanove-intermediaire-3-eeprom-persister-calibration.svg — Arduino Duemilanove avec puce ATmega328 dont la zone EEPROM 1 Ko est surlignée, bouton sur broche 2 pour sauvegarder, moniteur série affichant la valeur rechargée après rebranchement de l'alimentation.

Objectifs

L'un des vrais bonheurs de l'AVR face à la Due (qui a 0 octet d'EEPROM) : la Duemilanove embarque 512 octets d'EEPROM (ATmega168) ou 1 Ko (ATmega328), conservés sans alimentation. Vous allez stocker une valeur de calibration dans une structure, l'écrire seulement quand elle change (l'EEPROM est limitée en cycles d'écriture), et vérifier qu'elle survit à la coupure totale de l'alimentation.

Matériel

Code complet

// Calibration persistee en EEPROM (bibliothque EEPROM fournie avec le core)
#include <EEPROM.h>

struct Calibration {          // 4 octets
  uint16_t zéro;              // offset de calibration
  uint16_t magic;             // marqueur de validité
};
const uint16_t MAGIC = 0xABCD;
const byte BOUTON = 2;

Calibration cal;

void setup {
  pinMode(BOUTON, INPUT_PULLUP);
  Serial.begin(9600);
  EEPROM.get(0, cal);                       // lecture adresse 0
  if (cal.magic != MAGIC) {                 // première vie de la carte ?
    cal.zéro = analogRead(A0);
    cal.magic = MAGIC;
    EEPROM.put(0, cal);                     // écriture initiale
    Serial.println("Calibration initialisee");
  } else {
    Serial.print("Calibration rechargee : zéro=");
    Serial.println(cal.zéro);
  }
}

void loop {
  if (digitalRead(BOUTON) == LOW) {         // bouton enfonce
    delay(50);                              // anti-rebond grossier
    if (digitalRead(BOUTON) == LOW) {
      cal.zéro = analogRead(A0);
      EEPROM.put(0, cal);                   // écrit seulement sur demande
      Serial.print("zéro enregistre : ");
      Serial.println(cal.zéro);
      while (digitalRead(BOUTON) == LOW) { } // attend le relachement
    }
  }
}

Vérification attendue

Première exécution : « Calibration initialisee ». Éteindre complètement (débrancher USB ET alimentation), rebrancher : la carte affiche « Calibration rechargee : zéro=… » avec la valeur précédente, pas une réinitialisation. Appuyer sur le bouton avec le potentiomètre en position différente change la valeur persistée. Sur une 168, la même structure occupe 4 des 512 octets disponibles.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels