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 :

Erreur de compilation sur un Key Module


Sujet :

Arduino

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Erreur de compilation sur un Key Module
    Bonjour,

    Je suis nouvelle sur le forum et m'excuse donc des erreurs que je pourrais faire en écrivant ce message.

    Je me suis lancée dans un projet comportant un afficheur LCD ainsi qu'un KeyModule avec 10 chiffres, 4 lettres et 2 symboles (* et #) sur une carte UNO R3.
    En essayant de complier le code que j'ai tapé, des erreurs se sont affichées :

    collect2.exe: error: ld returned 1 exit status

    exit status 1
    Erreur de compilation pour la carte Arduino Uno

    Voici mon code :

    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
    // Inclure les librairies
    #include <LiquidCrystal.h>
    #include "Keypad.h"
    #include "Key.h"
     
    // Initialiser les librairies avec les chiffres des fiches de l'interface
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //four columns
    //define the cymbols on the buttons of the keypads
    char hexaKeys[ROWS][COLS] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
     
    //initialize an instance of class NewKeypad
    Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
     
    // Début du programme
    void setup() {
      // Initialiser l'afficheur
      lcd.begin(16, 2);
      // Afficher un message
     
      Serial.begin(9600);
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
     // set the cursor to column 0, line 1
      // (note: line 1 is the second row, since counting begins with 0):
      lcd.setCursor(0, 1);
      // print the number of seconds since reset:
      lcd.print(millis() / 1000);
      char Code = "780D";
      scanf("Saisir le code", Code, "%s");
      if (Code != "780D"){
        lcd.print("Code incorrect");
      }
      else
      {
        Serial.println(Code);
        lcd.print("Code correct");
      }
    }
    Pourriez-vous m'aider à résoudre ces erreurs ?

    En vous remerciant,
    Bonne journée à tous !

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 685
    Points : 5 328
    Points
    5 328
    Par défaut
    Bonjour
    Postez l’intégralité des messages d’erreur

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ils sont déjà inscrits. Je n'ai rien d'autre d'afficher.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Citation Envoyé par LAS.HR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char Code = "780D";
      scanf("Saisir le code", Code, "%s");
      if (Code != "780D"){
        lcd.print("Code incorrect");
      }
      else
      {
        Serial.println(Code);
        lcd.print("Code correct");
      }
    Je crains que cette façon de faire sur le traitement des chaînes de caractères puis avec scanf qui n'est pas adaptée pour une entrée avec clavier matriciel, soit à revoir.

    As-tu commencé par un programme très simple qui doit trainer dans les exemples ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void loop() { // boucle infinie
      char key = keypad.getKey(); // balayage de la matrice
     
      if (key != NO_KEY) { // si appui sur une touche détectée
        Serial.println(key); // afficher le caractère
      }
    }

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 685
    Points : 5 328
    Points
    5 328
    Par défaut
    Modifier les préférences de l’IDE pour avoir plus de détails

  6. #6
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 010
    Points : 2 331
    Points
    2 331
    Par défaut
    Bonsoir LAS.HR

    Modifies ces 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <Keypad.h>
    //#include "Key.h"
    et ça compile.
    Jette un oeil ici, il y a quelques informations à propos de <> ou "".

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord, merci à tous pour vos réponses, après plusieurs recherches, j'ai enfin réussi à trouver le code souhaité.

    Pour ceux à qui ça pourrait servir, le voici :

    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
    #include <LiquidCrystal.h> //Inclure la librairie LCD
    #include <Keypad.h> //Inclure la librairie du keypad
     
    #define redLED 10 //Définir les LED
    #define greenLED 11
     
    char* password ="1234"; //Création du mdp
    int pozisyon = 0; //Position du keypad
     
     
    const byte rows = 4; //Nombre de lignes et de colonnes
    const byte cols = 4;
     
    char keyMap [rows] [cols] = { //Définir les boutons du keypad
     
      {'1', '2', '3', 'A'},
      {'4', '5', '6', 'B'},
      {'7', '8', '9', 'C'},
      {'*', '0', '#', 'D'}
    };
     
    byte rowPins [rows] = {1, 2, 3, 4};
    byte colPins [cols] = {5, 6, 7, 8};
     
    Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, rows, cols);
     
    LiquidCrystal lcd (A0, A1, A2, A3, A4, A5); // Broches du LCD. (RS, E, D4, D5, D6, D7)
     
    void setup(){
      lcd.begin(16, 2);
      pinMode(redLED, OUTPUT);  //Définir la LED en sortie
      pinMode(greenLED, OUTPUT);
    }
     
    void loop(){
     
      char whichKey = myKeypad.getKey();
      lcd.setCursor(0, 0);
      lcd.print("    Bonjour");
      lcd.setCursor(0, 1);
      lcd.print(" Entrez code");
     
      if(whichKey == '*' || whichKey == '#' || whichKey == 'A' ||       
      whichKey == 'B' || whichKey == 'C' || whichKey == 'D'){
     
        pozisyon=0;
        setLocked (true);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("  Code incorrect");
        delay(1000);
        lcd.clear();
      }
      if(whichKey == password [pozisyon]){
     
        pozisyon ++;
      }
      if(pozisyon == 4){
        setLocked (false);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Code bon");
        delay(3000);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("  Vous pouvez");
        lcd.setCursor(0, 1);
        lcd.print("entrer");
        delay(7000);
        lcd.clear();
      }
      delay(100);
    }
     
    void setLocked(int locked){
      if(locked){
        digitalWrite(redLED, HIGH);
        digitalWrite(greenLED, LOW);
        }
        else{
          digitalWrite(redLED, LOW);
          digitalWrite(greenLED, HIGH);
        }
      }

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 685
    Points : 5 328
    Points
    5 328
    Par défaut
    c'est un peu dommage de ré-afficher l'invite à chaque tour de loop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      lcd.setCursor(0, 0);
      lcd.print("    Bonjour");
      lcd.setCursor(0, 1);
      lcd.print(" Entrez code");
    ce serait bien aussi de mettre des else entre les if, ça éviterait des tests pour rien.




    Voici une autre version (sans le LCD mais facile à rajouter) qui fonctionne avec affichage dans le moniteur série et qui a l'avantage d'englober la gestion du digicode dans une fonction digicode() que vous mettez simplement en début de loop().

    Cette fonction est non bloquante et s'occupe de tout pour vous. C'est dans le corps de cette fonction que, outre l'affichage ou les beeps, vous pourriez déclencher un relais d'ouverture de porte par exemple.

    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
    #include <Keypad.h>
     
    const byte ROWS = 4; //4 rangées
    const byte COLS = 4; //4 colonnes
     
    char keys[ROWS][COLS] = {   //les symboles, déclarés par leur code ASCII dans le tableau à 2 dimension
      {'1', '2', '3', 'A'},
      {'4', '5', '6', 'B'},
      {'7', '8', '9', 'C'},
      {'*', '0', '#', 'D'}
    };
     
    byte rowPins[ROWS] = {7, 6, 5, 4}; // On connecte ROW0, ROW1, ROW2 and ROW3 à ces pins
    byte colPins[COLS] = {11, 10, 9, 8}; // On connecte  COL0, COL1, COL2 and COL3 à ces pins
     
    Keypad membraneKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);  //On initialise une instance de la classe Keypad
     
    const char motDePasse[] = "1234A";  // on peut aussi dire de mettre # devant "#1234A" pour bien faire un reset avant saisie
    const uint8_t longueurMotDePasse = sizeof(motDePasse) - 1; // -1 car le compilateur ajoute un caractère nul en fin de chaîne
     
    // On définit un type t_etatDigicode pour les états possibles du système
    enum t_etatDigicode : uint8_t {INACTIF, TOUCHE_RESET, TOUCHE_CODE, CODE_JUSTE, CODE_FAUX};
     
    void message()
    {
      Serial.println(F("\nEntrez votre code: "));
    }
     
    t_etatDigicode testCode()
    {
      static char codeLu[longueurMotDePasse] = {0};
      static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
      t_etatDigicode etatDigicode = INACTIF;
      char c = membraneKeypad.getKey();
     
      if (c != NO_KEY) {                              // si le keypad est appuyé
        etatDigicode = TOUCHE_CODE;
        if (c == '#') {                               // si c'est la remise à 0
          etatDigicode = TOUCHE_RESET;                // on le note
          indexMessage = 0;                           // on se remet au début pour la prochaine fois
        } else {                                      // sinon
          codeLu[indexMessage++] = c;                 // on enregistre l'entrée
          if (indexMessage >= longueurMotDePasse) {   // et si on a tapé le bon nombre de caractères
            if (strncmp(motDePasse, codeLu, longueurMotDePasse) == 0) {   // on regarde si c'est le bon mot de passe
              etatDigicode = CODE_JUSTE;              // le code est bon
            } else {
              etatDigicode = CODE_FAUX;               // le code est erroné
            }
            indexMessage = 0;                         // on se prépare pour la prochaine fois
          }
        }
      }
      return etatDigicode;                            // On retourne l'état du système
    }
     
     
    void digicode()
    {
      switch (testCode()) {
        case TOUCHE_RESET:  // l'utilisateur a appuyé reset
          message();        // on affiche à nouveau l'invite
          break;
     
        case TOUCHE_CODE:     // l'utilisateur a appuyé une autre touche mais le code est incomplet
          Serial.write('*');  // on affiche une étoile
          break;
     
        case CODE_JUSTE:    // l'utilisateur a rentré le bon code
          Serial.println(F("\nCode juste"));
          // ici faire autre chose (ouverture de porte, etc)
          message();        // on affiche à nouveau l'invite
          break;
     
        case CODE_FAUX:   // l'utilisateur a rentré un code erroné
          Serial.println(F("\nCode faux"));
          // ici faire autre chose (beep d'erreur etc)
          message();        // on affiche à nouveau l'invite
          break;
     
        default: break;   // le système était INACTIF
      }
    }
     
    // =========================================
     
    void setup()
    {
      Serial.begin(115200);
      message();
    }
     
    void loop()
    {
      digicode();
    }
    si ça peut servir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation sur un module du noyau
    Par vincenzo22 dans le forum Administration système
    Réponses: 4
    Dernier message: 20/06/2007, 16h54
  2. Erreur de compilation sur std::string avec Dev C++
    Par dada57 dans le forum Dev-C++
    Réponses: 4
    Dernier message: 20/03/2006, 19h06
  3. Erreur de compilation sur gaim-vv avec gstrreamer
    Par ZiMo dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 30/12/2005, 11h41
  4. Erreur à la compile sur VC++ 6
    Par norwy dans le forum Développement
    Réponses: 1
    Dernier message: 10/11/2005, 14h51
  5. Delphi 7 update 1 - Erreur de compil sur SQLExpr
    Par RamDevTeam dans le forum Bases de données
    Réponses: 14
    Dernier message: 02/11/2005, 18h44

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