// Prog by YeNkO
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
const char LED_1 = A0;
const char LED_2 = A1;
const char LED_3 = A2;
const char LED_4 = A3; // définition des pins utilisées
const char bouton_START = 12;
const char bouton_RESET = 13;
const char bouton_1 = 2;
const char bouton_2 = 3;
const char bouton_3 = 4;
const char bouton_4 = 5;
unsigned long startTime = 0; // Variable pour stocker le temps de début de la séquence
unsigned long Timeleft = 0; // Variable pour stocker le temps restant
const unsigned long sequenceDuration = 20000; // Durée de la séquence en millisecondes (20 secondes)
int ledToTurnOn = 0; // Variable pour stocker la LED à allumer
int lastledToTurnOn = 0; // Variable pour stocker la LED à allumer
int varrand =0; //Variable pour sotckage rand
int buttonPressed = 0; // Variable pour stocker le bouton appuyé
int point = 0; // Variable pour le compteur de points
void setup()
{
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW); // état éteint des LEDs
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
pinMode(bouton_START, INPUT_PULLUP);
pinMode(bouton_RESET, INPUT_PULLUP);
pinMode(bouton_1, INPUT_PULLUP);
pinMode(bouton_2, INPUT_PULLUP);
pinMode(bouton_3, INPUT_PULLUP);
pinMode(bouton_4, INPUT_PULLUP);
randomSeed(analogRead(0)); // initialiser la graine pour la génération de nombres aléatoires
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Powered by");
lcd.setCursor(5,1);
lcd.print("YeNkO");
delay(5000);
lcd.clear();
lcd.print("Pret");
}
void loop()
{
if (digitalRead(bouton_START) == LOW) { // Attendre l'appui sur le bouton_START pour démarrer la séquence
// La séquence commence, enregistrez le temps de début
startTime = millis(); // Défini le temps de référence
Timeleft = sequenceDuration - startTime; // défini le temps restant
point = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temps");
lcd.setCursor(0,1);
lcd.print("Points");
lcd.setCursor(14,1);
lcd.print(point);
while (((millis() - startTime) < sequenceDuration) && (millis() - startTime) > 0) {
if (digitalRead(bouton_RESET) == LOW) {
raz();
}
Timeleft = sequenceDuration - (millis() - startTime);
lcd.setCursor(14,1);
lcd.print(point);
// Générer un nombre aléatoire entre 1 et 4 pour choisir la LED à allumer
if (ledToTurnOn == 0) {
delay(20);
varrand = random(1, 5);
if (varrand != lastledToTurnOn) {
ledToTurnOn = varrand;
} else { varrand =random(1, 5);}
lastledToTurnOn = ledToTurnOn;
allumerLED(ledToTurnOn);
}
// Vérifier si le bouton correspondant à la LED allumée a été pressé
if (digitalRead(bouton_1) == LOW && ledToTurnOn == 1) {
eteindreLED(ledToTurnOn);
ledToTurnOn = 0;
point++; // Incrémenter le compteur de points
} else if (digitalRead(bouton_2) == LOW && ledToTurnOn == 2) {
eteindreLED(ledToTurnOn);
ledToTurnOn = 0;
point++;
} else if (digitalRead(bouton_3) == LOW && ledToTurnOn == 3) {
eteindreLED(ledToTurnOn);
ledToTurnOn = 0;
point++;
} else if (digitalRead(bouton_4) == LOW && ledToTurnOn == 4) {
eteindreLED(ledToTurnOn);
ledToTurnOn = 0;
point++;
}
if ((Timeleft) > 10000) {
lcd.setCursor(13,0);
lcd.print(Timeleft / 1000);
lcd.setCursor(15,0);
lcd.print("s");
}
else {
lcd.setCursor(13,0);
lcd.print(" ");
lcd.setCursor(14,0);
lcd.print(Timeleft / 1000);
lcd.setCursor(15,0);
lcd.print("s");
}
delay(40);
}
lcd.setCursor(0, 0);
lcd.print("Terminer");
// La séquence est terminée, éteindre toutes les LEDs
eteindreLED(1);
eteindreLED(2);
eteindreLED(3);
eteindreLED(4);
ledToTurnOn = 0;
}
}
void raz() {
startTime = millis(); // Réinitialiser le compteur de temps
Timeleft = sequenceDuration - (millis() - startTime); // Reset tempo
point = 0; // Réinitialiser le compteur de points
}
void allumerLED(int led) {
// Éteindre toutes les LEDs
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
// Identifier la broche de la LED en fonction du numéro de LED
int brocheLED;
switch (led) {
case 1:
brocheLED = LED_1;
break;
case 2:
brocheLED = LED_2;
break;
case 3:
brocheLED = LED_3;
break;
case 4:
brocheLED = LED_4;
break;
default:
// Gestion d'une valeur incorrecte
return;
}
// Allumer la LED correspondante
digitalWrite(brocheLED, HIGH);
}
void eteindreLED(int led) {
// Identifier la broche de la LED en fonction du numéro de LED
int brocheLED;
switch (led) {
case 1:
brocheLED = LED_1;
break;
case 2:
brocheLED = LED_2;
break;
case 3:
brocheLED = LED_3;
break;
case 4:
brocheLED = LED_4;
break;
default:
// Gestion d'une valeur incorrecte
return;
}
// Éteindre la LED correspondante
digitalWrite(brocheLED, LOW);
}