Partage
  • Partager sur Facebook
  • Partager sur Twitter

Assignation d'un code.

il faudrais que j'authorise l'accès grace a un code 1234

    29 mars 2021 à 9:47:19

    bonjour Actuellement en BTS j'ai un projet a faire, un contrôle d'accès en Bluetooth. Je doit autoriser l'accès ou non en fonction d'un code mais je n'arrive pas a pré enregistrer le code j'ai essayer char code = xxxx mais a chaque fois ca me fait "warning: multi-character character constant [-Wmultichar]" sauf que je ne sais pas comment intégrer le code a mon programme.. 

    voici le programme 

    #include<Arduino.h>// Librairie https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/Arduino.h
    #include<stdio.h>
    #include"BluetoothSerial.h"// Librairie https://github.com/espressif/arduino-esp32/tree/master/libraries/BluetoothSerial

    #defineLED32 // Led PIN ==> 32

    BluetoothSerial SerialBT;

     // le message recu par bluetooth;
    int etatLED1 = 0;
    char  instruction;
    unsigned  char code=30,31,32;// du a l'ascii j'ai du faire qlq chose de ce style
    void callback(esp_spp_cb_event_t eventesp_spp_cb_param_t *param){ // parametre que nous utilisont 
      if(event == ESP_SPP_SRV_OPEN_EVT){
        Serial.println("Utilisateur Connecté");// envois au terminal un message .
        SerialBT.println("Insérer Code :");// envois a l'utilisateur insérer code .
      } 
      if(event == ESP_SPP_CLOSE_EVT ){
        Serial.println("Client disconnected");// envois au terminal que l'utilisateur c'est déconnecter 
      }
    }

    void setup()
    {
      Serial.begin(9600);
      SerialBT.begin("ESP32"); // le Bluetooth s'appelera "ESP32"
      pinMode(LEDOUTPUT);
      SerialBT.register_callback(callback);
       if (SerialBT.available()){
       Serial.write(SerialBT.read());
      }
    }



    void loop()
    {
        char message;

      if (SerialBT.available()){} // réception d'un message

        message = SerialBT.read(); // lecture du message reçu
      if (message != instruction) { // alors il faut modifier l'état des LEDs
        instruction = message;

        if (instruction == '' )
        {
          digitalWrite(LEDHIGH);
          etatLED1 = 1;
          SerialBT.println("LED 1 allumee, LED 2 eteinte");
        }
        else if (instruction == '56' ) 
        {
          digitalWrite(LEDLOW);
          etatLED1 = 0;

          SerialBT.println("LED 1 eteinte, LED 2 allumee");
        }

          delay(200);
      } 

      }



    -
    Edité par AbcAbc6 29 mars 2021 à 22:21:15

    • Partager sur Facebook
    • Partager sur Twitter
      29 mars 2021 à 11:02:33

      Pensez à utiliser le bouton [</>] quand vous poster du code.

      Votre code d'accès contient plusieurs "char", alors pourquoi essayer de tout mettre dans un seul "char" ?

      Si c'est vraiment une chaîne de caractère, et pas une liste d'octets, la classe std::string devrait faire le job.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        29 mars 2021 à 11:43:43

        merci ! de ton aide @bacelar mais je ne comprend pas comment utiliser std::string est-ce que je doit l'utiliser comme une variable  tel que "char, int ..." ou comment ? 

        BluetoothSerial SerialBT;
        int etatLED1 = 0;
        char  instruction;
        std::string code = 1234;

        j'ai beau faire rechercher je ne trouve pas de tuto adéquat pour l'utilisation du standard string.

        -
        Edité par AlexisM13 29 mars 2021 à 12:03:06

        • Partager sur Facebook
        • Partager sur Twitter
          29 mars 2021 à 11:50:27

          Bonjour, Merci de modifier votre titre pour un titre explicite de votre problématique.

          Merci de colorer votre code à l'aide du bouton Code

          Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

          Merci de modifier votre message d'origine en fonction.

          Manque de Politesse

          Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

          Mauvais titre

          Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

          Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

          De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

          Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

          Pour modifier votre titre, éditez le premier message de votre sujet.

          (titre originel : Besoin d'aide dans un programme C++)

          Liens conseillés

          -
          Edité par AbcAbc6 29 mars 2021 à 11:51:25

          • Partager sur Facebook
          • Partager sur Twitter
            29 mars 2021 à 12:15:51

            std::string code = "1234";
            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              29 mars 2021 à 14:20:58

              Merci encore! j'ai essayer de le mettre dans mon programme, met mon professeur  souhaite absolument que j'utilise une chaine de caractère avec char et faire un tableau. Donc au final retour au point de départ ... :euh:
              • Partager sur Facebook
              • Partager sur Twitter
                29 mars 2021 à 14:55:05

                "char", c'est un caractère, pas une chaîne de caractère, ni un tableau de caractère.

                Votre prof., il veut vous apprendre le C ou le C++ ? (ou il est complètement aux fraises)

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  29 mars 2021 à 14:58:26

                  Normalement le C++  mais avec lui aucune idée, il ma dit d'utiliser ceci de m'inspirer de ceci 

                  (honnêtement avec lui je suis perdu en prog)

                  char code[8]={1,2,3,4,5,6,7,8,}


                  et par la suite je devrais la comparer avec le message d'entrer comme cela 

                  void loop()
                  {
                    
                      char message;
                    
                  
                    if (SerialBT.available()){} // réception d'un message
                  
                      message = SerialBT.read(); // lecture du message reçu
                      
                    if (message != instruction) { // alors il faut modifier l'état des LEDs
                      instruction = message;
                  
                      if (instruction == code )
                      {
                        digitalWrite(LED, HIGH);
                        
                        etatLED1 = 1;
                      
                        SerialBT.println("LED 1 allumee, LED 2 eteinte");
                      }
                      else if (instruction == code ) 
                      {
                        digitalWrite(LED, LOW);
                     
                        etatLED1 = 0;
                  
                        SerialBT.println("LED 1 eteinte, LED 2 allumee");
                      }
                  
                        delay(200);
                    } 
                  
                    }
                  

                  -
                  Edité par AlexisM13 29 mars 2021 à 15:07:42

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mars 2021 à 19:27:34

                    AlexisM13 a écrit:

                    bonjour Actuellement en BTS j'ai un projet a faire, un contrôle d'accès en Bluetooth. Je doit autoriser l'accès ou non en fonction d'un code mais je n'arrive pas a pré enregistrer le code j'ai essayer char code = xxxx mais a chaque fois ca me fait "warning: multi-character character constant [-Wmultichar]" sauf que je ne sais pas comment intégrer le code a mon programme.. 

                    voici le programme 

                    #include<Arduino.h>// Librairie https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/Arduino.h
                    #include<stdio.h>
                    #include"BluetoothSerial.h"// Librairie https://github.com/espressif/arduino-esp32/tree/master/libraries/BluetoothSerial

                    #defineLED32 // Led PIN ==> 32

                    BluetoothSerial SerialBT;

                     // le message recu par bluetooth;
                    int etatLED1 = 0;
                    char  instruction;
                    unsigned  char code=30,31,32;// du a l'ascii j'ai du faire qlq chose de ce style
                    void callback(esp_spp_cb_event_t eventesp_spp_cb_param_t *param){ // parametre que nous utilisont 
                      if(event == ESP_SPP_SRV_OPEN_EVT){
                        Serial.println("Utilisateur Connecté");// envois au terminal un message .
                        SerialBT.println("Insérer Code :");// envois a l'utilisateur insérer code .
                      } 
                      if(event == ESP_SPP_CLOSE_EVT ){
                        Serial.println("Client disconnected");// envois au terminal que l'utilisateur c'est déconnecter 
                      }
                    }

                    void setup()
                    {
                      Serial.begin(9600);
                      SerialBT.begin("ESP32"); // le Bluetooth s'appelera "ESP32"
                      pinMode(LEDOUTPUT);
                      SerialBT.register_callback(callback);
                       if (SerialBT.available()){
                       Serial.write(SerialBT.read());
                      }
                    }



                    void loop()
                    {
                        char message;

                      if (SerialBT.available()){} // réception d'un message

                        message = SerialBT.read(); // lecture du message reçu
                      if (message != instruction) { // alors il faut modifier l'état des LEDs
                        instruction = message;

                        if (instruction == '' )
                        {
                          digitalWrite(LEDHIGH);
                          etatLED1 = 1;
                          SerialBT.println("LED 1 allumee, LED 2 eteinte");
                        }
                        else if (instruction == '56' ) 
                        {
                          digitalWrite(LEDLOW);
                          etatLED1 = 0;

                          SerialBT.println("LED 1 eteinte, LED 2 allumee");
                        }

                          delay(200);
                      } 

                      }



                    -
                    Edité par AlexisM13 il y a environ 5 heures

                    As-tu osé colorer ton code entier à la main ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mars 2021 à 20:38:16

                      Bonjour,

                      Le code que tu présentes, c'est de l'Arduino. C'est bien du C++, mais à cause des capacités très réduite de l'Arduino très très peu des capacités du C++ sont accessibles. On donc dire que le langage qui t'es enseigné n'est ni le C, ni le C++, c'est de l'Arduino.

                      Le type std:string est un type très simple du C++ pour gérer le chaînes de caractères, mais ici tu dois en effet te ramener aux capacité du C. Comme si le C et le C++ n'étaient pas assez compliqués, il te faut apprendre un peu des 2 langages!
                      En C, on doit mettre les chaînes de caractères dans des tableaux de char. Le moyen c'est : on crée un tableau suffisamment grand pour contenir tous les caractères et un de plus que l'on appelle le terminateur de chaîne.

                      La fonction SerialBT.read() te retourne un seul caractère. Si tu veux toutes la chaîne, il te faut appeler plusieurs fois la fonction.

                      char  message[17];
                      
                      int  i;
                      for ( i = 0 ; i < 16 ; ++i ) { // le maximum 16 est caractères
                         int  char_lu = SerialBT.read();
                         if ( char_lu == -1 ) // plus rien à lire
                            break;
                         message[i] = char_lu; // on copie chaque caractères
                      }
                      message[i] = '\0'; // et on met un terminateur à la fin

                      Mais si on prend l'exemple que t'a donné le prof. Un message ne semble faire qu'un seul caractère. Le problème serait donc plutôt dans la suite de ton code. Et attention, tu appelles ta variable message au début, et puis tu utilise instruction plus loin. Il te faut choisir!

                       if (instruction == '' )     // n'a pas de sens un char contient exactement un caractère, donc ne peut pas être vide
                      
                       if (instruction == '56' )   // n'a pas de sens non plus, il y a un caractère, donc il n'y en a pas 2
                      
                       // si tu veux vérifier si ce caractère reçu à bien le code ASCII 56, il faut faire
                       if (message == 56 )
                       // ou bien
                       if (message == '8' )    // le caractère '8' est celui qui a le code ASCII 56
                      
                      • Partager sur Facebook
                      • Partager sur Twitter

                      En recherche d'emploi.

                        29 mars 2021 à 21:06:59

                        Bon, c'est quoi ce délire ?

                        Votre prof est soit un psychopathe, soit il est complètement à l'Ouest, ou vous ne nous donnez pas vraiment littéralement ce qu'il propose.

                        Bon, clairement, vous êtes un peu beaucoup à la rue niveau connaissance du langage. Je ne sais pas si cela vient de votre prof, de votre manque d'attention ou qu'on vous lâche dans un projet avant que vous ayez les bases, mais clairement, faudrait avoir des bases, parce que confondre entier et chaîne de caractère au niveau typage, ça le fera pas.

                        Votre prof vous refuse l'utilisation des chaines de caractère standard du C++ (std::string, accessible depuis 1998 et la première version du standard C++) mais il utilise tranquillou-pépouze les initialisateurs "std::initializer_list" introduit qu'en 2011, sur un tableau C et non C++, et en plus "nimportcomment", plus correctement :

                        char code[]={'1','2','3','4','5','6','7','8'};

                        - pas de virgule à la con après le 8, configurez votre compilateur pour qu'il signale ce genre de connerie

                        - pas de fixation de la taille de cette cochonnerie de tableau à la C à 8, pour pouvoir facilement changer de valeurs (ou en core mieux : pas en dur dans le corps du code).

                        - utilisation de caractères ('x') et non des nombres à la "mord moi le nœud", configurez votre compilateur pour qu'il signale ce genre de connerie (bis)

                        Et un "char", c'est pas un "void" du pauvre !!!

                        S'il veut correctement typer les choses, et que c'est des octets et non des caractères qui forme ce "code", il existe "std::byte" depuis C++17 :

                        std::byte code[]={std::byte{0x1},std::byte{0x2},std::byte{0x3},std::byte{0x4},std::byte{0x5},std::byte{0x6},std::byte{0x7},std::byte{0x8}};
                        

                        Au moins, c'est explicite, bordel !!!

                        Et ça n'utilise pas les failles de typage du C qu'un compilateur C++ configuré avec les pieds laisse passer.

                        else if (instruction == '56' )

                        Rien qui vous choque ?

                        C'est quoi le type de "instruction" ?

                        C'est un char.

                        '1', c'est un char ; '\0', c'est un char ; '\n', c'est un char ; 'n', c'est un char ; mais '56' c'est sensé être où dans la table ASCII ???

                        On peut comparer les "char" entre eux, mais comme '56' n'est pas un char.

                        Et le code n'est pas un char mais soit un tableau de "char", soit un tableau d'octets, donc un simple "==", ça le fera pas.

                        <QUOTE>

                        if (SerialBT.available()){} // réception d'un message
                         
                            message = SerialBT.read(); // lecture du message reçu

                        </QUOTE>

                        Ca serait quand même mieux de faire la lecture dans le if, non ?

                          if (SerialBT.available()){
                         
                            message = SerialBT.read();
                        
                        ...

                        Le reste doit aussi être dans le if car il n'y a rien à faire s'il n'y rien à lire.

                        Ligne 14, c'est la même connerie qu'avec '56'.

                        Il faudra que vous bufferisiez les entrées pour pouvoir comparer votre code qui est sur plusieurs octets (à moins d'utiliser une machine à état à 8 étages, juste pour faire compliquer).

                        Ligne 18 et 26, ça sent la variable globale bien dégueulasse.

                        Ligne 22, même topo qu'en ligne 14, et en plus, c'est totalement idiot en terme algorithmique :

                        if(toto){
                        ...
                        }else if(toto){
                        ...
                        }





                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          29 mars 2021 à 21:31:44

                          > Le code que tu présentes, c'est de l'Arduino. C'est bien du C++, mais à cause des capacités très réduite de l'Arduino très très peu des capacités du C++ sont accessibles. On donc dire que le langage qui t'es enseigné n'est ni le C, ni le C++, c'est de l'Arduino.

                          C'est un écosystème différent, mais ça n'en est pas moins du C++. Rien n'empêche d'exploiter la puissance des templates, du typage statique bien dur, et de la richesse du langage en général. Les seules particularités, c'est "setup", "loop" et les contraintes de dev embarqué. Je suis d'accord à propos du fait qu'on ne fasse pas de C++ avec Arduino comme on en ferait pour un PC general purpose, mais ça n'enlève rien au langage utilisé.

                          Autre chose: je conseillerais "char const*" plutôt que "char x[N]".

                          -
                          Edité par Daimyo_ 29 mars 2021 à 21:56:09

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 mars 2021 à 12:29:13

                            A ma connaissance, Arduino est bien du C++ mais il n'a pas la STL. Les template sont accessibles mais le type std::string n'est pas disponible, il y a la place le type String. On est dans des contraintes très embarquées. Dans mon boulot, j'ai accès à une bibliothèque spéciale pour l'embarqué, elle a std::string mais on n'a pas le droit de l'utiliser (elle fait une allocation dynamique et une allocation qui échoue ça devient un train qui ne s'arrête pas!)

                            Je comprend un peu que dans ce cas on se ramène à des techniques du C. J'ai plus de difficulté à approuver que l'on enseigne ce type de développement sans prévenir les étudiants qu'il ne sont pas en train d'apprendre le C++.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            En recherche d'emploi.

                              16 avril 2021 à 11:05:58

                              Rebonjour !

                              Merci pour vos aides !

                              J'ai un peu naviguer sur le web avec vos conseil et j'ai "recommencer" a 0 si on veux pour faire ceci 

                              #include "BluetoothSerial.h"
                              
                              #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
                              #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
                              #endif
                              
                              BluetoothSerial SerialBT;
                              char msg[9]; 
                              char code_user[9] = "A1b2c3d4";
                              char code_technicien[9] = "654sfd45";
                              void message()
                              {
                                     for (int i = 0; i < sizeof(msg); i++)
                                    {
                                      msg[i]=SerialBT.read();
                                    }  
                              }
                              
                              void setup() {
                                pinMode (13, OUTPUT);
                                Serial.begin(9600);
                                SerialBT.begin("ESP32test"); //Nom de l'appareil bluetooth
                                Serial.println("L'appareil est lancer ");
                              }
                              
                              void loop() {
                              
                                if (SerialBT.available()){} // réception d'un message
                              
                                if (SerialBT.available()) 
                                  {
                                    message();
                                    
                                  }
                                delay(20);  
                              
                               if (msg[0]==code_user[0])
                                  {
                                    if (msg[1]==code_user[1])
                                    {
                                      if (msg[2]==code_user[2])
                                        {
                                          if (msg[3]==code_user[3])
                                            {
                                              if (msg[4]==code_user[4])
                                                {
                                                  if (msg[5]==code_user[5])
                                                    {
                                                    if (msg[6]==code_user[6])
                                                      {
                                                        if (msg[7]==code_user[7])
                                                          {
                                                            Serial.println("Correcte");
                                                          } 
                                                      } 
                                                    }
                                                } 
                                            } 
                                        }
                                    } 
                                  }
                              
                               if (msg[0]==code_technicien[0])
                                  {
                                    if (msg[1]==code_technicien[1])
                                    {
                                      if (msg[2]==code_technicien[2])
                                        {
                                          if (msg[3]==code_technicien[3])
                                            {
                                              if (msg[4]==code_technicien[4])
                                                {
                                                  if (msg[5]==code_technicien[5])
                                                    {
                                                    if (msg[6]==code_technicien[6])
                                                      {
                                                        if (msg[7]==code_technicien[7])
                                                          {
                                                            Serial.println("Admin");
                                                          } 
                                                      } 
                                                    }
                                                } 
                                            } 
                                        }
                                    } 
                                  }
                              }
                              
                              
                              

                              La programmation est bonne j'arrive a faire en sorte qu'il se passe quelque chose quand le bon code est envoyer mais maintenant je suis bloquer du au faite que le téléphone dès lorsqu'il se connecte a l'esp32 il envois des informations, alors si je met que si l'information/ le mot de passe est différents que le mot de passe voulus allumer la led rouge.. bah elle s'allume tout le temps..

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 avril 2021 à 13:42:09

                                Salut, je ne m'y connais pas en Arduino, mais faire ceci est-il possible ?

                                if (msg == code_user) {
                                    Serial.println("Correct");
                                }
                                if (msg == code_technicien) {
                                    Serial.println("Admin");
                                }

                                Sinon, opte pour les boucles for, c'est plus simple (imagine un code à 20 caractères voire plus, le nombre de if que tu vas devoir faire ça sera horrible) :

                                {
                                    bool msgEqualToCodeUser{ true };
                                    for (std::size_t i { 0u }; i < 8u; i++) {
                                        if (msg[i] != code_user[i]) {
                                            msgEqualToCodeUser = false;
                                            break;
                                        }
                                    }
                                    if (msgEqualToCodeUser) {
                                        Serial.println("Correct");
                                    }
                                }
                                // et pareil pour tester si l'utilisateur est admin    

                                -
                                Edité par Chi_Iroh 16 avril 2021 à 13:42:32

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 avril 2021 à 14:26:59

                                  plutôt que cette enfilade de if, utiliser la fonction strcmp() => if(strcmp(msg,code_user){...} else if(strcmp(msg,code_technicien){...}

                                  dans un char, on peut y stocké un entier non signé (même si on préfèrera le type byte pour des données), comme par exemple le code ASCII d'un caractère spécial (ou pas) plutôt que le caractère lui-même.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Assignation d'un code.

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown