[Programmation]Help 4 boutons poussoir pour code(mot de passe)

Bonjour. Pour mon lycée, j’effectue un projet dont mon but est de sécurise une mini-porte. Pour cela , j’utilise actuellement un servomoteur , et j’ai réussi a lorsque que j’appuie sur un bouton, une LED s’allume et le bouton se presse. Le servo ne reviens pas dans sa position de base temps que je ne relâche le bouton poussoir.(voir lien imgur , et ne faites pas attention a ce qu’il y a a gauche sur la plaque d’essai, ce sont des tests)
Voila mon problème: j’aimerais réussir a faire un code, a 4 boutons, dont il faut que j’appuie dans un ordre précis(le but d’un mot de passe quoi xD ). Merci de m’apporter de l’aide si vous le pouvez, car je suis vraiment nul. voila mon code pour l’instant.
lien image : http://imgur.com/gallery/4m7Bi

voici mon code actuelle(possiblement un peu usseless, car je suis mauvais):

#include <Servo.h> //Bibliothèque servomoteur d’arduino

Servo ServoMoteur1; // Je donne à mon servomoteur le nom : ServoMoteur1

const int Poussoir=3; //Je décide d’utiliser la PIN A3 (entrée analogique) pour piloter mon servomoteur
const int unBouton=4; //Je décide d’utiliser la PIN A4 (entrée analogique) pour piloter mon servomoteur
int valeurLue=0; // J’initialise ma valeur “valeurLue” à 0
void setup(){
Serial.begin(9600); // vitesse de transfert
pinMode(Poussoir, INPUT); //J’impose la PIN A3 en entrée
pinMode(unBouton, INPUT);

ServoMoteur1.attach(9); // Attacher la pin 9 à l’objet servo.
ServoMoteur1.write( 1000 ); // J’initialise le servo en butée “basse” (0 degré)
//A0090: pour ce modèle, j’ai une variation de 650 à 2100, test pour ne pas forcer en butée
//MC-1811: pour ce modèle, j’ai une variation de 800 à 2100, test pour ne pas forcer en butée
}

void loop(){

delay(400);
////delay(200);
valeurLue=analogRead(Poussoir);
if (valeurLue>1200){ //si je mets la PIN A3 à 5V, je dois avoir une valeur proche de 1023 (varition de 0 à 1023, donc la valeur de 800 permet de détecter l’appui sur le bouton)
ServoMoteur1.write(1500); // Assigne un angle maximal au servomoteur (160° environ)(valeur changé, a la base 2100)
Serial.println(valeurLue); // permet de voir sur le moniteur serie la valeur lue dans la PIN A3

}
else{
ServoMoteur1.write( 1000); //sinon je demande au servomoteur de rester à 0°

}
}

Dans ce code j’ai réussi a activer le servomoteur et une led seulement quand j’appuie sur le bouton, mais pour plusieurs je séche
Merci d’avance pour toute aide

up

bonjour,
1- code entre balise code </>
2- pas la peine de faire un up 30mn après avoir posté, les membres répondent lorsqu’ils ont le temps et s’ils veulent répondre.

Bonjour, excusez mon impatience mais c’est du au fait que j’ai que très, peu accès a mon PC. Puis j’ai pas compris le 1

bon, j’ai trouver moi même quelques petites erreurs, voici mon code un petit peu modifié:
//Rotation maximale pour servo MC-1811 avec appui maintenu sur poussoir
//Lycee Haroun Tazieff

#include <Servo.h> //Bibliothèque servomoteur d’arduino

Servo ServoMoteur1; // Je donne à mon servomoteur le nom : ServoMoteur1

const int Poussoir=3;
//Je décide d’utiliser la PIN A3 (entrée analogique) pour piloter mon servomoteur

const int Poussoir2=5;
int valeurLue=0; // J’initialise ma valeur “valeurLue” à 0
int valeurLue2=0;
void setup(){
Serial.begin(9600); // ouvrir le port serie
pinMode(Poussoir, INPUT); //J’impose la PIN A3 en entrée
pinMode(Poussoir2, INPUT); //PIN A5

ServoMoteur1.attach(9); // Attacher la pin 9 à l’objet servo.
ServoMoteur1.write( 800 ); // J’initialise le servo en butée “basse” (0 degré)
//A0090: pour ce modèle, j’ai une variation de 800 à 2350, test pour ne pas forcer en butée
//MC-1811: pour ce modèle, j’ai une variation de 800 à 2100, test pour ne pas forcer en butée
}

