Re, les Hobbits !
Voilà ce que j'ai fait (je précise à l'avance, c'est bourré d'erreurs mais qu'importe, c'est juste pour vous donner une idée) :
int DO = ?? ;//code binaire correspondant au do sur le clavier
int RE = ?? ;//code binaire correspondant au ré sur le clavier
int MI = ?? ;//code binaire correspondant au mi sur le clavier
int FA = ?? ;//code binaire correspondant au fa sur le clavier
int SOL = ?? ;//code binaire correspondant au sol sur le clavier
//============
const int LedPin1 = 13; // LED rouge
const int LedPin5 = 9; // LED verte
//============
const int SizeCode = 5;
int Code[SizeCode] = {DO, RE, MI, FA, SOL};
int CodeActuel[SizeCode] = {0};
//délai de sécurité : si il y a plus de temps entre deux appuis,le Code est effacé
unsigned long DernierAppui;
const unsigned long Delai = 20E3; // 5000 ms = 10 s
void setup()
{
Serial.begin(9600);
pinMode(LedPin1, OUTPUT);
pinMode(LedPin5, OUTPUT);
pinMode(pin de mon plug midi, INPUT);
DernierAppui = millis();
tempsDep = millis(); // initialisation du temps de départ
}
void loop()
{
lireBoutons();
if( comparerCodes() == true )
{
ouvrirPorte();
//on raz le chrono de sécurité pour ne pas que la porte se referme seule ( il faudra appuyer un des boutons pour la refermer )
DernierAppui = millis();
}
else
fermerPorte();
if (millis() - Delai > DernierAppui)
remplirCode(0);
}
//====================
void ouvrirPorte()
{
digitalWrite(LedPin5, HIGH); //Allumage de la led verte signalant l'ouverture de la porte
digitalWrite(LedPin1, LOW); //Extinction de la led rouge
}
void fermerPorte()
{
digitalWrite(LedPin5, LOW); //Extinction de la led verte
digitalWrite(LedPin1, HIGH); //Allumage de la led rouge
p=0;// retour au début du tableau
}
void lireBoutons()
{
for(int i = 0; i < NbNotes; i++)
if (commandByte == noteOn) //bouton appuyé ?
{
delay(30); //anti-rebond
while (commandByte == noteOff) {} //on attends d'avoir relaché le bouton
remplirCode( i+1 ); //et on stocke le numéro du bouton dans le tableau
}
//si on est arrivé là, c'est qu'aucun bouton n'était appuyé : on retourne 0
}
void remplirCode(int valeur)
{
//on décale les cases vers la première, qui est CodeActuel[0], car les index commencent toujours à 0 :
for(int i = 1; i < SizeCode; i++)
CodeActuel[i-1]=CodeActuel[i];
//et on remplit la dernière, donc à l'index taille du tableau -1 puisque que l'index commence à 0 :
CodeActuel[SizeCode-1]=valeur;
//et enfin on raz le chrono de sécurité
DernierAppui = millis();
}
bool comparerCodes()
{
for(int i=0; i < SizeCode; i++)
if (CodeActuel[i] != Code[i])
return false; //dès qu'une des valeurs est fausse, quitte et retourne faux
return true; //si on est arrivé là, c'est que le Code est ok, on retourne vrai
}
Pour l'expliquer quand même un minimum, ma déclaration des "int" au début n'est pas adaptée. Ce que j'aimerais, c'est faire correspondre chaque note à un son appellation (DO1 au lieu de me retaper les 3 bytes à chaque fois). Je peux par exemple utiliser ça pour chaque note :
byte commandByte;
byte noteByte;
byte velocityByte;
byte noteOn = 144;
//light up led at pin 13 when receiving noteON message with note = 60
void setup(){
Serial.begin(31250);
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
void checkMIDI(){
do{
if (Serial.available()){
commandByte = Serial.read();//read first byte
noteByte = Serial.read();//read next byte
velocityByte = Serial.read();//read final byte
if (commandByte == noteOn){//if note on message
//check if note == 60 and velocity > 0
if (noteByte == 60 && velocityByte > 0){
digitalWrite(13,HIGH);//turn on led
}
}
}
}
while (Serial.available() > 2);//when at least three bytes available
}
void loop(){
checkMIDI();
delay(100);
digitalWrite(13,LOW);//turn led off
}
Dans cet exemple, si on joue la séquence DO RE MI FA SOL, la led verte s'allume. (en tout cas c'est le résultat que j'AIMERAIS obtenir)
Je suis sur une bonne piste ?