nvm-consignes.ino
El ATmega4809 ya no tiene EEPROM de silicio: la librería EEPROM del core megaAVR la emula en flash NVM. Este sketch carga y guarda consignas regulables por serie, con firma que valida la estructura: el comportamiento esperado de un controlador.
Hardware
Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). Nano Every sola; la NVM está en el chip (sección aplicativa de 256 bytes).
Cableado
Sin cableado; prueba enviando s400 y luego p30 por el monitor serie.
Funcionamiento
EEPROM.get/put manejan una struct entera; la firma 0xC0FFEE detecta flash virgen o corrupta. La escritura solo ocurre por orden serie, cuidando los ciclos NVM.
Ejecución
Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.
Variantes
Amplía la struct con más campos (debe caber en la sección) o añade un volcado completo para el mantenimiento.
nvm-consignes.ino
// Le 4809 n'a pas d'EEPROM silicium : la lib EEPROM emule en flash.
// Conserve des consignes via la section applicative NVM.
#include <EEPROM.h>
struct Consignes {
uint16_t seuil;
uint16_t periode;
uint32_t signature; // 0xC0FFEE pour valider la structure
};
Consignes cfg;
const int ADRESSE = 0;
const uint32_t SIG = 0xC0FFEE;
void setup() {
Serial.begin(9600);
EEPROM.get(ADRESSE, cfg);
if (cfg.signature != SIG) {
Serial.println(F("consignes par defaut"));
cfg.seuil = 512; cfg.periode = 60; cfg.signature = SIG;
EEPROM.put(ADRESSE, cfg); // premier enregistrement
}
Serial.print(F("seuil=")); Serial.print(cfg.seuil);
Serial.print(F(" periode=")); Serial.println(cfg.periode);
}
void loop() {
// Reglages par serie : "s123" change le seuil
static String cmd = "";
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
if (cmd.startsWith("s")) {
cfg.seuil = cmd.substring(1).toInt();
EEPROM.put(ADRESSE, cfg);
Serial.println(F("seuil enregistre"));
}
cmd = "";
} else cmd += c;
}
}