arduino et android

bonjour

je suis entrain d'essayer de déporter mon affichage et entrees digital/ana ( bp et potentiometre ) sur une appli Android, via Bluetooth afin de simplifier mon programme.

ne maîtrisant pas suffisant le langage Android j'utilise App inventor .

pour l'affichage et les BP pas de problème.

j'ai un soucis car j'ai deux variables analogiques a envoyer cycliquement de l'Android vers l'arduino , mais elles peuvent etre modifié indépendamment et dans n'importe quel sens , il y a t'il un moyen par le bluetooth de savoir a quel "label" correspond la valeur reçu.

il y a un label " temps" en millisecondes ,
et une label "nombre de photos"

j’espère que j'ai été assez clair sur ma demande

je vous remercie d'avance

Bonjour Aurélien,

Je ne connais pas assez ton application pour répondre précisément mais tu pourrais

  • Soit envoyer le nom du paramètre avec sa valeur vers l'arduino. Ainsi, tu sais quelle est la valeur transmise
  • Soit envoyer systématiquement les deux valeurs, qu'elles soient modifiées ou pas.

Sauf erreur de ma part, le bluetooth n'est qu'un moyen comme un autre de faire de la communication série.
Il te revient donc de définir ton protocole de communication entre l'android et l'arduino.

Mais il se trouvera certainement ici quelqu'un de plus calé que moi dans ce domaine pour confirmer ou infirmer ce qui précède.

Coyotte

je vais essayer de mettre des captures d’écran

voila celui la fonctionne avec une seul valeur : ( capture)

par contre dans l’appli (capture2) il y a deux valeurs a envoyer et pas de sens pour les rentrer.

si je comprend ce qui a été dit , il faudrait que j’envoie un texte + ma valeur ???

je débute dans l’utilisation du bluetooth , et j’ai un de mal a comprendre comment sont envoyés les données

aurelien44300:
je vais essayer de mettre des captures d'écran

voila celui la fonctionne avec une seul valeur : ( capture)

par contre dans l'appli (capture2) il y a deux valeurs a envoyer et pas de sens pour les rentrer.

si je comprend ce qui a été dit , il faudrait que j'envoie un texte + ma valeur ???

je débute dans l'utilisation du bluetooth , et j'ai un de mal a comprendre comment sont envoyés les données

bonjour
tu a plusieurs solutions :
en voilà 2

  • tu envoie systematiquement tes 8 bytes (2X4) correspondant à tes 2 valeurs , et tu gere celle qui à changé
  • tu fais précéder chaque valeur d'un "identifiant" , exemple *T pour ta valeur temps , *P pour le nombre de photos

+1

merci

je serai plus partant pour le système d'identifiant que tu as proposé, donc si je comprends bien par exemple pour le temps il faut envoyer t500 ( pour 500millisecondes) , mais du coup comment j'extraie le "t" du 500 sur l'arduino ?

avec strtok par exemple

aurelien44300:
merci

je serai plus partant pour le système d'identifiant que tu as proposé, donc si je comprends bien par exemple pour le temps il faut envoyer t500 ( pour 500millisecondes) , mais du coup comment j'extraie le "t" du 500 sur l'arduino ?

je ne conseille pas d'utiliser un identifiant sur un seul byte , c'est pour ça que j'ai proposé *T ou *P
ta trame d'envoi sera donc *Txxxx ou *Pxxxx
tu a donc 6 bytes consecutifs à acquerir pour une trame valide
tu test à partir du premier * reçu (Hex 29) , tu verifie le byte suivant (T ou P) pour discriminer , et tu reconstitue un long avec les 4 bytes suivants.

au passage et AMHA , ta plage d'evolution peut certainement etre contrainte sur un unsigned INT ( soit 4 bytes à transmettre : 2 pour l'identifiant , 2 pour la valeur )

merci Artouste , l'utilisation des chaînes de caractères est un peu obscure pour moi , en regardant sur google j'ai trouvé une fonction qui devrait corresponde a mon besoin mais je ne comprends pas comment l'utiliser ( Sscanf).

