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

Arduino Duemilanove — Ficha de placa · 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.

Objetivos

Una de las verdaderas ventajas del AVR frente a la Due (que tiene 0 bytes de EEPROM): la Duemilanove incorpora 512 bytes de EEPROM (ATmega168) o 1 KB (ATmega328), que se conservan sin alimentación. Vas a almacenar un valor de calibración en una estructura, escribirla solo cuando cambie (la EEPROM tiene un número limitado de ciclos de escritura) y verificar que sobreviva a un corte total de la alimentación.

Material

Código completo

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

struct Calibration {          // 4 octets
  uint16_t zero;              // offset de calibration
  uint16_t magic;             // marqueur de validite
};
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) {                 // premiere vie de la carte ?
    cal.zero = analogRead(A0);
    cal.magic = MAGIC;
    EEPROM.put(0, cal);                     // ecriture initiale
    Serial.println("Calibration initialisee");
  } else {
    Serial.print("Calibration rechargee : zero=");
    Serial.println(cal.zero);
  }
}

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

Verificación esperada

Primera ejecución: «Calibration initialisee». Apagar completamente (desconectar USB Y alimentación), reconectar: la placa muestra «Calibration rechargee : zero=…» con el valor anterior, no una reinicialización. Pulsar el botón con el potenciómetro en una posición diferente cambia el valor persistido. En una 168, la misma estructura ocupa 4 de los 512 bytes disponibles.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales