IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème exécution boucle if


Sujet :

Arduino

  1. #1
    Membre habitué

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 171
    Points
    171
    Par défaut Problème exécution boucle if
    bonjour à vous,

    j'utilise un arduino mega 2560 et un keypad.

    le programme demande à l'utilisateur de rentrer une premiere fois le mot de passe (6 caractères) , puis demande de le resaisir.
    Pour la première partie, pas de soucis.

    En ce qui concerne la deuxième, ça bug.
    ça ne prend pas en considération le !=NO_key.

    Merci par avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    //Arduino 
     
     
    // PIN switch with 16-digit numeric keypad
    // <a href="http://tronixstuff.com/tutorials" target="_blank">http://tronixstuff.com/tutorials</a> > chapter 42
     
    #include "Keypad.h"
    //#include <Wire.h>
    //#include <TWILiquidCrystal.h>
    //LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
     
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //four columns
    char keys[ROWS][COLS] =
    {
      {
        '1','2','3','A'  }
      ,
      {
        '4','5','6','B'  }
      ,
      {
        '7','8','9','C'  }
      ,
      {
        '*','0','#','D'  }
    };
    byte rowPins[ROWS] = {
      2, 3, 4, 5}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {
      6, 7, 8, 9}; //connect to the column pinouts of the keypad
     
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
     
    char PIN[6]={
      '0','0','0','0','0','0'}; //initialisation du code
    char attempt[6]={ 
      '0','0','0','0','0','0'}; // used for comparison
    int z=0;
    int x=0;
     
    void setup()
    {
      pinMode(11,OUTPUT);
      Serial.begin(9600);
    //  lcd.begin(16, 2);
     Serial.println("ENTRER CODE 1 ");
     
    }
     
     
     void code()
     {
     
       int i=0;
    for (int i=0; i<6; i++) 
      {
      char key = keypad.getKey();
      if (key != NO_KEY)
      {
      PIN[z]=key;
      z++;
     
         if (z==6)
         {
          Serial.println("code1 ok");
     
        code2();
         }
         }
     }
     
      }
     
    void code2()
     {
    Serial.println("code2 ");
     
     int j=0;
     int x=0;
     
     for (int j=0; j<6; j++) 
      {
     char key = keypad.getKey();
      if (key != NO_KEY)
      {
      attempt[x]=key;
      x++;
        Serial.println(x);
         if (x==6)
         {
          Serial.println("code2 ok");
     }
      }
     }
     }
     
      void loop()
    {
      code();
               }

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Salut,
    Tu dis que dans la fonction Code2 la condition if (key != NO_KEY) n'est jamais satisfaite. Comment en es tu sur ? Est ce que le code n'aurait pas un problème plus loin ?

    Je vois aussi que tu as une variable globale qui s'appelle "x" et tu déclares un variable locale du même nom "x" dans Code2 ! C'est normal ?

    Est ce que tu peux ajouter les 2 println("debug") que j'ai commenté afin de vérifier là où ça ne fonctionne pas.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void code2()
    {
       Serial.println("code2 ");
     
       int j=0;
       int x=0;
     
      for (int j=0; j<6; j++) 
      {
         char key = keypad.getKey();
         Serial.println("debug1"); // debug trace 1
         if (key != NO_KEY)
         {
            Serial.println("debug2");  // debug trace 2
            attempt[x]=key;
            x++;
     
            Serial.println(x);
     
            if (x==6)
            {
               Serial.println("code2 ok");
            }
         }
      }
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Membre habitué

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 171
    Points
    171
    Par défaut
    Bonjour,
    Pour ce qui est de la variable déclarée un peu partout c'est normal pas normal car j'ai fait plein de test.

    Pour ce qui est du debug je te donne déjà la réponse .
    Le debug1 sera écrit 6 fois. Si je demande la valeur de x ça s'incremente.

    Debug2, n'est jamais écrit .

    Franchement j'ai du mal à comprendre.

    Merci

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Donc tout fonctionne bien mise à part le println ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Membre habitué

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 171
    Points
    171
    Par défaut
    je me demande si est toujours pris en compte

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Ca me semble bizarre ce problème.
    Tu as essayer de ne pas appeler code2() depuis code() pour rendre plus fluide la lecture et la compréhension du programme ?

    Un peu dans ce genre là :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include "Keypad.h"
     
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //four columns
    char keys[ROWS][COLS] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
     
    byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
     
    byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad
     
    char PIN1[6]={'0','0','0','0','0','0'}; //initialisation du code
    char PIN2[6]={'0','0','0','0','0','0'}; // used for comparison
     
     
    void setup()
    {
       Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
       pinMode(11,OUTPUT);
       Serial.begin(9600);
       Serial.println("ENTRER CODE 1 ");
    }
     
     
    void code()
    {
       char key = '0';
       int x = 0;
       int i = 0;
     
       for (i = 0; i < 6; i++) 
       {
          key = keypad.getKey();
     
          if (key != NO_KEY)
          {
      	  PIN1[x] = key;
      	  x++;
     
         	  if (x >= 6)
          		Serial.println("PIN1 ok");
          }
       }
     
       x = 0;
     
       for (i = 0; i < 6; i++) 
       {
          key = keypad.getKey();
     
          if (key != NO_KEY)
          {
      	  PIN2[x] = key;
      	  x++;
     
         	  if (x >= 6)
          		Serial.println("PIN2 ok");
          }
       }
     
       x = 0;
     
     
    // verification
       for (i = 0; i < 6; i++)
       {
          if(PIN1[i] != PIN2[i])
    	 x++;
       }
     
       if(x != 0)
    	Serial.println("PIN 1 different de PIN2");
       else
    	Serial.println("PIN 1 egale a PIN2");
     
    }
     
     
    void loop()
    {
      code();
    }

    A vérifier si ça compile car je n'utilise pas l'IDE Arduino et je n'ai donc pas pu essayer.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #7
    Membre habitué

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 171
    Points
    171
    Par défaut
    Salut,
    je viens de découvrir quelque chose d'étrange.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
      char key = '0';
       int x = 0;
       int i = 0;   //on ne peut pas mettre dans la fonction code() sinon la valeur reste à 0.
     
    void code()
    {
     
     
       for (i = 0; i < 6; i++) 
       {
          key = keypad.getKey();
     
          if (key != NO_KEY)
          {
              Serial.println("debug1")  // quelque soit le code même ceux de début de discution, 
                                                  // pour x==6, on a bien ("PIN1 ok")
                                                 // mais puor x>6, ça renvoi toujours "debug1"; dans le code précédent, ça ne renvoie pas à code2()
      	  PIN1[x] = key;
      	  x++;
     
         	  if (x == 6)
          		Serial.println("PIN1 ok");
                    code2();              // pas de renvoie si code 2 existe, reprise de la   boucle code() et toutes les touches du clavier ne fonctionnent pas.
          }
       }
     
     ...
    // verification
       for (i = 0; i < 6; i++)
       {
          if(PIN1[i] != PIN2[i])
    	 x++;
       }
     
       if(x != 0)
    	Serial.println("PIN 1 different de PIN2");
       else
    	Serial.println("PIN 1 egale a PIN2");
     
    }
     
     
    void loop()
    {
      code();
    }

    autre chose, la variable i varie de façon très folklorique 0,5,4,3,3,0,1...
    Merci à toi, pour ton aide

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Donc ça fonctionne ?
    Par contre je ne comprends pas non plus pourquoi une variable locale ne fonctionne pas !?

    Et le code que j'ai posté, il marche ou pas ?

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Pour le int i = 0; je pense que tu as un problème de portée de varibale.
    Tu as du la déclarer en global car tu t'en sers aussi dans code2(), n'est ce pas ?

    Si tu déclares "i" en local dans code() alors code2() ne peut pas la voir ou bien il faut aussi déclarer "i" dans code2(). Mais attention ce ne sera pas les mêmes variable "i".

    Pour ta deuxième erreur, il faut mettre les accolades au niveau du if
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (x == 6)
    {
          		Serial.println("PIN1 ok");
                    code2();              // pas de renvoie si code 2 existe, reprise de la   boucle code() et toutes les touches du clavier ne fonctionnent pas.
    }
    Sans accolade code2() se trouve dans la boucle for et va donc s'exécuter à chaque tour de boucle.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

Discussions similaires

  1. problème exécution du boucle for_ exit for
    Par Merryy dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/08/2015, 11h35
  2. Problème de boucle qui ne s'exécute pas
    Par bikine dans le forum Général Java
    Réponses: 1
    Dernier message: 01/04/2015, 08h28
  3. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  4. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13
  5. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo