#include "U8g2lib.h"
#define SCL_PIN A5
#define SDA_PIN A4
#define BUTTON_UP_PIN 12
#define BUTTON_DOWN_PIN 4
#define BUTTON_SELECT_PIN 8
#define BUTTON_ERASE_PIN 10 // Nouveau bouton pour effacer ou valider
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, SCL_PIN, SDA_PIN);
int button_up_clicked = 0;
int button_select_clicked = 0;
int button_down_clicked = 0;
int button_erase_clicked = 0; // Variable pour le bouton ERASE
unsigned long erase_button_press_time = 0; // Temps de début de l'appui sur ERASE
int selected = 0;
String letter_selected = "";
bool word_finalized = false; // Indique si le mot est finalisé
static const int TOTAL_MENU = 27;
const char *options[TOTAL_MENU] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_"};
void setup() {
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
pinMode(BUTTON_ERASE_PIN, INPUT_PULLUP); // Initialisation du bouton ERASE
u8g2.begin();
Serial.begin(9600); // Initialisation pour afficher les résultats sur le moniteur série
}
void loop() {
if (!word_finalized) {
// Mode de saisie (clavier et mot en cours)
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x13B_tf);
// Affichage des options du menu
for (int i = 0; i < TOTAL_MENU; i++) {
if (i == selected) {
// Affichage de l'option sélectionnée en surbrillance
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
if ((digitalRead(BUTTON_SELECT_PIN) == LOW) && (button_select_clicked == 0)) {
button_select_clicked = 1;
letter_selected += options[i]; // Ajout de la lettre sélectionnée
Serial.println(letter_selected);
}
} else {
// Affichage des options non sélectionnées
u8g2.setFontMode(1);
u8g2.setDrawColor(1);
}
// Placement des caractères sur 3 lignes
int sel_x = ((i % 9) * 12) + 4; // Calcul de la position horizontale
int sel_y = 36 + ((i / 9) * 12); // Calcul de la ligne (36, 48, 60)
u8g2.setCursor(sel_x, sel_y);
u8g2.print(options[i]);
}
// Affichage de la chaîne sélectionnée
u8g2.setFontMode(0);
u8g2.setDrawColor(1);
u8g2.setCursor(4, 18);
u8g2.print(letter_selected);
u8g2.sendBuffer();
// Gestion des boutons
if ((digitalRead(BUTTON_UP_PIN) == HIGH) && (button_up_clicked == 1)) button_up_clicked = 0;
if ((digitalRead(BUTTON_DOWN_PIN) == HIGH) && (button_down_clicked == 1)) button_down_clicked = 0;
if ((digitalRead(BUTTON_SELECT_PIN) == HIGH) && (button_select_clicked == 1)) button_select_clicked = 0;
if ((digitalRead(BUTTON_DOWN_PIN) == LOW) && (button_down_clicked == 0)) {
button_down_clicked = 1;
selected = (selected + 1) % TOTAL_MENU; // Boucle à 0 si on dépasse le dernier élément
delay(200);
}
if ((digitalRead(BUTTON_UP_PIN) == LOW) && (button_up_clicked == 0)) {
button_up_clicked = 1;
selected = (selected - 1 + TOTAL_MENU) % TOTAL_MENU; // Boucle au dernier élément si on descend en dessous de 0
delay(200);
}
// Effacer la dernière lettre sélectionnée
if ((digitalRead(BUTTON_ERASE_PIN) == LOW) && (button_erase_clicked == 0)) {
button_erase_clicked = 1;
erase_button_press_time = millis(); // Enregistre le temps d'appui
} else if ((digitalRead(BUTTON_ERASE_PIN) == HIGH) && (button_erase_clicked == 1)) {
button_erase_clicked = 0;
if (millis() - erase_button_press_time < 2000) { // Efface la dernière lettre si appui court
if (letter_selected.length() > 0) {
letter_selected.remove(letter_selected.length() - 1);
Serial.println(letter_selected);
}
} else { // Valide le mot si appui long
word_finalized = true;
}
}
} else {
// Mode affichage du mot finalisé
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_fur35_tf); // Police plus grande pour afficher le mot
u8g2.setCursor(4, 48); // Centré pour l'écran 128x64
u8g2.print(letter_selected);
u8g2.sendBuffer();
// Réinitialisation sur appui du bouton ERASE
if ((digitalRead(BUTTON_ERASE_PIN) == LOW) && (button_erase_clicked == 0)) {
button_erase_clicked = 1;
} else if ((digitalRead(BUTTON_ERASE_PIN) == HIGH) && (button_erase_clicked == 1)) {
button_erase_clicked = 0;
word_finalized = false; // Réinitialise le mot
letter_selected = ""; // Vide la chaîne
selected = 0; // Réinitialise la sélection
}
}
}
/*
#include "U8g2lib.h"
#define SCL_PIN A5
#define SDA_PIN A4
#define BUTTON_UP_PIN 12
#define BUTTON_DOWN_PIN 4
#define BUTTON_SELECT_PIN 8
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, SCL_PIN, SDA_PIN);
int button_up_clicked = 0;
int button_select_clicked = 0;
int button_down_clicked = 0;
int selected = 0;
String letter_selected = "";
int letter_selected_length = 0;
static const int TOTAL_MENU = 27;
const char *options[TOTAL_MENU] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_"};
void setup() {
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
u8g2.begin();
}
void loop() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x13B_tf);
for (int i = 0; i < TOTAL_MENU; i++) {
if (i == selected) {
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
if ((digitalRead(BUTTON_SELECT_PIN) == LOW) && (button_select_clicked == 0)) {
button_select_clicked = 1;
letter_selected = letter_selected + options[i];
letter_selected_length++;
// Serial.println(i);
Serial.println(letter_selected);
}
} else if (i != selected) {
u8g2.setFontMode(1);
u8g2.setDrawColor(1);
}
if (i < 9) {
int sel = (i * 12) + 4;
u8g2.setCursor((sel), 36);
}
else if (i > 8 && i < 18) {
int sel = ((i - 9) * 12) + 4;
u8g2.setCursor((sel), 48);
}
else if (i > 17 && i < 27) {
int sel = ((i - 18) * 12) + 4;
u8g2.setCursor((sel), 60);
}
u8g2.print(options[i]);
// Serial.println(sel);
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
u8g2.setCursor(4, 18);
u8g2.print(letter_selected);
}
u8g2.sendBuffer();
// start Unclick
if ((digitalRead(BUTTON_UP_PIN) == HIGH) && (button_up_clicked == 1)) {
button_up_clicked = 0;
}
if ((digitalRead(BUTTON_DOWN_PIN) == HIGH) && (button_down_clicked == 1)) {
button_down_clicked = 0;
}
if ((digitalRead(BUTTON_SELECT_PIN) == HIGH) && (button_select_clicked == 1)) {
button_select_clicked = 0;
}
// end Unclick
if ((digitalRead(BUTTON_DOWN_PIN) == LOW) && (button_down_clicked == 0)) {
button_down_clicked = 1;
selected = selected + 1;
// Serial.println(selected);
delay(200);
};
if ((digitalRead(BUTTON_UP_PIN) == LOW) && (button_up_clicked == 0)) {
button_up_clicked = 1;
selected = selected - 1;
// Serial.println(selected);
delay(200);
};
}
*/