nvm-consignes.ino

Arduino Nano Every · Archivo : nvm-consignes.ino · Lenguaje : Arduino · Uso : Stocker des consignes dans la NVM du 4809

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;
  }
}

← Volver a la ficha