pourrais tu (ou quelqu'un qui saurait )m'aider comprendre comment elle fonctionne ( ou peu etre y a t'il une fonction plus adéquate )

http://docs.roxen.com/pike/7.0/tutorial/strings/sscanf.xml

moi j'utiliserai strtok
tu envoie par exemple 12345,145676 ou , est un séparateur

pour parser (code de barbudor :wink: )

char separateurs[] = ",";  // caractères pouvant séparer

parser_ma_chaine( char *ma_str )
{
 char *p;

 p = strtok( ma_str, separateurs )
 while ( p )
 {
   // un morceau a traiter
   Serial.println( p );


   // au suivant
   p = strtok( NULL, separateurs );
 }
 // finit
}

merci infobarquee

j'ai essayé de faire un petit prog pour tester , mais cela ne me retourne rien dans le moniteur serie

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
char separateurs[] = ",";  // caractères pouvant séparer
char ma_str [] = "t,145676";
}


void parser_ma_chaine( char *ma_str ){
  
 char *p;
 char *p1;
char separateurs[] = ",";  // caractères pouvant séparer
 p = strtok( ma_str, separateurs );
 while ( p )
 {
   // un morceau a traiter
   Serial.print( p );


   // au suivant
   p1 = strtok( NULL, separateurs );
   Serial.print( p1 );
 }
 // finit
}

normal, tu appelles ou dans le loop le void parser_ma_chaine ?

je suis boulet par moment .... :confused:

merci pour tout ca fonctionne nickel

suite au code d'infobarquee , j'ai essayé de l'adapter avec la comm bluetooth (btserial), mais j'ai une erreur que je ne comprend pas :

void bt_recup(){

char *p;
char *p1;
char separateurs[] = ",";  // caractères pouvant séparer

if (btserial.available())  // verifie si des infos dispo
    {  
       char ma_str = btserial.read();

p = strtok( ma_str, separateurs ); // indicateur
   Serial.print( p );
p1 = strtok( NULL, separateurs );
   Serial.print( p1 );        

if ( p == "run"){
        st = p1;   // mode run stop
}
else if ( p == "bt"){
      temps1 = p1;  // retard declenchement IR
}
else if (p == "nb_ph"){
      nbph = p1;  // nb photos
}
else if (p == "tp_int"){
      temps2 = p1;  // interval photos    
}
}
}

le compilateur me met une erreur au niveau de p=strtok ....

exit status 1
invalid conversion from 'char' to 'char*' [-fpermissive]

je ne vois absolument pas ce qui prose probleme , le code était ok seul ... si quelqu'un peut m'aider

je ne vois absolument pas ce qui prose probleme , le code était ok seul ... si quelqu'un peut m'aider

Bonjour,

Il faut que tu lises tout le message dans une chaine, après tu pourra la parser.
Ici tu lis un seul caractère et tu essaie de le parser.

je suis désolé mais je ne comprends pas comment je dois m'y prendre

j'envoie d'android vers arduino une chaîne qui va être du style "run,120"

pour moi ( et a mon avis c'est la que je me plante) le code

char ma_str = btserial.read();

me donne : ma_str = "run,120"

non ?

je ne connais vraiment pas bien cette fonction et j'ai du mal a me l'approprier

hello
voici un code qui simule une reception blue tooth

charge le et regarde ton moniteur
ensuite, regarde comment il est fait :slight_smile:

char separateurs[] = ",";  // caractères pouvant séparer

void setup() {
   Serial.begin(115200); 
   Serial.println("test simulation de blue tooth");

}

void loop() 
{
 
char ma_str[] =  "run,120,55,88,99,33,456";//btserial.read();
parser_ma_chaine(ma_str);
while ( 1 ){};
}
void parser_ma_chaine( char *ma_str )
{
 char *p;

 p = strtok( ma_str, separateurs );
 while ( p )
 {
   // un morceau a traiter
   Serial.println( p );


   // au suivant
   p = strtok( NULL, separateurs );
 }
 // finit
}

ok je crois que j'ai compris comment cela fonctionne :slight_smile: ce n'est peu etre pas grand chose pour toi mais pour moi ca m'aide énormément ... merci beaucoup

une question subsidiaire :

si dans le buffer il y plusieurs trame
exemple:

"run,123"
"stop,100"
temps, 2000"

quand je vais faire un btserial.read()

il va me les récupérer 1 a 1 "run,123" si je relis ""stop,100" ....

ou il met tout dans une même chaîne "run,123,stop,100..."

Read() ne lit qu'un caractère à la fois.
Un peu de lecture:Stream - Arduino Reference
stream est la classe qui sert de base de toutes les classes qui gère des flux de données.