#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#define BTN_CHOIX 2
#define BTN_PLUS 3
#define BTN_MOINS 4
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C à adapter si besoin
int valeurs[3] = {0, 0, 0}; // Valeurs initialisées à 0
int indexActif = 0;
unsigned long appuiDebut = 0;
bool appuiLongDetecte = false;
const char* labels[3] = {"A", "B", "C"};
void setup() {
lcd.init();
lcd.backlight();
pinMode(BTN_CHOIX, INPUT_PULLUP);
pinMode(BTN_PLUS, INPUT_PULLUP);
pinMode(BTN_MOINS, INPUT_PULLUP);
// Lire les valeurs depuis l'EEPROM
for (int i = 0; i < 3; i++) {
int v = EEPROM.read(i);
valeurs[i] = constrain(v, 0, 100); // sécurité si mémoire corrompue
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Chargement OK");
delay(1000);
lcd.clear();
}
void loop() {
bool choix = !digitalRead(BTN_CHOIX);
bool plus = !digitalRead(BTN_PLUS);
bool moins = !digitalRead(BTN_MOINS);
// Détection appui long
if (choix) {
if (appuiDebut == 0) {
appuiDebut = millis();
} else if (!appuiLongDetecte && millis() - appuiDebut > 1500) {
appuiLongDetecte = true;
// Sauvegarde en EEPROM
for (int i = 0; i < 3; i++) {
EEPROM.update(i, valeurs[i]); // n’écrit que si différent
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valeurs sauvees!");
delay(2000);
lcd.clear();
}
} else {
if (appuiDebut != 0 && !appuiLongDetecte) {
indexActif = (indexActif + 1) % 3;
}
appuiDebut = 0;
appuiLongDetecte = false;
}
// Incrémentation / décrémentation
if (plus) {
valeurs[indexActif] = min(valeurs[indexActif] + 1, 100);
delay(200);
}
if (moins) {
valeurs[indexActif] = max(valeurs[indexActif] - 1, 0);
delay(200);
}
// Affichage valeurs
char ligne1[17];
snprintf(ligne1, sizeof(ligne1), "%s%03d %s%03d %s%03d",
labels[0], valeurs[0],
labels[1], valeurs[1],
labels[2], valeurs[2]);
lcd.setCursor(0, 0);
lcd.print(ligne1);
// Affichage repère
int positions[3] = {0, 6, 12};
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(positions[indexActif] + 1, 1);
lcd.print("^");
}
Choix/Valide
+
-