#include "pitches.h"
#define SPEAKER_PIN 8 // Haut-parleur
const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 }; // Boutons associés aux LEDs
const uint8_t columnPins[] = { A5, A4, A3, A2 }; // Colonnes associées aux LEDs
const uint8_t linePins[] = { A0, A1 }; // Lignes associées (A0 et A1)
const uint8_t numLEDs = 8;
int score = 0; //score
// Mapping des LEDs corrigé
const uint8_t ledMapping[numLEDs][2] = {
{A0, A5}, // LED 1 : Ligne A0, Colonne A5 (Bouton 12)
{A0, A4}, // LED 2 : Ligne A0, Colonne A4 (Bouton 11)
{A0, A3}, // LED 3 : Ligne A0, Colonne A3 (Bouton 10)
{A0, A2}, // LED 4 : Ligne A0, Colonne A2 (Bouton 9)
{A1, A5}, // LED 5 : Ligne A1, Colonne A5 (Bouton 7)
{A1, A4}, // LED 6 : Ligne A1, Colonne A4 (Bouton 6)
{A1, A3}, // LED 7 : Ligne A1, Colonne A3 (Bouton 5)
{A1, A2} // LED 8 : Ligne A1, Colonne A2 (Bouton 4)
};
void setup() {
Serial.begin(9600); // Initialisation de la communication série
// Configure les broches des boutons comme entrées avec pull-up
for (uint8_t i = 0; i < numLEDs; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
Serial.println(i);
}
// Configure les lignes et les colonnes comme sorties
for (uint8_t i = 0; i < 2; i++) {
pinMode(linePins[i], OUTPUT);
digitalWrite(linePins[i], HIGH); // Désactive les lignes par défaut
}
for (uint8_t i = 0; i < 4; i++) {
pinMode(columnPins[i], OUTPUT);
digitalWrite(columnPins[i], LOW); // Désactive les colonnes par défaut
}
// Configure les haut-parleurs
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(SPEAKER_PIN, OUTPUT);
randomSeed(analogRead(0)); // Initialise le générateur aléatoire
}
void loop() {
if (digitalRead(buttonPins[0]) == LOW) {
for (uint8_t i = 0; i < numLEDs; i++) {
uint8_t line = ledMapping[i][0]; // Ligne de la LED
uint8_t column = ledMapping[i][1]; // Colonne de la LED
digitalWrite(line, LOW); // Active la ligne
digitalWrite(column, HIGH); // Active la colonne
delay(500);
digitalWrite(line, HIGH); // Active la ligne
digitalWrite(column, LOW); // Active la colonne
}
score =0;
while (score < 10){
uint8_t randomLED = random(0, numLEDs); // Sélectionne une LED aléatoire
uint8_t line = ledMapping[randomLED][0]; // Ligne de la LED
uint8_t column = ledMapping[randomLED][1]; // Colonne de la LED
// Allume la LED sélectionnée
digitalWrite(line, LOW); // Active la ligne
digitalWrite(column, HIGH); // Active la colonne
/*Serial.print("LED allumée : ");
Serial.print("Ligne ");
Serial.print(line == A0 ? "A0" : "A1");
Serial.print(", Colonne ");
Serial.println(column);
*/
unsigned long startTime = millis(); // Enregistre le temps de début
bool correctButtonPressed = false;
// Attend jusqu'à 2 secondes ou jusqu'à ce que le bouton soit pressé
while (millis() - startTime < 2000) {
for (uint8_t i = 0; i < numLEDs; i++) {
if (digitalRead(buttonPins[i]) == LOW) { // Vérifie si un bouton est pressé
delay(50); // Évite les faux positifs
if (digitalRead(buttonPins[i]) == LOW) { // Revérifie après le délai
//Serial.print("Bouton détecté : ");
//Serial.println(i);
if (i == randomLED) {
// Le bouton correspond à la LED active
correctButtonPressed = true;
tone(SPEAKER_PIN, NOTE_B5, 50); // Son aigu pendant 100 ms
break;
} else {
// Mauvais bouton pressé
tone(SPEAKER_PIN, NOTE_C3, 15); // Son grave pendant 100 ms
delay(100); // Évite les faux positifs
tone(SPEAKER_PIN, NOTE_C3, 15); // Son grave pendant 100 ms
delay(100); // Évite les faux positifs
tone(SPEAKER_PIN, NOTE_C3, 15); // Son grave pendant 100 ms
}
}
}
}
if (correctButtonPressed) break; // Arrête d'attendre si le bon bouton est pressé
}
// Si le temps s'est écoulé sans appui ou avec un mauvais appui
if (!correctButtonPressed) {
if (millis() - startTime >= 2000) {
tone(SPEAKER_PIN, NOTE_C3, 50); // Son grave pour le délai écoulé
Serial.println("Délai écoulé sans appui.");
}
} else {
// Bouton correct pressé : Éteint immédiatement la LED et passe à la suivante
digitalWrite(column, LOW);
digitalWrite(line, HIGH);
Serial.println("Bouton correct pressé. Passage à la LED suivante.");
score=score+1;
Serial.print("score = ");
Serial.print(score);
Serial.println(" ");
delay(60); // Pause pour éviter un double déclenchement
continue; // Passe directement à la LED suivante
}
delay(50); // Pause pour éviter des sons répétitifs
// Éteint la LED si aucun bouton n'a été pressé dans les 2 secondes
digitalWrite(column, LOW); // Désactive la colonne
digitalWrite(line, HIGH); // Désactive la ligne
}
tone(SPEAKER_PIN, NOTE_B5, 300); // Son grave pour le délai écoulé
delay(700); // Pause pour éviter des sons répétitifs
tone(SPEAKER_PIN, NOTE_B5, 300); // Son grave pour le délai écoulé
Serial.println("FELICITATION");
Serial.println("vous venez de valider votre trvail complémentaire");
}
}