Transformer une lettre en entier ou en float pour transfert via I2C

Bonsoir ,

je cherche la solution pour transférer une donnée d'un GPS connecté a un arduino vers un autre
La valeur est l'orientation de la longitude ou latitude N,S,E,W

Ma donnée est : GPS.lat

Normalement pour l'envoi vers le LCD , j'ai cette expression :

if ( GPS.lat == 'N' ) tft.println(" N"); // N or S
       else tft.println("S");

j'ai essayer divers solutions dont la dernière :

Coté Arduino master

// lat long direction variable

int dirlat1;
float dirlat2;

dirlat2 = (float) dirlat1;

if ( GPS.lat == 'N' )  dirlat1 = 1;
else  dirlat1 = 0;

puis le data pour le transfert par IC2

sensorData[0].dirlat =  dirlat2;

mais la valeur n'est pas reconnu par l'arduino slave donc je ne dois pas transferer un float

coté slave

char dirlat2;
char N;
char S;

if ( dirlat2 == '1' )
{ 
 char dirlat2 = N;
} 
else 
{
 char dirlat2 = S;
}

Serial.println( sensorData[sensor].dirlat2,0);

Comment puis je transformer ma lettre en float ou entier et la retransformer inversement

François

En envoyant le code ASCII ?

Tous mes autres datas sont en float donc j'aurais voulu garder le même format.

j' essai pour le moment de pouvoir transformer la valeur N ou S en float 1 ou 0 mais mon code
ne semble pas fonctionner.

float dirlat1;
float dirlat2;

dirlat2 =  dirlat1;

 if ( GPS.lat == 'N' )  dirlat1 = 1;
 else  dirlat1 = 0;

d' où provient mon erreur ?

Si tu veux convertir une lettre en flotant, ce n’est pas joli, mais c’est possible, du côté où tu écris tu fais ceci :

float aEnvoyer = 0.0F; // initialisation de la variable à 0


*((char *)&aEnvoyer) = 'N';  // ca écrit le caractère "N" dans l'espace mémoire occupé par ton flottant qui du coup dévient invalide et n'importe quoi, n'essaie donc pas de faire un "print" ou quoi que ce soit avec...

Serial.write(aEnvoyer);  // ne surtout pas faire un "print", sinon, utilise ce que tu veux pour transferer mais en binaire

Puis du coté où tu reçois ton flotant-buffer :

float aRecevoir;  // flottant qui va recevoir ta valeur codée
char cardinal;   // caractère qui recevra ta lettre "décodée"

Serial.read(aRecevoir); // ou quoi que ce soit d'autre comme lecture *binaire*

cardinal = *((char *)&aRecevoir);  // "décodage" de ton flottant-lettre-buffer

C’est très moche, mais ca peut marcher. Sinon il y a plus simple, tu fais comme dit CelticLord et t’utilises autre chose que des flottants comme ferait tout le monde.

Je débute dans tout ça et je soin loin d' etre une source d'information infaillible mais à la limite pourquoi ne pas mélanger ta méthode et celle de Zorro, au lieu de mettre la valeur 1 ou 0 qui est un entier ca vient peut etre de la, tu essayes avec float dirlat1 = 0.0F ou 1.0F comme ca tu as 0 ou 1 directement en float.

Reprenons, on dirait que t'as modifié et enrichi ton premier message, alors avec ces éléments nouveaux, voici tout d'abord quelques commentaires à propos de ton code :

Coté "master" : RAS, soit...

Mais coté "slave" :

char dirlat2; // cette variable n'est pas initialisée donc elle vaut n'importe quoi entre 0 et 255
char N;       // ca c'est une "variable" qui s'appelle "N" et qui ne contient pas du tout la valeur 'N', en plus elle n'est pas initialisée donc elle vaut n'importe quoi entre 0 et 255
char S;       // pareil qu'avec N mais avec S

if ( dirlat2 == '1' )  // cette variable n'étant pas initialisée, t'as une chance sur 256 pour qu'elle contienne '1'
{ 
 char dirlat2 = N;   // là t'es en train de créer une nouvelle variable qui s'appelle aussi dirlat2 à laquelle t'affectes la valeur non-initialisée de la variable N.
                            // comme c'est une nouvelle variable dirlat2, ca n'affectera pas la valeur de dirlat2 déclarée au-dessus
} 
else 
{
 char dirlat2 = S;  // la même chose qu'au dessus (!)
}

Serial.println( sensorData[sensor].dirlat2,0); // sensorData[sensor].dirlat2 est encore une autre variable : le champ d'une structure, donc rien de ce que t'as fait au dessus n'affectera ni changera sa valeur...

Pour info, voici un code qui affecte le caracètre ASCII 'N' ou 'S' à une variable en fonction de la valeur d'une autre :

int valeurCodee = 1; // disons 1 pour 'N' et n'importe quoi d'autre pour 'S' (une valeur différente de 1 quoi)
char cardinalDecode;

if ( valeurCodee == 1 )  // si la valeur de codage vaut 1
{
    cardinalDecode = 'N';  // alors on affecte le caractère ASCII 'N', les guillemets simples utilisés sont très importants, ca veut dire "la lettre N en ASCII"
                                    // si tu mets N sans les guillemets c'est une variable (qui doit exister et être déclarée au préalable), pas un caractère ASCII
}
else
{
    cardinalDecode = 'S'; // sinon (si la valeur de codage vaut autre chose que 1), alors on affecte le caractère ASCII 'S'
}

// à partir de là, cardinalDecode contient le caractère 'N' ou le caractère 'S' qui peut être utilisé dans un serial.print() :
Serial.println(cardinalDecode);

Il va falloir revoir un petit peu tes bases de programmation, t'as d'excellents tutoriels partout sur le net, t'as qu'à taper "tuto C" ou "tuto C++" et tu n'auras que l'embarras du choix !

Cool , merci pour cette réponse Zorro_X :slight_smile:

Ca fonctionne , voici ce que j'ai mis :

Sur l'arduino emetteur

int dirlat1 = 1; // disons 1 pour 'N' et n'importe quoi d'autre pour 'S' (une valeur différente de 1 quoi)
int dirlat2 = 1;

 if ( GPS.lat == 'N' ) dirlat1 = 1;
 else  dirlat1 = 0;

if ( dirlat1 == 0 )  // si la valeur de codage vaut 1
{
    dirlat2 = 'N';  // alors on affecte le caractère ASCII 'N', les guillemets simples utilisés sont très importants, ca veut dire "la lettre N en ASCII"
                                    // si tu mets N sans les guillemets c'est une variable (qui doit exister et être déclarée au préalable), pas un caractère ASCII
}
else
{
    dirlat2 = 'S'; // sinon (si la valeur de codage vaut autre chose que 1), alors on affecte le caractère ASCII 'S'
}

sur l'arduino recepteur

byte dirlat =  ( sensorData[sensor].dirlat);
char dirlat1 = dirlat;

 Serial.println( dirlat1);

Il m'affiche bien S ou N si je modifie le if,else de l'emetteur

cool, sur ton recepteur t'as pas besoin de passer par 3 variables pour afficher ce que tu recois, tu peux faire directement :

Serial.println( (char)(sensorData[sensor].dirlat) );

Ca s'appelle un "cast" ca permet de convertir dans le type qui t'intéresse sans passer par des variables intermédiaires...