fixair:
A moins qu'il y ai une autre solution, j'ai d’ailleurs penser a transmettre un bloc complet de paramètre genre : AltiVitesseCapVz 2500110095-500 (2500 pieds ,110kt , 095°et -500 pieds/min) le hic c'est comment (...)
tu auras beaucoup de mal à déchiffrer ta trame dans ce format : on peut y trouver aussi : 250 pieds, 011kt , 0095°et -500 pieds/min. Je te conseille d'envoyer ta trame dans ce format : "A2500;K110;C095;Z-500;". une lettre suivie d'une donnée numérique puis d'un ';' (séparateur).
Ainsi, pour décoder (c'est un début d'illustration du tuto du barbu) :
boolean moins1;
int data1;
byte j1, j2;
void loop(){
while(!serial.available()); // boucler tant qu'il n'y a rien dans le port série
j1 = Serial.read(); // lecture du premier octet
while(!serial.available()); // boucler tant qu'il n'y a rien dans le port série
j2 = serial.read(); // lecture octet suivant
data1 = 0;
moins1 = false;
while (j2 != ';'){ // boucler tant qu'on n'a pas le séparateur
if (j2 == '-'){
moins = true; // signe -
} else if ((j2 == '.') || (j2 == ','){ // virgule ou point : partie décimale
// ici le code de ton choix pour gérer les décimales...
} else if ((j2 >= '0') &&(j2 <= '9')){ // chiffre
data1 = (data1 * 10) + (j2 - '0');
}
while(!serial.available()); // boucler tant qu'il n'y a rien dans le port série
j2 = serial.read(); // lecture octet suivant
}
// normalement, là, j2 = ';', bah on s'en fout, c'est un octet perdu, mais il nous aura servi à sortir de la boucle!
if (moins1) data1 *= -1; // signe négatif
switch (j1){ // en fonction de la lettre d'identification de la commande, faire :
case 'A': // Altitude
gerer_altitude(data1);
break;
}
case 'K': // Kt
gerer_kt(data1);
break;
}
case 'C': // cap
gerer_cap(data1);
break;
}
}
Avec ça, tu peux jouer tranquille. Je te laisse le soin de gérer la réception d'un nombre à virgule, mais si tu n'en utilises pas, alors tu peux virer ce if... Si tu es motivé, tu peux t'amuser à décoder des trames genre "A2500;K011;P12.5,21;C045;", où la donnée P est suivie de deux données (j'ai imaginé P comme position suivie de x puis y. sachant qu'en plus, x est un nombre à virgule... il faudra gérer des float, et prévoir data1, data2, data_n... Maintenant, tu peux rester simple avec "P12.5;Q21;", mais il peut être parfois intéressant de décoder en même temps plusieurs données pour les envoyer en même temps dans la fonction gerer_donnees_multiple(data1, data2).
Pour ce qui est du mélange servos / PAP, les librairies ne sont pas forcément compatibles entre elles. Si l'une paramètre une ressource (je pense surtout au un timer2...) et que l'autre modifie la même ressource pour ses propres besoins, ça fera tout du caca dans la première lib, mais ça, c'est le côté opensource...