void loop(){

delay(400);
////delay(200);
valeurLue=analogRead(Poussoir);

if (valeurLue>1000){ //si je mets la PIN A3 à 5V, je dois avoir une valeur proche de 1023 (varition de 0 à 1023, donc la valeur de 1000 permet de détecter l’appui sur le bouton, on peut voir avec le moniteur serie des valeurs proche de 800 sans appui sur le bouton)
ServoMoteur1.write( 2350); // Assigne un angle maximal au servomoteur (160° environ)
Serial.println(" Valeur lue sur l’entree A3"); Serial.println(valeurLue); // permet de voir sur le moniteur serie la valeur lue dans la PIN A3
delay(500); // ralenti l’affichage sur le moniteur serie

valeurLue2=analogRead(Poussoir2);

if (valeurLue2>1000){ //si je mets la PIN A5 à 5V, je dois avoir une valeur proche de 1023 (varition de 0 à 1023, donc la valeur de 1000 permet de détecter l’appui sur le bouton, on peut voir avec le moniteur serie des valeurs proche de 800 sans appui sur le bouton)
ServoMoteur1.write( 2350); // Assigne un angle maximal au servomoteur (160° environ)
Serial.println(" Valeur lue sur l’entree A5"); Serial.println(valeurLue2); // permet de voir sur le moniteur serie la valeur lue dans la PIN A5
delay(500); // ralenti l’affichage sur le moniteur serie
}
}
else{
ServoMoteur1.write( 800); //sinon je demande au servomoteur de rester à 0°
Serial.println(" Valeur lue sur l’entree A3"); Serial.println(valeurLue); // permet de voir sur le moniteur serie la valeur lue dans la PIN A3
delay(500); // ralenti l’affichage sur le moniteur serie
}

}

De plus, j’essaye , comme je vous l’ai dis, d’ajouter un autre bouton poussoir, qui est assigné à A5.Sauf que je me suis rendu compte que même quand je branche l’entrée A5 a 5 volts pas directement évidemment, a l’aide de câble que je mets sur ma plaque d’essai, je remarque que dans le moniteur série qui lis la sortie A3, mais pas la A5, donc je présume avoir un problème sur mon code

Merci d’avance pour toute aide

infobarquee:
1- code entre balise code </>

anths:
Puis j’ai pas compris le 1

C’est ça le 1:

Il te demande de mettre le code que tu donnes entre balise de mise en forme dédié pour ça.

La tel que présenté c’est imbitable.

Ha d’accord. C’est bon comme ça?

#include <Servo.h>    //Bibliothèque servomoteur d'arduino

Servo ServoMoteur1;   // Je donne à mon servomoteur le nom : ServoMoteur1

const int Poussoir=3;
//Je décide d'utiliser la PIN A3 (entrée analogique) pour piloter mon servomoteur

const int Poussoir2=5;
int valeurLue=0;        // J'initialise ma valeur "valeurLue" à 0
int valeurLue2=0;
void setup(){
  Serial.begin(9600);   // ouvrir le port serie
  pinMode(Poussoir, INPUT); //J'impose la PIN A3 en entrée
  pinMode(Poussoir2, INPUT); //PIN A5
 
  ServoMoteur1.attach(9); // Attacher la pin 9 à l'objet servo.
   ServoMoteur1.write( 800 ); // J'initialise le servo en butée "basse" (0 degré)
   //A0090: pour ce modèle, j'ai une variation de 800 à 2350, test pour ne pas forcer en butée
   //MC-1811: pour ce modèle, j'ai une variation de 800 à 2100, test pour ne pas forcer en butée
}

void loop(){
 
 delay(400);
 ////delay(200);
 valeurLue=analogRead(Poussoir);

 if (valeurLue>1000){      //si je mets la PIN A3 à 5V, je dois avoir une valeur proche de 1023 (varition de 0 à 1023, donc la valeur de 1000 permet de détecter l'appui sur le bouton, on peut voir avec le moniteur serie des valeurs proche de 800 sans appui sur le bouton)
  ServoMoteur1.write( 2350);     // Assigne un angle maximal au servomoteur (160° environ)
 Serial.println(" Valeur lue sur l'entree A3"); Serial.println(valeurLue);   // permet de voir sur le moniteur serie la valeur lue dans la PIN A3
 delay(500); // ralenti l'affichage sur le moniteur serie

 valeurLue2=analogRead(Poussoir2);

  if (valeurLue2>1000){      //si je mets la PIN A5 à 5V, je dois avoir une valeur proche de 1023 (varition de 0 à 1023, donc la valeur de 1000 permet de détecter l'appui sur le bouton, on peut voir avec le moniteur serie des valeurs proche de 800 sans appui sur le bouton)
  ServoMoteur1.write( 2350);     // Assigne un angle maximal au servomoteur (160° environ)
 Serial.println(" Valeur lue sur l'entree A5"); Serial.println(valeurLue2);   // permet de voir sur le moniteur serie la valeur lue dans la PIN A5
 delay(500); // ralenti l'affichage sur le moniteur serie
}
 }
 else{
  ServoMoteur1.write( 800);   //sinon je demande au servomoteur de rester à 0°
  Serial.println(" Valeur lue sur l'entree A3"); Serial.println(valeurLue);   // permet de voir sur le moniteur serie la valeur lue dans la PIN A3
   delay(500); // ralenti l'affichage sur le moniteur serie
 }
 
}

