Communication bluetooth Arduino/Android

Bonjour,

J'ai un projet, et je dois envoyer des données de plusieurs capteurs/moteurs simultanément sur mon téléphone via une application que je suis entrain de coder en Ionic.

Grosso modo, voila comment je m'y prends afin d'envoyer et recevoir plusieurs données différentes au même moment, même si cela fonctionne, j'ai l'impression quand même de m'y prendre mal, et qu'à l'avenir il y ai un bug ..

BTserial.print("(");
BTserial.print(angleX);

BTserial.print("#");

BTserial.print("angleY")
BTserial.print("-");

De l'arduino, j'envoi deux données, angleX et angleY. Ce qui donne pour cet exemple : (90#45-

Du coté android, je demande à lire la donnée entre le caractère ( et # ce qui donne 90, et entre # et - ce qui donne 45.

J'aimerais connaitre votre avis sur ma façon de procéder, merci :slight_smile:

oui vous avez créé un protocole de communication avec un marqueur de début et un marqueur de fin de message et ensuite vous analysez le contenu. C'est pratique courante.

Si vous pouvez avoir des nombres négatifs, j'éviterais le tiret comme marqueur de fin pour qu'il n'y ait pas de confusion possible. (souvent on met au début et à la fin des caractères "qui se ressemblent" et on sépare par une virgule du genre <90,45> ou [90,45] ou {90,45} ou (90,45) mais le principe reste le même.)

bien sûr c'est lisible par un humain, mais vous envoyez de nombreux octets pour cette représentation textuelle. Si la vitesse de transmission est importante, il faudra éventuellement envisager d'envoyer les nombres en binaire directement

D'accord très bien merci du conseil, en effet, je vais devoir envoyer de nombreuses informations venant des capteurs tous les 200 ms.

Mon soucis est que des fois ( ~ 1 affichage sur 10 ), je reçois une valeur comme "(" ou "29#", d'ou peut venir ce problème ?

Postez le code Arduino

Le code n'a rien de bien spécial, bon le programme fait des centaines de lignes, mais du coté Bluetooth, j'ai que ça.

#include <SoftwareSerial.h>

SoftwareSerial BTserial(5, 6);
   
if(millis() >=time_nowBT + periodBT) { // 200 ms 
    
    time_nowBT += periodBT;

    BTserial.print("(");
    

    BTserial.print(angleX);
    Serial.println(angleX);
    BTserial.print("#");

    }

combien de bauds pour SoftwareSerial et pour Serial ?

Notez qu'il faut toujours faire une soustraction dans le calcul des durées

if(millis() - time_nowBT >= periodBT) { // 200 ms 
  ...
}

pour éviter des souci quand on approche du rollover de millis()

Serial.begin(57600);
BTserial.begin(9600);

C'est noté :slight_smile:

OK c'est pas trop rapide sur le BT

éventuellement essayez de ne pas mélanger les interruptions

if(millis() - time_nowBT >=+ periodBT) { // 200 ms 
    
  time_nowBT += periodBT;

  BTserial.write('(');
  BTserial.print(angleX);
  BTserial.write('#');
  BTserial.flush(); // attend l'envoi

  Serial.println(angleX);
}