/* utilisation des caractères ascii de 33 à 255 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // bibliothèque pour gérer écran LCD 2004
LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte LONGUEUR_MAX_MDP = 20; // longueur maximum paramétrable
char tableauPass[LONGUEUR_MAX_MDP + 1];
char tableauTrouve[LONGUEUR_MAX_MDP + 1];
String PassWord = ""; // mot de passe saisi au clavier
int LongueurPassWord = 0;
String Trouve = "";
const int pinPoussoir = 2; // Broche du bouton poussoir
const int pinDebutRouges = 3; // Broche de la première LED rouge
/* const int pinDebutVertes = 22; // Broche de la première LED verte */
int boucleLoop = 0;
bool appuiBP = false;
unsigned long debutTempo = 0;
unsigned long finTempo = 0;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Saisie mot de passe");
lcd.setCursor(0,1);
lcd.print("via le port serie");
Serial.println(F("================================"));
Serial.println(F("Saisir le mot de passe puis ENTER"));
Serial.print (F("Longueur maximale : "));
Serial.println(LONGUEUR_MAX_MDP);
Serial.println(F("================================"));
// --- Saisie bloquante du mot de passe ---
while (PassWord.length() == 0) {
if (Serial.available()) {
PassWord = Serial.readStringUntil('\n');
PassWord.trim();
if (PassWord.length() == 0) {
Serial.println(F("Mot de passe vide interdit !"));
} else if (PassWord.length() > LONGUEUR_MAX_MDP) {
Serial.println(F("Mot de passe trop long, il sera tronque."));
PassWord = PassWord.substring(0, LONGUEUR_MAX_MDP);
}
}
}
LongueurPassWord = PassWord.length();
lcd.clear();
lcd.setCursor(3,0); lcd.print("B O N J O U R ");
lcd.setCursor((10 - (PassWord.length() / 2)),1); lcd.print(PassWord);
lcd.setCursor(2,2); lcd.print("BP pour demarrer");
for (int i = 0; i < LongueurPassWord; i++) {
tableauPass[i] = PassWord.charAt(i);
} // Fin de for (int i = 0; i < LongueurPassWord; i++)
tableauPass[LongueurPassWord] = '\0';
pinMode(pinPoussoir, INPUT_PULLUP);
for (int i = pinDebutRouges; i <= pinDebutRouges + 15; i++) {
pinMode(i, OUTPUT);
pinMode(i + 19, OUTPUT);
digitalWrite(i, HIGH); // Allume toutes les LEDs rouges au démarrage
digitalWrite(i + 19, LOW); // Éteint toutes les LEDs vertes au démarrage
} // Fin de for (int i = pinDebutRouges; i <= pinDebutRouges + 15; i++)
} // Fin de setup
void loop() {
if (!appuiBP && digitalRead(pinPoussoir) == LOW) {
appuiBP = true;
debutTempo = millis();
lcd.setCursor(0,2); lcd.print(" ");
} // Fin de if (!appuiBP && digitalRead(pinPoussoir) == LOW)
if (appuiBP && (boucleLoop < LongueurPassWord)){
for (int j = 33; j < 255; j++){
char asciiChar = char(j);
lcd.setCursor(boucleLoop + (10 - (PassWord.length() / 2)),2);lcd.print(asciiChar);
if (asciiChar == tableauPass[boucleLoop]){
tableauTrouve[boucleLoop] = asciiChar;
Trouve += tableauTrouve[boucleLoop];
digitalWrite(boucleLoop + pinDebutRouges, LOW);
digitalWrite(boucleLoop + pinDebutRouges + 19, HIGH);
//delay(50);
boucleLoop +=1;
if (Trouve == PassWord){
finTempo = millis();
lcd.setCursor(2, 3);
lcd.print("Temps(ms): ");
lcd.print(finTempo - debutTempo);
break;
} // Fin de if (Trouve == PassWord)
} // Fin de if (asciiChar == tableauPass[boucleLoop])
} // Fin de for (int j = 33; j < 255; j++)
} // Fin de if (appuiBP && (boucleLoop < LongueurPassWord))
} // Fin de loop