HC05 connecté à un HC05

Bonjour à tous,

J'essaye tant bien que mal de réaliser une connection bluetooth entre 2 Arduino, en utilisant des HC05.

Pour le moment je pense avoir réussi à les connecter ensemble, en spécifiant le master et le slave et en précisant l'adresse du slave. Ca a l'air de fonctionner, ils clignotent différement en tout cas, l'un et puis l'autre.

Maintenant j'aimerai à partir de l'un, utiliser un bouton qui allumerai la led branchée à l'autre.... mais ça ne fonctionne pas.

Une idée de ce que je pourrai faire déjà pour vérifier qu'ils sont bien connectés l'un à l'autre?

n°1: Bouton

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1); // RX, TX


int button_pin = 8;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(button_pin, INPUT_PULLUP);
}

void loop() { // run over and over
  if(digitalRead(button_pin) == LOW){
      mySerial.write("toggle");
      delay(500);
    }
}

n°2: Led

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1); // RX, TX
int led_pin = 3;

bool led_state = false;
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);

  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, led_state);
}

void loop() { // run over and over
 if (mySerial.available() > 0) {
   Serial.print(mySerial.read());
   Serial.print("yop");
    String data = mySerial.readStringUntil('\n');
    Serial.println(data);
    
    if(data.equals("toggle")){
      led_state = true;
      digitalWrite(led_pin, led_state);
    }
  }
}

La bibliothèque SoftwareSerial sert à remplacer la liaison série d'une carte Arduino lorsque tu veux utiliser cette dernière pour la console de l'IDE (par exemple). Elle te permet de créer un autre port série, en fait de l'émuler par soft, en conservant le port série hardware pour autre chose (l'IDE par exemple).

Le port série HW utilise les pins 0 et 1 : il ne sert donc à rien de les utiliser pour SoftwareSerial puisqu'il sont déjà affectés au port série de base de ta carte.
Je ne sais pas si je suis clair...

En gros, tu utilises SoftwareSerial sur d'autres pins que les 0 et 1. Par exemple 2 et 3.
SoftwareSerial mySerial(2, 3); // RX, TX

Un module BT HC05 ne supporte pas le 5V sur son port d'entrée (RX) : il faut lui mettre un pont diviseur comme ceci : j'espère que tu le fais sinon bobo le HC05...


Ici : résistance 1k entre pin3 et Rx, et 2k Ohm entre Rx et GND

Pour le message envoyé, pas besoin de le faire si long : un simple 'T' suffit.

Si sur le slave tu utilises readStringUntil('\n'); ça veut dire que tu dois envoyer un \n à la fin de ton message, donc sur le master :
mySerial.println('T');

Enfin, il faut que tu relâches ton bouton dans les 500ms de l'appui, sinon tu enverras le message plusieurs fois : pour éviter ça, il faut conserver l'état précédent de ton bouton et tester s'il était HIGH. Mais tu peux faire ça plus tard.

Cette ligne va lire ce qui arrive dans ton module slave, pour afficher 'yop' sur la console. Donc, ton message sera détérioré et ne sera pas reconnu par ton test. Tu dois donc ôter cette ligne.

Enfin, tu allumes la led mais tu ne l'éteins plus ensuite. Mais c'est peut-être ton but...

1 Like

Bonjour Lesept, merci pour toutes ces précisions. Je vais tester ça de suite. Par contre je n'ai pas fait de pont diviseur mais j'allimente les Hc05 en 3.3V est ce une bonne alternative? ici c'est juste un montage test.

Oui, je pense que ça ira bien aussi

image

Le code fonctionnel.

#include <SoftwareSerial.h>

/**************************************************
*
*                 -- MASTER BLE --
*
**************************************************/

SoftwareSerial mySerial(10, 11); // RX, TX


int button_pin = 8;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(button_pin, INPUT_PULLUP);
}

void loop() { 
 if (digitalRead(button_pin) == LOW) {
   mySerial.write(1); // Sends '1' to the master to turn on LED
    delay(500);
 }

}
/***************************************
 * 
 *                 == SLAVE CODE ==
 * 
 ***************************************/
 
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
int led_pin = 3;

bool led_state = false;
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);

  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, led_state);
}

void loop() { // run over and over
 if (mySerial.available() > 0) {
   //Serial.print(mySerial.read());
   // String data = mySerial.readStringUntil('\n');
   int data = mySerial.read();
    Serial.println(data);
    
    if(data == 1){
      Serial.print("hola");
      led_state = !led_state;
      digitalWrite(led_pin, led_state);
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.