Récupérer le RSSI d'un HC-05 sous arduino Méga

Bonjour,

Pour mon PPE de SI qui est de faire un cartable suiveur, je souhaite récupérer le signal RSSI de mon module bluetooth HC-05.

Cela ne pose pas de problème sous arduino uno, mon code fonctionne parfaitement en software serial mais le problème c'est que j'ai besoin de récupérer le signal RSSI de trois module à la fois, je dois donc par conséquent passer sous arduino mega pour avoir des ports séries hardware afin de récupérer les données en même temps ce qui n'est pas possible en software.

Mais ce même code fonctionnant en Software Serial sous arduino uno ne fonctionne malheureusement pas en hardware via les ports Serial1, Serial2 et Serial3 de l'arduino mega.

Il faut savoir que mon module HC-05, fait une recherche en boucle de façon automatique dès qu'il est en mode commande de la commande AT+INQ. Ce qui fait que le but de mon programme est d'isoler la valeur hexa du signal RSSI de la commande INQ et de la convertir en décimal. Je n'ai donc par ailleurs pas besoin de lui demander d'effectuer la commande de façon manuel.

Voici mon code :

void setup() 
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() 
{
  if(Serial1.available() > 0)                            //Si on réceptionne des données du module hc-05
    {
      char data = Serial1.read();                     //Stock ce qu'on lit sur le module hc-05
      String allData = "" ;                               //Création d'une chaine de caratère vide
      while(data != '\n')                                 //Tant qu'il n'y a pas de retour à la ligne lu sur le module 
        {
          allData = allData + data;                    //Ajouter tous les caractères reçu dans la chaine
          data = Serial1.read();                                                   
        }
      if(allData.indexOf("8C3A:E3:CED6DC") != -1)    //Si l'adresse MAC est trouvé
        {                                                           
          Serial.println("Adresse MAC trouvé :");                   
          Serial.println(allData);
          
          char detectRssiValue = allData.lastIndexOf(",");                 
          String rssiValue = allData.substring(detectRssiValue+1);        
          Serial.println("La valeur du RSSI en hexa est :");            
          Serial.println(rssiValue);         
          
          int firstChar = rssiValue.charAt(2);                                
          if(firstChar >= 'A')                          //Convertit la valeur en la passant de caractère à décimal
            {                                                                 //Conversion si plus grand ou égal à 'A'
              firstChar = firstChar - 'A' + 10;                               //'0' = 48 en decimal et 'A' = 65  d'après la table ASCII d'arduino             
            }
          else
            {
              firstChar = firstChar - '0';                                    //Conversion si inférieur à A donc inférieur à 10             
            }
          Serial.println("La valeur du premier caractère est :");  
          Serial.println(firstChar);
             
          int secondChar = rssiValue.charAt(3);                               //Stock la 4ème variable hexa du RSSI
          if(secondChar >= 'A')
            {                                                                 
              secondChar = secondChar - 'A' + 10;                             //'0' = 48 en decimal et 'A' = 65 
            }
          else
            {
              secondChar = secondChar - '0';              
            }
          Serial.println("La valeur du second caractère est :");  
          Serial.println(secondChar);
           
          int rssiFinalValue = (firstChar * 16) + secondChar;                 //Passage de l'hexa en décimal
          Serial.println("Valeur décimal des deux caractère :");
          Serial.println(rssiFinalValue);
          
          long dbm = rssiFinalValue - 255;                                    //Valeur final en dbm après soustraction de FF soit 255
          Serial.println("La valeur en dbm est :");
          Serial.println(dbm);
          Serial.println();
        }
                                   
    }
}

Peut être que l'arduino mega ne réceptionne pas les données de la même façon que le uno ? Ou bien qu'en passant sur un port série hardware le fonctionnement est différent ?

Dans l'attente d'une réponse pouvant régler mon problème.

      while(data != '\n')                                 //Tant qu'il n'y a pas de retour à la ligne lu sur le module 
        {
          allData = allData + data;                    //Ajouter tous les caractères reçu dans la chaine
          data = Serial1.read();                                                   
        }

aucune chance que ça ne fonctionne de manière stable, vous lisez des data qui ne sont pas forcément là...

Si vous voulez comprendre comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Salut, je voudrait vraiment savoir comment as tu fait. Es ce que tu récupère le RSSI d’un hc-05 grâce à un hc-05 ? Quelle câblage as tu fait ? Es ce que tu as modifié des commandes AT ? Et enfin as tu trouvé la solution avec une arduino mega ?
Merci d’avance et en espérant avoir une réponse :wink:

Romainlo: Salut, je voudrait vraiment savoir comment as tu fait. Es ce que tu récupère le RSSI d'un hc-05 grâce à un hc-05 ? Quelle câblage as tu fait ? Es ce que tu as modifié des commandes AT ? Et enfin as tu trouvé la solution avec une arduino mega ? Merci d'avance et en espérant avoir une réponse ;)

L’auteur de ce post n’a posté qu’une fois, il y a un an presque et n’est jamais revenu... peu de chance qu vous ayez une réponse....

Un AT+INQ vous retournera l’info et il y a un timeout donc faut renvoyer la commande

Ensuite lisez le tuto sur le port série pour comprendre comment gérer cela correctement

Merci, Mais le problème c'est que quand je fait AT+INQ,le moniteur serie affiche ERROR. Donc faut il appairer 2 hc-05 et ensuite faire la commande? Il y a-t-il un rapport avec master et slave?

Quelle version ? êtes vous en mode configuration ? Y-a-t-il un bouton sur votre module ?
Bref pas assez d’infos

Il y a des discussions en ligne sur le sujet, vous avez regsrd2 et testé ? Il semble que certains modules n’ont pas le bon firmware

Oui il y a un bouton mais justement comment être appairé a un autre module et en même temps être en mode configuration ?

Bonjour

Des infos içi sur le passage en mode commande https://eskimon.fr/tuto-arduino-907-utiliser-un-module-bluetooth-hc-05-avec-arduino#passer-en-mode-commande

Et içi un échange sur l'obtention d'un RSSI avec HC05 (rôle, séquence de commandes..) https://stackoverflow.com/questions/23221336/hc-05-bluetooth-rssi-not-working-with-arduino