BLUETOOTH 4.0 Avec HC-08 CC2541

Bonjour,

J’ai acquis ça :

HC-08 CC2541


Ensuite j’ai utilisé des tutos pour HC-05, et j’ai fais ça:

puis chargé ça dans mon Arduino UNO R3:

#include <SoftwareSerial.h>
int vitesse =9600;
SoftwareSerial BTSerial(10, 11);
void setup()
{  
  pinMode(9,OUTPUT);
  pinMode(10,INPUT);
  pinMode(11,OUTPUT);

  Serial.begin(vitesse);
  
  BTSerial.begin(vitesse);

}
void loop()
{
  

  
  if(BTSerial.available())
  {
     Serial.println(vitesse);
    Serial.println(BTSerial.read());
  }


  if(Serial.available())
    BTSerial.write(Serial.read());
}

La led rouge du module clignote lentement environ 1Hz

Sur mon tel Android le module apparaît sour le nom : BT05 (un rapport avec les HC-05 plutôt que HC-08??)

Si j’essaye d’appairer le tel et le HC-08.
La LED bleue du montage scintille une seconde et ensuite Android me dit :“Association refusée par BT05”
même pas l’opportunité de saisir un code. :frowning:

Et le terminal ne remonte aucune info.

Je décide de vérifier la possibilité de jouer avec les Commandes AT.

je débranche le module, je tiens appuyé son bouton, puis réalimente le module,

résultat la led rouge ne s’allume plus.
avec le terminal je lance : “AT” avec le rajout automatique “\r\n”
en 9600 ou 38400,
pas de réponse :frowning:

Sans changer le montage, je charge dans mon Arduino ça :

#include <SoftwareSerial.h>
int vitesse =9600;
SoftwareSerial BTSerial(10, 11);
void setup()
{  
  pinMode(9,OUTPUT);
  pinMode(10,INPUT);
  pinMode(11,OUTPUT);
 
  digitalWrite(9,HIGH);

  Serial.begin(vitesse);  
  BTSerial.begin(vitesse);
  BTSerial.write("AT\r\n");
}

void loop()
{  

  
  if(BTSerial.available())
  {
     Serial.println(vitesse);
    Serial.println(BTSerial.read());
  }

  if(Serial.available())
    BTSerial.write(Serial.read());
}

cette fois la led du module ne clignote plus, mais dans mon terminal aucun retour. J’attendais un petit “OK” là aussi.

j’essaye avec la vitesse à 9600 ou 38400. pareil.

et en tapant la commande depuis le terminal.

Est ce que quelqu’un saurait débloquer ce truc ? :slight_smile:

petite précision :
l’appairage du tel et du module dans la dernière configuration: dure 30s et aboutie à ce message :
“impossible d’établir l’association avec BT05 en raison d’un code PIN ou d’une clé d’accès incorrects.” alors qu’il ne m’est pas donné la possibilité de rentrer de clé.

Me revoilà :slight_smile:

A force de trifouiller mon diagramme, j’arrive à un résultat, disons… différent.

Toujours impossible d’appairer avec le tél, il n’est même pas visible d’un autre vieux tél ( version Bluetooth obsolète??). Même message tout ça, tout ça.

Par-contre les commandes AT semblent passer.

Déjà j’ai finalement inverser le TX et le RX

En chargeant ce code, je gère mieux le passage en mode AT. Cela me permet d’arrêter de brancher/débrancher sans arrêt.

#include <SoftwareSerial.h>
int vitesse = 9600;//vitesse terminal
int vitesseBT = 9600;//vitesse BT
int boucle = 0; // pour compter le nombre de commandes renvoyées par BT
char ATplus[] = "pat";  //mot clé pour mise en mode AT
char ATmoins[] = "mat";//mot clé pour sortir du mode  en AT
char ATvit[] = "vit";//mot clé pour forcer la vitesse BT

SoftwareSerial BTSerial(10, 11);
void setup() {
  // put your setup code here, to run once:
  Serial.begin(vitesse);
  BTSerial.begin(vitesseBT);
  
  pinMode(9, OUTPUT);//EN
  pinMode(10, INPUT );//RX
  pinMode(11, OUTPUT);//TX
  pinMode(12, OUTPUT);//VCC

  mise_en_AT();
  BTSerial.write("AT");
  sortie_AT();
  Serial.println("c'est parti!");
  Serial.flush();
}

