nvm-consignes.ino
L'ATmega4809 n'a plus d'EEPROM matérielle : la bibliothèque EEPROM du core megaAVR émule en flash NVM. Ce croquis charge puis sauve des consignes réglables par série, avec signature pour valider la structure — le comportement attendu d'un contrôleur.
Matériel requis
Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every seule ; la NVM est dans la puce (section applicative de 256 octets).
Câblage
Aucun câblage ; testez en envoyant s400 puis p30 sur le moniteur série.
Fonctionnement
EEPROM.get/put manipulent une struct entière ; la signature 0xC0FFEE détecte une flash vierge ou corrompue. L'écriture n'a lieu que sur commande série, ménageant les cycles NVM.
Exécution
Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.
Variantes
Étendez la struct avec plus de champs (elle doit tenir la taille de la section), ou ajoutez une commande de dump complet pour la maintenance.
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;
}
}