[conseil] 2 x if pour 2 mots de passe?

Bonjour,

j’essai d’induire 2 mouvements distinct d’un même servo-moteur, conditionnés par 2 “password” différents, entrés sur un Keypad.

je voudrait savoir comment faire vérifier distinctement les 2 password, afin de provoquer l’un ou l’autre mouvement.

Puis-je mettre 2 “if-else” distinct dans la même partie “void checkPassword ()”?

quelle autre méthode puis-je utiliser?

voici mon code: (ya du commentaire anglophone, car certaines parties sont des copie/colle, que je ne maitrise pas complétement (les fonctions du Keypad notamment).

#include <Password.h>
#include <Keypad.h>
#include <Servo.h>


Servo myservo; //declare myservo
int pos = 0;    // variable pour stocker la position courante du servo

Password password = Password( "5263" ); //1er mot de passe pour une position du servo, peut-etre changé
Password password2 = Password( "3625" ); //dexieme mot de passse pour une position differente, peut-ete changé


const byte ROWS = 4; // quatre rows
const byte COLS = 4; // columns
// defini les map des broches utilisés
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 5, 4, 3 };

// création de l'objet "clavier"
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const int LedVERTE = 11;
const int LedROUGE = 12;


void setup() {
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(200);

  //les 2 Leds sont branchées en sorties
  pinMode(LedVERTE, OUTPUT);
  pinMode(12, OUTPUT);

  myservo.attach(10); //le servo est attaché en broche 10
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}

void loop() {


keypad.getKey();
//servo en position de depart
myservo.write(0);
}
//take care of some special events

void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:

      Serial.print("Enter:");
      Serial.println(eKey);
      delay(10);

      Serial.write(254);

      switch (eKey) {
        case '*': checkPassword(); delay(1); break;

        case '#': password.reset(); delay(1); break;

        default: password.append(eKey); delay(1);
      }
  }
}
void checkPassword()
{

  if (password.evaluate())        //si mot de password 1 est OK
  {
    Serial.println("Accepted");   //le moniteur ecrit
    Serial.write(254); delay(10);

    //rotation du SERVO
    for (pos = 0; pos < 120; pos += 1) // aller de 0° à 120°
    { // une étape à la fois
      myservo.write(pos);            // aller à la position stocké dans 'pos'
      delay(80);                    // attendre 80ms que le servomoteur se rende à 'pos'


      digitalWrite(11, HIGH);//allumer
      delay(5000); //wait 5 seconds
      digitalWrite(11, LOW);// eteindre
    }
    //reprend plus rapidement la position 0
    for (pos = 120; pos >= 1; pos -= 1) // aller de 120° à 0°
    { // une étape à la fois
      myservo.write(pos);              // aller à la position stocké dans 'pos'
      delay(30);                      // attendre 30ms que le servomoteur se rende à 'pos'
      digitalWrite(12, HIGH);        //fait clignoter la LED ROUGE
      delay(150);
      digitalWrite(12, LOW);
      delay(150);
    }
  }
    else  //si mauvais mot de passe:
    {
      Serial.println("Denied"); //  "accés refusé"
      Serial.write(254); delay(10);

      myservo.write(0);                    //le servo reste fermé
      digitalWrite(LedROUGE, HIGH);             //allumer la LED rouge
      delay(500);                        //attendre 1/2 seconde
      digitalWrite(LedROUGE, LOW);             //eteindre la LED rouge

    }
  }

merci de vos précieux conseils.

if (password.evaluate()) {
}
else if (password2.evaluate()) {
}
else {
}

//Par contre il faudra aussi ajouter tes codes de touche à password2

default: password.append(eKey); password2.append(eKey); delay(1);

Merci!!

j'aurais pas pensé a "else if".

j'y retourne.

Et qu’est-ce qui doit se passer si les 2 mots de passe sont identiques ?

je les ai juste inversés pour le test.

Tu penses que la machine les reconnait comme identiques?
L'ordre dans lequel les chiffres sont tapés n'a pas d'importance?

Quoi qu'il en soit, ca plante pour le premier code,
quand au second, ça fonctionne sauf que le servo reprend d'un coup sa position 0 ,
a la fin, sans que je ne lui ai rien demandé.

Est-ce que je pourrais lui demander de se déconnecté, a la fin, afin de rester en place?

Peut être si vous lui demandez gentiment ? On sait jamais.... :slight_smile:

Sinon en programmant c’est sûr que ça peut le faire !

c'est ce que j'entendais par "lui demander"...
mais

myservo.detach();

ne suffit apparemment pas.

quels solutions connaissez-vous pour que mon servo reste a la place qui m'intéresse?

Le servo est un moteur équipé d'un potentiomètre mécaniquement couplé à l'axe du moteur, qui vous donne un asservissement de position.

On lui donne une consigne et l'électronique interne fait bouger le moteur pour aller respecter cette consigne. Si une force l'éloigne de la consigne, le moteur force pour conserver la consigne.

Cette consigne est sous la forme d'une pulsation de type PWM.

Lorsqu'on détache un moteur, on supprime cette pulsation et ce que fait le moteur n'est pas défini. La plupart restent au même endroit et conservent la consigne.

si on coupe le courant l'asservissement est coupé et le champ magnétique des bobines aussi.
Donc le servo se retrouve en libre. Comme il n'y a pas de mécanisme de rappel (ressort), votre Servo reste à la dernière position tant qu'on ne force pas dessus, mais on peut le forcer à la main.

Si vous regardez mon tuto pour gérer un flux asynchrone vous verrez comment capturer une entrée sur le keypad et si vous lisez celui sur la ( programmation par machine à états ) vous pourrez vous fabriquer une petit code qui correspondra sans doute à vos besoins.

Sinon vous pouvez aussi jeter un oeil sur la bidouille de Kammo, comme il dit dans son code:

// un super mega code trop genial
// pour enregister des positions avec un servo
// et les lui faire lire tout seul comme un grand
// merci aux copains du forum Arduino France
// kammo - 14/04/2018