void loop() {
  // put your main code here, to run repeatedly:

  int combienBT = BTSerial.available();  // on scrute les message de BT
  if (combienBT > 0)
  {
    Serial.print("boucle : ");
    Serial.print(boucle);
    Serial.print(" taille :  ");
    Serial.println(combienBT);
    Serial.print(" vitesse : ");
    Serial.println(vitesse);
    for (int i = 0; i < combienBT; i++)
      Serial.print(BTSerial.read());
    boucle = boucle + 1;
    Serial.println();
  }

  int combienS = 0;   // on parle à BT
  combienS = Serial.available();

  if (combienS != 0)    //quelque chose d'envoyé
  {
    Serial.print(" combien Serie : ");
    Serial.println(combienS);
    if (combienS == 5) //surement un mot clé
    {
      char entree[3];
      for (int i = 0; i < 3; i++) {
        entree[i] = Serial.read(); delay(5);
      }

      Serial.print(" entree : ");
      Serial.println(entree);
      
      if   (*ATplus == *entree )
      {        
        mise_en_AT();
      }
      else if (*ATmoins == *entree)
      {        
        sortie_AT();
      }
      else if (*ATvit == *entree) //pour changer la vitesse
      {
        Serial.println("Vitesse : ");
        char VITESSE_BUFFER[8];
        for (int i = 0; i < 8; i++)
          VITESSE_BUFFER[i] = Serial.read();
        vitesse = atoi(VITESSE_BUFFER);
        Serial.println(vitesse);
      }
      else // c'était pas un mot clé
      {
        BTSerial.print(entree);
        //Serial.print(entree);
        char c;
        while (Serial.available())
        {
          c = Serial.read();
          BTSerial.print(c);          
        }       
      }
    }
    else // un truc à faire envoyer par BT  
    {
      char c;
      while (Serial.available())
      {
        c = Serial.read();
        BTSerial.write(c);       
      }
    }
    Serial.println();
  } 
  delay(500);
  
}

void mise_en_AT()
{
  Serial.println("mise_en_AT");
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(9, HIGH);
  delay(3000);
  digitalWrite(12, HIGH);
  delay(200);
}

void sortie_AT()
{
  Serial.println("sortie_AT");
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(9, LOW);
  delay(3000);
  digitalWrite(12, HIGH);
  delay(200);
}

En plus j’ai commenté :)… un peu.

Mais le module HC-08 me renvoie ses réponses en valeur décimale, qui correspondent aux caractères ASCII.

exemple :
AT\r\n → OK\r\n
AT\r\n → 79751310

Ce qui n’est pas très pratique.

Y a t’il un moyen simple de lire cela correctement en corrigeant ce code :

for (int i = 0; i < nombre_de_charactere; i++)
      Serial.print(BTSerial.read());

(en évitant de charger toute la table ASCII dans un tableau?)

Bonne soirée.

essayez avec

      Serial.print((char) BTSerial.read());

Merci beaucoup ça remplacera élégamment ce truc là :

char c;
c=BTSerial.read();
Serial.print(c);

:slight_smile:

Pour la petite histoire, quand je lui ai demandé sa vitesse, le module m’a répondu 19600, alors qu’on avait une conversation à 9600 jusque là.
J’ai changé la vitesse à 9600, et plus moyen de lui adresser la parole…

Je pense que je devais avoir la mauvaise “datasheet” entre les mains.
En testant 9600,19200,38400,57600,115200, rien n’y fait.

:frowning:

c'est pas un 3.3V votre HC-08 CC2541...? si vous lui causer en 5V sur le Rx il ne va sans doute pas trop aimer... idem pour son alimentation, c'est pas en 3.3?

Au dos de l'adaptateur en face de VCC/GND, il est inscrit "POWER 3.6V---6V"

et en face de RXD/TXD il y a "LEVEL: 3.3V"

en face de EN : zs-040...

Mais avec un pont diviseur de tension 39kohm/100kohm pour 3.6V je n'obtenais rien j'avais peut être mal fait mon calcul... :frowning:

Les ponts c'est plutôt entre 1k et 10k plutôt qu'on utilise

J'ai retrouvé ma vitesse : 1200bd... le datasheet que j'utilisais ne devait pas être pour ce module,

et ma moulinette de recherche de vitesse n'attendait pas assez longtemps entre chaque test/reset.

Maintenant il faut que je trouve quand même la configuration pour le connecter à mon tél.