Completado
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
- 8 señales de que tu prototipo no está listo para producción
- Publicar datos de temperatura DS18B20 desde M-Duino por MQTT
Siguiente lección: qué ocurre cuando el código se congela, con un watchdog. Haz primero el cuestionario de abajo.
No hay comentarios por ahora.