preferences.ino
L'ESP32 n'a pas d'EEPROM mais une partition NVS dans la flash : la bibliothèque Preferences y range clés et valeurs avec usure répartie. Ce croquis persiste un réglage modifiable par série — la base propre d'une configuration produit.
Matériel requis
Un Arduino Nano ESP32 (ESP32-S3 double cœur, Wi-Fi 2,4 GHz + Bluetooth Low Energy, brochage physique compatible Nano, USB natif, broches 3,3 V uniquement). Nano ESP32 seule ; la NVS est une partition de la flash embarquée (jusqu'à ~200 Ko selon le partitionnement).
Câblage
Aucun câblage ; testez "seuil=700" sur le moniteur série puis redémarrez.
Fonctionnement
prefs.begin(namespace, readOnly) ouvre un magasin étanche ; les put* écrivent en flash avec wear-leveling interne. get* avec valeur par défaut couvre le premier démarrage.
Exécution
Installez le package Arduino ESP32 Boards (ou le guide Nano ESP32 officiel), sélectionnez Arduino Nano ESP32, téléversez. Les broches sont en 3,3 V : n'envoyez jamais 5 V sur une entrée. Le moniteur série utilise l'USB natif.
Variantes
Rangez les mots de passe WiFi dans un namespace séparé, ou effacez tout (prefs.clear()) via un bouton maintenu au boot pour un reset usine.
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;
}
}