#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SdFat.h>
#define MAX_FILENAME_LENGTH 16
LiquidCrystal_I2C lcd(0x27,16,2);
SdFat SD;
const uint8_t SD_CS_PIN = 53;
#define CLK1 2
#define DT1 3
#define SW1 4
#define CLK2 5
#define DT2 6
#define SW2 7
#define CLK3 8
#define DT3 9
#define SW3 10
char filename[MAX_FILENAME_LENGTH + 1] = ""; // Stockage du nom de fichier
int cursorPos = 0; // Position du curseur dans le nom de fichier
int charIndex = 0; // Index du caractère sélectionné
const char charSet[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ_+.0123456789"; // Caractères alphanumériques disponibles
const int charSetSize = sizeof(charSet) - 1; // Taille du jeu de caractères sans le '\0'
// Initialisation des encodeurs
int lastStateCLK1, lastStateCLK2, lastStateCLK3;
void setup() {
lcd.init();
lcd.clear();
lcd.backlight();
Serial.begin(9600);
if (!SD.begin(SD_CS_PIN, SD_SCK_MHZ(50))) {
LCD_message("SD Card Error!", "Check SD connection.", 2000);
} else {
LCD_message("SD Card Ready!", "Starting...", 2000);
}
pinMode(CLK1, INPUT);
pinMode(DT1, INPUT);
pinMode(SW1, INPUT_PULLUP);
pinMode(CLK2, INPUT);
pinMode(DT2, INPUT);
pinMode(SW2, INPUT_PULLUP);
pinMode(CLK3, INPUT);
pinMode(DT3, INPUT);
pinMode(SW3, INPUT_PULLUP);
lastStateCLK1 = digitalRead(CLK1);
lastStateCLK2 = digitalRead(CLK2);
lastStateCLK3 = digitalRead(CLK3);
LCD_menu();
}
void loop() {
check_encoders();
}
// Fonction affichage du menu
void LCD_menu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nom: ");
lcd.print(filename);
// Affiche le caractère en cours de sélection à la position du curseur
lcd.setCursor(cursorPos + 5, 0); // Position sous le curseur
lcd.print(charSet[charIndex]); // Caractère en cours de sélection
lcd.setCursor(cursorPos + 5, 1); // Position du marqueur "^"
lcd.print("^"); // Marqueur pour la position
}
void LCD_message(String line1, String line2, int del) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
delay(del);
LCD_menu();
}
void check_encoders() {
int currentStateCLK1 = digitalRead(CLK1);
int currentStateCLK2 = digitalRead(CLK2);
int currentStateCLK3 = digitalRead(CLK3);
// --- Encodeur 1 : Choix de caractères
if (currentStateCLK1 != lastStateCLK1 && currentStateCLK1 == 1) {
if (digitalRead(DT1) != currentStateCLK1) {
charIndex = (charIndex + 1) % charSetSize;
} else {
charIndex = (charIndex - 1 + charSetSize) % charSetSize;
}
LCD_menu(); // Met à jour le LCD avec le nouveau caractère
}
lastStateCLK1 = currentStateCLK1;
if (digitalRead(SW1) == LOW) { // Appui sur bouton 1 pour valider le caractère
filename[cursorPos] = charSet[charIndex];
if (cursorPos < MAX_FILENAME_LENGTH - 1) cursorPos++;
charIndex = 0; // Réinitialise pour un nouveau choix de caractère
LCD_menu();
delay(200);
}
// --- Encodeur 2 : Navigation dans le nom
if (currentStateCLK2 != lastStateCLK2 && currentStateCLK2 == 1) {
if (digitalRead(DT2) != currentStateCLK2) {
cursorPos = (cursorPos + 1) % MAX_FILENAME_LENGTH;
} else {
cursorPos = (cursorPos - 1 + MAX_FILENAME_LENGTH) % MAX_FILENAME_LENGTH;
}
LCD_menu();
}
lastStateCLK2 = currentStateCLK2;
if (digitalRead(SW2) == LOW) { // Appui sur bouton 2 pour effacer
filename[cursorPos] = ' ';
LCD_menu();
delay(200);
}
// --- Encodeur 3 : Validation du nom
if (digitalRead(SW3) == LOW) {
filename[cursorPos + 1] = '\0'; // Terminer le nom avec null
save_filename(filename);
LCD_message("Nom valide!", filename, 2000);
memset(filename, 0, sizeof(filename)); // Efface le nom pour un nouveau début
cursorPos = 0;
LCD_menu();
}
}
void save_filename(char *name) {
File file = SD.open("filenames.txt", FILE_WRITE);
if (file) {
file.println(name);
file.close();
Serial.print("Nom sauvegarde : ");
Serial.println(name);
} else {
Serial.println("Erreur: Impossible d'ouvrir le fichier.");
}
}