Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino - recevoir données depuis module bluetooth

Communication

    12 mai 2018 à 18:22:43

    Bonjour :D,

    Je suis en Terminale S SI et rencontre un problème avec la communication bluetooth.

    Matériel :

    Arduino mega 2560

    RFID-RC 522

    HC-05 (module bluetooth)

    Application smartphone conçue via App Inventor 2

    La situation :
    Mon projet est de concevoir un distributeur automatique de nourriture pour chat. Je m'occupe de l'identification et de l'interface homme-machine. Il faut que j'indique dans mon application si le chat a mangé au moins une fois dans la journée.


    J'aimerais :

    Lorsque mon lecteur RFID détecte le chat (qui porte une puce reconnue et valide son accès privé à sa gamelle), il faut que je retrouve un message qui me permettrait de savoir si le chat s'est identifié (donc nourri). Dans le cas contraire, il faut un message d'avertissement.

    Le top serait qu'il y ait un compteur qui ne remettrait à 0 toutes les 24h.

    Je n'arrive pas à gérer la communication du module vers le smartphone...:(

    Merci de bien vouloir m'aider. Je reste connecté ;) (n'hésitez pas à me demander plus d'infos s'il le faut)

    Mon code pour le module RFID (il faut y ajouter tout ce qu'il faut pour le bluetooth) :

    #include <SPI.h>
    #include <MFRC522.h>
    
    #define SS_PIN 53
    #define RST_PIN 5
    // definition des pin du RC522
    MFRC522 mfrc522(SS_PIN, RST_PIN); 
    
    //on defini la bronche pour notre indicateur/témoin
    int lock = 13;
    //on pourrait très bien ajouter quelques chose comme :
    // int serrure = 3 (pour gérer une gache éléctrique)
    
    char st[20];
    
    void setup() 
    {
      int passagechat = 0;
      pinMode(lock, OUTPUT);
      // si nous avions notre gache electrique
      // pinMode (serrure, OUTPUT);
     
      //initialisation serie(pour le relevé d'information via le moniteur série) et initialisation des deux bibliotheque SPI et MFRC522
      Serial.begin(9600);
      SPI.begin();
      mfrc522.PCD_Init(); 
      // Message initial (le message afiché au démarrage dans le moniteur serie de notre programme arduino)
      Serial.println("Test acces via TAG RFID");
      Serial.println();
    }
    
    void loop() // le corps de notre programme
    {
      if ( ! mfrc522.PICC_IsNewCardPresent()) 
      {
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial()) 
      {
        return;
      }
      Serial.print("UID de tag :");
      String tag= "";
      byte caractere;
      for (byte i = 0; i < mfrc522.uid.size; i++) 
      {
         Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
         Serial.print(mfrc522.uid.uidByte[i], HEX);
         tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
         tag.concat(String(mfrc522.uid.uidByte[i], HEX));
      }
      Serial.println();
      Serial.print("Message : ");
      tag.toUpperCase();
      
     // ici on va vérifier l'autorisation
      if (tag.substring(1) == "4E 2C 5D 59") // le numero de tag est visible lorsqu on presente la carte ou le badge via le moniteur serie
      //il suffit d'insérer ci-dessus le tag que l'on souhaite authoriser ici on dit que si le tag = 4E 2C 5D 59 est lu alors on affiche dans le moniteur serie
      // Tag verifie - Acces Autorisé et nous eteignons notre led pendant 3sec
      {
        digitalWrite(lock, HIGH);
        Serial.println("TAG verifie - Acces Autorise !");
        Serial.println();
        delay(3000);
        digitalWrite(lock, LOW);
        int passagechat = 1;
        //dans le cas de la gache electrique
        //digitalWrite(serrure, LOW) 
        //*ou HIGH selon le mode de fonctionnement de la gache) ce qui nous laisserais 3 secondes pour ouvrir la porte
        }
     
      // ici on va vérifier un second badge (il est possible d'ajouter plusieurs "else if" il peut être interessant 
      //d'utiliser la fonction switch je vous invite à vous renseigner sur celle-ci.
     else if (tag.substring(1) == "D4 A9 42 DB") // le numero de tag est visible lorsqu on presente la carte ou le badge via le moniteur serie
      //il suffit d'insérer ci-dessus le tag que l'on souhaite authoriser ici on dit que si le tag = F0 26 2A A4 est lu alors on affiche dans le moniteur serie
      // Tag verifie - Acces Autorisé et nous eteignons notre led pendant 3sec
      {
        digitalWrite(lock, HIGH);
        Serial.println("TAG verifie - Acces Autorise !");
        Serial.println();
        delay(3000);
        digitalWrite(lock, LOW);
        //dans le cas de la gache electrique
        //digitalWrite(serrure, LOW) 
        //*ou HIGH selon le mode de fonctionnement de la gache) ce qui nous laisserais 3 secondes pour ouvrir la porte
        }
      
      else
      //sinon si le Tag n'est pas valide
      {
        //on affiche Acces refuse !!!
        Serial.println("TAG inconnu - Acces refuse !!!");
        Serial.println();
        // on repete 5fois
        for (int i= 1; i<13 ; i++)
        {
          //LED clignotte ici rien à ajouter pour la gache puisque son etat ne doit pas changer la porte reste fermee
          digitalWrite(lock, HIGH);
          delay(100);
          digitalWrite(lock, LOW);
          delay(100);
        }
      }
      delay(1000);
    }


    -
    Edité par LucaThomas1 12 mai 2018 à 19:35:10

    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2018 à 10:18:13

      salut,

      j’ai pas trop compris le problème. c’est le compteur pour savoir si le chat à manger ? (D’ailleurs, juste un booléen est suffisant) ou la partie bluetooth (c’est à dire l’initialiser et s’y connecter) ?

      • Partager sur Facebook
      • Partager sur Twitter
      Matériels : Arduino Due, UNO, Arduino Standalone (Valduino).
        15 mai 2018 à 18:48:50

        Pour mémoriser si le chat a manger, ou non, une simple variable booléen est suffisant.

        Quelque chose du genre :

        • 0 = Le chat n'a pas mangé
        • 1 = Le chat a mangé

        Ensuite, pour la remise à 0, tu peux utiliser un timer basé sur millis.

        Pour cela, dès que tu donnes à manger au chat, il suffit d'enregistrer la valeur de millis dans une variable et de s'en servir ensuite comme différence.

        Un petit exemple est plus parlant :

        bool chatMange = 0;
        unsigned long chatTimer = 0;
        
        void setup() {
        
            Serial.begin(9600);
        
            // Dans le setup, on donne a mangé au chat
            // => On enregistre le fait qu'il ai mangé
            // Et on met le timer.
            if ( chatMange == 0 ) {
                Serial.println("On donne la nourriture !");
                chatMange = 1;
                chatTimer = millis();
            } else {
                Serial.println("Bah non, interdit! T'as déjà mangé");
            }
        
        }
        
        
        void loop() {
        
            // Après 5 secondes (5000ms), on autorise à nouveau à manger
            if ( ( chatMange == 1 ) && ( ( millis() - timer ) >= 5000 ) ) {
                Serial.println("OK, tu peux manger à nouveau");
                chatMange = 0;
            }
        
        }
        

        Tu verras que ce code repasse la variable chatMange à 0 après 5 secondes ;)

        -
        Edité par lorrio 15 mai 2018 à 18:49:13

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2018 à 16:28:01

          Bonjour ! (excusez mon absence, je passais mes oraux de bac :-°)

          Merci de m'avoir répondu et de l'explication de la fonction millis que je comprends mieux maintenant.

          Je compte utiliser millis mais j'aimerais avant tout savoir comment recevoir du texte sur mon application smartphone.

          J'aurais d'abord un message de base "votre chat ne s'est pas encore nourri" et lorsqu'il passe sa puce rfid dans la journée, j'aurais dans ce cas "votre chat s'est nourri. Pour l'instant, je met de base que "le chat n'a pas mangé" dans mon appli, et change le message si il a mangé.

          #include <SPI.h>
          #include <MFRC522.h>
          #include<SoftwareSerial.h>
          SoftwareSerial HC05 (10,6);
          const char DOUT_LED = 12;
          String messageRecu;
          
          #define SS_PIN 53
          #define RST_PIN 5
          MFRC522 mfrc522(SS_PIN, RST_PIN); 
          
          int lock = 13;
          char st[20];
          bool chatMange = 0;
          
          
          void setup() 
          {
            pinMode(lock, OUTPUT);
          
            Serial.begin(9600);
            SPI.begin();
            mfrc522.PCD_Init(); 
          
            Serial.println("Test acces via TAG RFID");
            Serial.println();
            delay(50);
          
            Serial.begin(9600);
            HC05.begin(9600);
            pinMode(DOUT_LED, OUTPUT);
            digitalWrite(DOUT_LED, LOW);
          }
          
          void loop() 
          {
            if ( ! mfrc522.PICC_IsNewCardPresent()) 
            {
              return;
            }
            if ( ! mfrc522.PICC_ReadCardSerial()) 
            {
              return;
            }
            Serial.print("UID de tag :");
            String tag= "";
            byte caractere;
            for (byte i = 0; i < mfrc522.uid.size; i++) 
            {
               Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
               Serial.print(mfrc522.uid.uidByte[i], HEX);
               tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
               tag.concat(String(mfrc522.uid.uidByte[i], HEX));
            }
            Serial.println();
            Serial.print("Message : ");
            tag.toUpperCase();
            
            if (tag.substring(1) == "4E 2C 5D 59") 
          
            {
              digitalWrite(lock, HIGH);
              Serial.println("TAG verifie - Acces Autorise !");
              Serial.println();
              Serial.println("Votre chat a mangé");
              Serial.println();
              delay(5000);
              digitalWrite(lock, LOW);
              
              }
           
           else if (tag.substring(1) == "D4 A9 42 DB")
            
            {
              digitalWrite(lock, HIGH);
              Serial.println("TAG verifie - Acces Autorise !");
              Serial.println();
              delay(5000);
              digitalWrite(lock, LOW);
              }
            
            else
            {
              Serial.println("TAG inconnu - Acces refuse !!!");
              Serial.println();
              // on repete 5fois
              for (int i= 1; i<13 ; i++)
              {
                digitalWrite(lock, HIGH);
                delay(100);
                digitalWrite(lock, LOW);
                delay(100);
              }
            }
            delay(1000);
          }

          AUTRE PETIT PROBLÈME, je n'ai réussi qu'à inclure la partie loop de mon programme qui fait fonctionner le bluetooth (je l'inclue mal) , savez-vous comment faire ?

          Programme :

          #include<SoftwareSerial.h>
          SoftwareSerial HC05 (10,6);
          const char DOUT_LED = 12;
          String messageRecu;
          
          void setup() {
            Serial.begin(9600);
            HC05.begin(9600);
            pinMode(DOUT_LED, OUTPUT);
            digitalWrite(DOUT_LED, LOW);
          }
           void loop()
          {
              while(HC05.available())
              {
                delay(3);
                char c = HC05.read();
                messageRecu += c;
              } 
          }

          Merci de votre aide :)


          -
          Edité par LucaThomas1 18 mai 2018 à 16:30:35

          • Partager sur Facebook
          • Partager sur Twitter

          Arduino - recevoir données depuis module bluetooth

          × 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