preferences.ino
El ESP32 no tiene EEPROM pero sí una partición NVS en la flash: la librería Preferences guarda ahí claves y valores con desgaste repartido. Este sketch persiste un ajuste editable por serie: la base limpia de una configuración de producto.
Hardware
Un Arduino Nano ESP32 (ESP32-S3 de doble núcleo, Wi-Fi 2,4 GHz + Bluetooth Low Energy, formato físico compatible con el Nano, USB nativo, pines de 3,3 V únicamente). Nano ESP32 sola; la NVS es una partición de la flash embarcada (hasta ~200 KB según particionado).
Cableado
Sin cableado; prueba "seuil=700" en el monitor serie y reinicia.
Funcionamiento
prefs.begin(namespace, readOnly) abre un almacén estanco; los put* escriben en flash con wear-leveling interno. Los get* con valor por defecto cubren el primer arranque.
Ejecución
Instala el paquete Arduino ESP32 Boards (o sigue la guía oficial del Nano ESP32), selecciona Arduino Nano ESP32 y carga. Los pines son de 3,3 V: nunca envíes 5 V a una entrada. El monitor serie usa el USB nativo.
Variantes
Guarda las contraseñas WiFi en un namespace aparte, o borra todo (prefs.clear()) con un botón mantenido al arrancar para un reset de fábrica.
preferences.ino
// La NVs de l'ESP32 (partition flash) remplace l'EEPROM des AVR.
// La lib Preferences offre un key-value persistant simple.
#include <Preferences.h>
Preferences prefs;
void setup() {
Serial.begin(115200);
prefs.begin("config", false); // namespace ferme
String ssid = prefs.getString("ssid", "");
int seuil = prefs.getInt("seuil", 512);
bool premier = prefs.getBool("deja", false);
if (!premier) {
Serial.println(F("Premier demarrage : reglages par defaut"));
prefs.putString("ssid", "MonReseau");
prefs.putInt("seuil", 512);
prefs.putBool("deja", true);
}
Serial.print(F("ssid=")); Serial.print(ssid);
Serial.print(F(" seuil=")); Serial.println(seuil);
prefs.end();
}
void loop() {
static String ligne = "";
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
if (ligne.startsWith("seuil=")) {
prefs.begin("config", false);
prefs.putInt("seuil", ligne.substring(6).toInt());
prefs.end();
Serial.println(F("persiste"));
}
ligne = "";
} else ligne += c;
}
}