// Inclusion des bibliothèques pour la gestion du clavier et du servo
#include <Keypad.h>
#include <Servo.h>
// Définition des pins pour les composants
const int buzzerPin = 10; // Pin pour le buzzer
const int pinLEDVerte = 13; // Pin pour la LED verte
const int pinLEDRouge = 12; // Pin pour la LED rouge
// Définition des durées des notes musicales
const int noir = 250; // Durée d'une noire
const int blanche = 500; // Durée d'une blanche
const int ronde = 1000; // Durée d'une ronde
const int croche = 125; // Durée d'une croche
const int double_croche = 62.5; // Durée d'une double croche
const int triple_croche = 31.25; // Durée d'une triple croche
// Fréquences des notes musicales
const int noteDO = 261;
const int noteRE = 294;
const int noteMI = 329;
const int noteFA = 349;
const int noteSOL = 391;
const int noteLA = 440;
const int noteSI = 493;
const int noteLAd = 466.16;
const int noteDO2 = 522;
// Configuration du clavier
const byte Ligne = 4;
const byte Colonne = 4;
char codeCorrect[4] = {'A', '9', '1', '1'}; // Code secret pour ouvrir le coffre
char codeEntree[4]; // Stockage du code entré par l'utilisateur
int indexCode = 0; // Indice pour le tableau codeEntree
// Déclaration et initialisation du clavier
char hexaBouton[Ligne][Colonne] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte Ligne_Pins[Ligne] = {9, 8, 7, 6}; // Pins connectés aux lignes du clavier
byte Colonne_Pins[Colonne] = {5, 4, 3, 2}; // Pins connectés aux colonnes du clavier
Keypad mon_keypad = Keypad(makeKeymap(hexaBouton), Ligne_Pins, Colonne_Pins, Ligne, Colonne);
// Déclaration du servo
Servo monServo;
// Configuration initiale
void setup() {
Serial.begin(9600);
pinMode(pinLEDVerte, OUTPUT);
pinMode(pinLEDRouge, OUTPUT);
monServo.attach(11);
monServo.write(10); // Position initiale du servo
pinMode(buzzerPin, OUTPUT);
}
// Fonctions pour jouer des notes
void playNote(int note, int duration) {
tone(buzzerPin, note, duration);
delay(duration + 50);
}
void playDO(int duration) { playNote(noteDO, duration); }
void playRE(int duration) { playNote(noteRE, duration); }
void playMI(int duration) { playNote(noteMI, duration); }
void playFA(int duration) { playNote(noteFA, duration); }
void playSOL(int duration) { playNote(noteSOL, duration); }
void playLA(int duration) { playNote(noteLA, duration); }
void playSI(int duration) { playNote(noteSI, duration); }
void playLAd(int duration) { playNote(noteLAd, duration); }
void playDO2(int duration) { playNote(noteDO2, duration); }
// Boucle principale
void loop() {
char touche = mon_keypad.getKey();
if (touche) {
codeEntree[indexCode] = touche;
indexCode++;
if (indexCode == 4) { // Lorsque 4 caractères ont été entrés
if (memcmp(codeEntree, codeCorrect, 4) == 0) { // Si le code est correct
if (monServo.read() == 10) {
monServo.write(170); // Ouvrir le coffre
// Séquence de notes à jouer lors de l'ouverture
playLA(triple_croche);
playLAd(triple_croche);
playSI(triple_croche);
playDO2(triple_croche);
delay(1000);
} else {
monServo.write(10); // Fermer le coffre
}
for (int i = 0; i < 5; i++) { // Clignoter la LED verte
digitalWrite(pinLEDVerte, HIGH);
delay(200);
digitalWrite(pinLEDVerte, LOW);
delay(200);
}
} else { // Si le code est incorrect
digitalWrite(pinLEDRouge, HIGH);
delay(5000); // Allumer la LED rouge pour 5 secondes
digitalWrite(pinLEDRouge, LOW);
}
indexCode = 0; // Réinitialiser l'indice pour le prochain code
}
}
}