eeprom-contre.ino

Arduino Nano (Classic, ATmega328P) · Archivo : eeprom-contre.ino · Lenguaje : Arduino · Uso : Compter les redémarrages dans l'EEPROM

La EEPROM de 1 KB del ATmega328P conserva datos sin alimentación: este contador de arranques sobrevive a cortes de corriente. La palabra mágica evita leer ruido en el primer lanzamiento; el patrón de toda persistencia en Nano.

Hardware

Un Arduino Nano clásico (ATmega328P a 16 MHz, formato DIL de 30 patillas para breadboard, USB mini-B, lógica de 5 V, pin RESET abajo a la izquierda). Arduino Nano sola; la EEPROM es interna del chip, sin componente externo.

Cableado

Sin cableado; para reiniciar el contador, flashea cualquier sketch que llame a EEPROM.put(0, 0).

Funcionamiento

EEPROM.get/put leen/escriben tipos arbitrarios (aquí uint32_t en 4 bytes). Cada put solo escribe los bytes que cambian, preservando la vida de las celdas.

Ejecución

En el IDE de Arduino, selecciona la placa Arduino Nano y el procesador ATmega328P, elige el puerto serie y carga. El rail de 5 V de la placa conviene a sensores de 5 V; si no, usa 3,3 V en pines compatibles.

Variantes

Guarda un búfer circular de medidas para un registrador de respaldo, o una tabla de consignas editable por serie sin reflash.

eeprom-contre.ino

// L'EEPROM 1 Ko du 328P survit a la coupure : compteur de demarrages.
// Attention : ecriture use la cellule (~100 000 cycles) : journalisez.
#include <EEPROM.h>

const int ADRESSE = 0;
const uint32_t MAGIC = 0xA5A51234; // verifie que l'EEPROM est initialisee

void setup() {
  Serial.begin(9600);
  uint32_t magic = 0;
  EEPROM.get(ADRESSE + 4, magic);
  uint32_t compteur;
  if (magic != MAGIC) {
    compteur = 0;
    EEPROM.put(ADRESSE + 4, MAGIC);
    Serial.println(F("EEPROM initialisee"));
  } else {
    EEPROM.get(ADRESSE, compteur);
  }
  compteur++;
  EEPROM.put(ADRESSE, compteur);
  Serial.print(F("Demarrage n°"));
  Serial.println(compteur);

  // Lecture de controle apres ecriture (bonne habitude AVR)
  uint32_t verif;
  EEPROM.get(ADRESSE, verif);
  Serial.println(verif == compteur ? F("verif OK") : F("verif KO"));
}

void loop() {}

← Volver a la ficha