Et merci beaucoup d’aider un noob comme moi :smiley:

Bon j'ai rajouté ça a la fini du code

   Serial.println(" Valeur lue sur l'entree A5"); Serial.println(valeurLue2);   // permet de voir sur le moniteur serie la valeur lue dans la PIN A3
   delay(500); // ralenti l'affichage sur le moniteur serie
 }

Ce qui me permet de voir les données reçu par la pin A5(pin a laquelle j'essaye de rajouter mon deuxième bouton) et ça m'affiche de maniére constante entren 355 et 375.Donc je pense que cela vient de mon montage, du moins c'est ce que je pense, mais ça peux aussi venir du code.Je vais essayé de regler ça et je vous tiens au courant

Avec un multi-mètre(je crois que ça s'appelle comme ça, c'est un appareil pour mesurer les tensions) j'ai trouvé quelques petites erreur dans mon montage, et une fois réparer , quand j'appuie sur mon deuxième bouton, le servomoteur bouge un tout petit-peu , et si j’appuie plein de fois très vite sur mon bouton, le servomoteur tourne comme prévu, puis revient a sa position initial.Je pense donc que le servo ne garde pas en mémoire le fait que j'appuie sur le bouton, alors que ça ne le fait pas avec le premier bouton: j'en déduis que j'ai mis quelque chose dans le code pour mon premier bouton que je n'ai pas mis pour le deuxième. Merci d'avance si vous trouvez mon erreur, ou d'autres erreurs que j'ai pu faire. Merci

[EDIT]: On a posté en même temps...

Actuellement, ton code fonctionne? Le servo réagit comme tu le souhaite?

Selon la référence, la fonction write(); attend une valeur angulaire comprise entre 0 et 180 et non une valeur en µseconde comme tu le faits.

Pour ca, il y a la fonction writeMicroseconds(); qui elle attend bien une valeur de µseconde.

Puisque dans ton code on aperçois que tu as justement determiné les valeurs mini et maxi en µseconde de ton servo, tu pourrai le déclarer ainsi:

ServoMoteur1.attach(9, 800, 2100);

et ensuite le commander en position avec write();

La lecture analogique du bouton poussoir:
Pourquoi pas, mais étant donné que tu gère que 2 positions, une lecture digitale suffirai.

La patte digitale déclaré en INPUT_PULLUP et le bouton câblé entre la patte et la masse et ça renvoi 1 quand non appuyé et 0 quand appuyé.

Pourquoi 2 BP qui font exactement la même chose?

Voici déjà ce qu'on peut dire sur ton code actuel.

Par contre, ton vrai problème, c'est de faire un code à base de quatre bouton:

Dans ton code, il n'y a rien la dessus, mais tu as l'air de vouloir bosser un peu, voici une piste:

Il va te falloir 2 tableau:

  • Un qui contient de bon code
  • Un pour mémoriser la séquence d'appui sur les boutons

Ensuite assigne de manière arbitraire une valeur (une lettre, un chiffre comme tu veux) à chaque bouton

Mémorise chaque appui sur les boutons dans le tableau

Puis compare les tableaux.

Je t'ai bien dégrossi le taff, reviens avec un truc plus détaillé, un bout de code, un grafcet comme tu veux ou on y retrouve uniquement le traitement du mot de passe, on verra après pour la commande du servo.

Bon courage

Merci beaucoup.Pour l'instant, je ne peux que repondre a tes questions:
"Actuellement, ton code fonctionne? Le servo réagit comme tu le souhaite?" alors pour le premier bouton , oui et oui, mais je ne sais pas pourquoi mais pour le deuxieme ce n'est pas la cas
"Pourquoi 2 BP qui font exactement la même chose?" Mon but est de faire un code. Par exemple, je voudrais faire que pour activer le servo, il faille appuyer sur le bouton 2, ensuite le bouton 1 , ensuite le bouton 3 puis le 4.Mais vu que je suis totalemnt nul et débile, j'essaye d'abord d'implanter 1 seul bouton.
Merci beaucoup pour ton trvail, je m'y mettrais la semaine prochaine et je vous tiendrais au courant.
Merci encore !

Ok mais tu es parti dans la mauvaise direction alors.

Si a chaque appui sur un bouton tu assigne une valeur au servo, ça ne marchera pas et Surtout pas si tu as 4 bouton qui font la même chose au niveau du Servo.

Non, il faut que le code analyse les 4 appuis puis ordonne l'ouverture du servo.

J'ai pas tout détaillé dans la piste que je te donne, il y a des trucs que tu va devoir trouver.

ok merci je vais essayer avec la piste que tu m'as donner et je vous tiens au courant.Merci encore