Bonjour,
Vous vous en doutez, vous lisez un message de détresse, comme c'est de coutume sur ce forum.
J'ai suivi un petit "cours" en ligne pour faire un coffre à ouverture par combinaison de boutons poussoirs.
Vous pouvez le consulter ici : http://www.wikidebrouillard.org/index.php?title=Coffre_à_code_avec_Arduino&oldid=23463
Etant donné qu'il ne correspond pas exactement à ce que je souhaite faire, j'ai essayé de le modifier, de m'en servir de base pour mon cablage et pour mon programme.
Voilà donc ce que j'ai fait niveau cablage : (je voulais insérer mon image ici mais je n'ai pas réussi, du coup je l'ai attachée en pièce jointe)
Et voilà mon programme :
void remiseZeroCode(void);
void ouvrirPorte(int value);
void afficherCodeActuel(void);
int switchPin1 = 2; // input switch 1 - interrupteur sur la patte 2 de l'arduino ( entrée numérique )
int switchPin2 = 3; // input switch 2 - interrupteur sur la patte 3 de l'arduino ( entrée numérique )
int switchPin3 = 4; // input switch 3 - interrupteur sur la patte 4 de l'arduino ( entrée numérique )
int switchPin4 = 5; // input switch 4 - interrupteur sur la patte 5 de l'arduino ( entrée numérique )
int switchPin5 = 6; // input switch 5 - interrupteur sur la patte 6 de l'arduino ( entrée numérique )
//============
int ledPin1 = 13; // select the pin for the LED1 - La led 1 doit être placée sur l'entrée/sortie numérique 13 de l'arduino
int ledPin5 = 9; // select the pin for the LED5 - La led 5 ( blanche qui signale l'ouverture du coffre) doit être placée sur l'entrée/sortie numérique 9 de l'arduino
//============
const int sizeCode=5;
int code[sizeCode]={2,3,5,1,4};
int codeActuel[sizeCode]={0};
int emplacementActuelTableau=1; //indexeur sur le tableau codeActuel
int porteOuverte=0; //Indique quand la porte est ouverte (1) ou fermée (0)
int ouverturePorte=1; //Indique quand il faut ouvrir la porte(1), ou la fermer (0);
int antirebond=0; //permet d'éviter qu'à la suite d'un appui sur plusieurs boutons simultanément ou un appui long, le code tapé soit mal interpreté.
//permet également d'éviter qu'un appui court sur un bouton soit compté plusieurs fois dans le programme
int alarme=0;
int sensorSwitch1 = 0; //recupère la valeur du bouton poussoir1
int sensorSwitch2 = 0; //recupère la valeur du bouton poussoir2
int sensorSwitch3 = 0; //recupère la valeur du bouton poussoir3
int sensorSwitch4 = 0; //recupère la valeur du bouton poussoir4
int sensorSwitch5 = 0; //recupère la valeur du bouton poussoir5
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin5, OUTPUT);
Serial.begin(9600);
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
pinMode(switchPin3, INPUT);
pinMode(switchPin4, INPUT);
pinMode(switchPin5, INPUT);
}
//============
void ouvrirPorte(int value)
{ if (value==1)
{
digitalWrite(ledPin5, HIGH); //Allumage de la led verte signalant l'ouverture de la porte
digitalWrite(ledPin1, LOW); //Extinction de la led rouge
porteOuverte=1; //On met cette variable à 1 pour dire que la porte est ouverte !
}
if (value==0)
{
digitalWrite(ledPin5, LOW); //Extinction de la led verte
digitalWrite(ledPin1, HIGH); //Allumage de la led rouge
porteOuverte=0; //la porte est refermée, cette variable est donc mise à zero
}
}
//============
void afficherCodeActuel(void)
{
Serial.println("--------Affichage du code actuel-------");
Serial.print(codeActuel[1]);
Serial.print(codeActuel[2]);
Serial.print(codeActuel[3]);
Serial.print(codeActuel[4]);
Serial.println(codeActuel[5]);
}
//============
void loop() {
// Ici, on charge dans les différentes variables les valeurs recuillies par les capteurs
{ sensorSwitch1 = digitalRead(switchPin1); //valeur Switch 1
sensorSwitch2 = digitalRead(switchPin2); //valeur Switch 2
sensorSwitch3 = digitalRead(switchPin3); //valeur Switch 3
sensorSwitch4 = digitalRead(switchPin4); //valeur Switch 4
sensorSwitch5 = digitalRead(switchPin5); //valeur Switch 5
}
if((sensorSwitch1==LOW) && (sensorSwitch2==LOW) && (sensorSwitch3==LOW) && (sensorSwitch4==LOW) && (sensorSwitch5==LOW))
{
antirebond=0;
}
//============================================
if (antirebond==0)
{
if((sensorSwitch1==HIGH) && (sensorSwitch2==LOW) && (sensorSwitch3==LOW) && (sensorSwitch4==LOW) && (sensorSwitch5==LOW))
{
Serial.println("Passage switch 1");
codeActuel[emplacementActuelTableau]=1;
emplacementActuelTableau+=1;
afficherCodeActuel();
antirebond=1;
}
else if((sensorSwitch2==HIGH) && (sensorSwitch1==LOW) && (sensorSwitch3==LOW) && (sensorSwitch4==LOW) && (sensorSwitch5==LOW))
{
Serial.println("Passage switch 2");
codeActuel[emplacementActuelTableau]=2;
emplacementActuelTableau+=1;
afficherCodeActuel();
antirebond=1;
}
else if((sensorSwitch1==LOW) && (sensorSwitch2==LOW) && (sensorSwitch3==HIGH) && (sensorSwitch4==LOW) && (sensorSwitch5==LOW))
{
Serial.println("Passage switch 3");
codeActuel[emplacementActuelTableau]=3;
emplacementActuelTableau+=1;
afficherCodeActuel();
antirebond=1;
}
else if((sensorSwitch1==LOW) && (sensorSwitch2==LOW) && (sensorSwitch3==LOW) && (sensorSwitch4==HIGH) && (sensorSwitch5==LOW))
{
Serial.println("Passage switch 4");
codeActuel[emplacementActuelTableau]=4;
emplacementActuelTableau+=1;
afficherCodeActuel();
antirebond=1;
}
else if((sensorSwitch1==LOW) && (sensorSwitch2==LOW) && (sensorSwitch3==LOW) && (sensorSwitch4==LOW) && (sensorSwitch5==HIGH))
{
Serial.println("Passage switch 5");
codeActuel[emplacementActuelTableau]=5;
emplacementActuelTableau+=1;
afficherCodeActuel();
antirebond=1;
}
}
ouverturePorte=1; //Variable mise à 1 par defaut
//===============================================================
for ( int i=0; i< sizeCode;i++)
{
if (code[i]!=codeActuel[i])
{
ouverturePorte=0; // si une anomalie dans le code est detectée, mise à zero de la variable, la porte restera donc fermée pour ce passage dans la fonction loop
}
}
if (ouverturePorte==1) /* && (alarme==0)) */
{
//COMMANDE OUVERTURE PORTE!
ouvrirPorte(1);
}
}
J'ai laissé certains bouts de code qui ne servent à rien pour le moment mais qui n'entravent pas le bon fonctionnement du programme (enfin... je crois).
Vous l'aurez compris, je souhaite programmer une combinaison (exemple 2, 3, 5, 1, 4) qui, si elle est entrée dans le bon ordre, allume ma led verte (en vrai, c'est un prétexte. Elle peut mettre un moteur en marche, activer un électro-aimant, etc.)
Et vous l'aurez tout aussi bien compris, ce que j'ai fait ne fonctionne pas.
J'arrive à afficher dans le moniteur série de l'IDE la combinaison en cours mais, quand j'active avec succés le dernier bouton poussoir, rien ne se passe.
Où sont mes erreurs ?
(je précise que je suis un parfait débutant en la matière)
