Skip to Content

Conservar datos tras un corte de alimentación: EEPROM y patrones de almacenamiento no volátil

Los contadores, consignas y el último estado conocido de una máquina normalmente deben sobrevivir a un ciclo de alimentación. La estación de bombeo necesita recordar cuántos ciclos ha ejecutado y su umbral de nivel configurado. M-Duino y Ardbox están construidos sobre placas Arduino Mega y Leonardo, ambas con EEPROM integrada, que es lo que usa esta lección.

Qué aprenderás

  • Guardar y restaurar un valor con EEPROM.put() y EEPROM.get().
  • Restaurar valores guardados en setup() tras un reinicio.
  • Limitar las escrituras para que la memoria no se desgaste.

Escribir y leer un valor

#include <EEPROM.h>

int cycleCount = 0;

void saveCycleCount(int count) {
  EEPROM.put(0, count);
}

int loadCycleCount() {
  int count;
  EEPROM.get(0, count);
  return count;
}

void setup() {
  Serial.begin(9600);
  cycleCount = loadCycleCount();
  Serial.print("Cycles so far: ");
  Serial.println(cycleCount);
}

EEPROM.put() y EEPROM.get() manejan cualquier tipo de dato, incluidas estructuras, y put() solo escribe los bytes que realmente cambiaron. Una placa recién programada puede contener valores sin sentido en la EEPROM, así que valida lo que lees (por ejemplo, descarta valores negativos o inverosímiles) antes de usarlo.

Pruébalo: aumenta cycleCount, guárdalo, apaga y enciende el PLC y comprueba en el Monitor Serie que el valor vuelve.

Por qué importa la frecuencia de escritura

Las celdas de EEPROM soportan un número grande pero finito de escrituras. Escribir en cada pasada de loop(), potencialmente miles de veces por segundo, puede desgastar una celda en horas o días. Escribe solo cuando un valor cambia y, para valores que cambian rápido, añade un tiempo mínimo entre escrituras con el patrón millis() de la lección 2.

unsigned long lastSave = 0;
const unsigned long minSaveInterval = 60000;  // como máximo una vez por minuto
int lastSavedCount = -1;

void loop() {
  // cycleCount se incrementa en otra parte de tu lógica

  if (cycleCount != lastSavedCount && millis() - lastSave >= minSaveInterval) {
    saveCycleCount(cycleCount);
    lastSavedCount = cycleCount;
    lastSave = millis();
  }
}

Guardar solo al cambiar no basta cuando el valor cambia constantemente. El límite de tiempo acota el desgaste hagas lo que haga la máquina.

Para qué no sirve la EEPROM

La EEPROM encaja en valores pequeños que cambian poco: consignas, configuración, un contador de ciclos. Es una mala opción para datos continuos como telemetría de sensores en bruto, tanto por el límite de escrituras como porque su capacidad es pequeña frente a una tarjeta SD o un registrador de datos externo.

Para profundizar

Siguiente lección: qué ocurre cuando el código se congela, con un watchdog. Haz primero el cuestionario de abajo.

Rating
0 0

There are no comments for now.

to be the first to leave a comment.