(resolu)programmation module UHF

Bonjour à tous j ai un bout de code capable d’envoyer une chaine de caractere vers un module UHF.

La transmission sans fil vers le deuxieme Arduino fonctionne tres bien.

Maintenant je voudrais transmettre une variable ( temperature …) à la place du message mais je ne sais pas comment proceder.

voici le code coté emetteur pour la transmission d’une chaine.

    #include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !

    void setup()
    {
        vw_setup(2000);                // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
        vw_set_tx_pin(3);             // La broche 3 sera utilisée pour transmettre la DATA, vous pouvez changez de broche si vous le désirez.
    }

    void loop()
    {
       const char *msg = " Coucou ";                   // C'est le message à envoyer.
       vw_send((uint8_t *)msg, strlen(msg));
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
       delay(200);                                              // Très important sinon cela peut brouiller d'autres appareils !
    }

merci du coup de main.

Regarde les fonctions de conversion de nombre en chaîne de caractère telle que itoa() ou les fonctions intégrées à la classe String.

en gros tu me suggeres de convertir ma variable en chaine pour la transmission et l’inverse sur le recepteur ?

exactement, il n'y a que ça a faire ^^^ou alors tu les traduit en byte ( parfois plusieurs si grosse valeurs), tu m'étonne barbudor, tes occupé ou quoi? une réponse en une ligne sa doit être ton record :stuck_out_tongue:

Skizo !

je vais me documenter sur cette fonction. Merci.

si besoin on est la, bon courage

Skizo =)

Tu peux effectivement transmettre en binaire, ca sera plus compact :

int toto = 12345;
vw_send( (uint8_t *)&toto, sizeof(toto) );

Lit mon tuto sur l'implémentation d'un protocole de communication (section Tuto du forum).
Je parle des pièges et des dangers et j'explique pourquoi il faut implémenter quelque chose de propre pour garantir un fonctionnement sûr.

Pour l'instant l'exemple est en ASCII, je n'ai pas encore eu le temps de faire la version binaire, mais l'idée est la même. Notamment je décrit le protocole binaire Sirf.

Bonjour,

J'ai fait un tutoriel au sujet de virtualWire :

Au passage si tu veut envoyer des données binaire (pas du texte donc) tu peut t'inspirer de mon cast (byte*)&variable comme je le fait pour envoyer des données via un nrf24l01 :

Pas besoin d'implémenter un protocole, virtualwire en implémente déja un avec checksum, entête et tout ce qui va bien :wink:

skywodd:
Pas besoin d'implémenter un protocole, virtualwire en implémente déja un avec checksum, entête et tout ce qui va bien :wink:

Je me demandais justement ce qu'apportait VirtualWire.... :wink:
Il faut que je lise son f....g code XD

Merci du coup de main mais j ai beau tourner dans tout les sens ca ne fonctionne pas. Je seche honteusement.

je croit que ma temperature n'est pas prete à faire de l'hertzien.

j'y retourne demain pour retenter. J ai un bout de code qui permet une emission d'une valeur analogique lue sur une entrée. Peut etre une direction.

En fait on ne sait pas ce qui fonctionne pas.

Est-ce l'émission où la réception ?
Le sais tu ? Si oui pourquoi ?

Peux être nous montrer le code des 2 cotés.

en fait j ai la methode d’emission de mon module mais je ne sais pas comment le lui presenter.
Ma variable tempC est bien là sans moyen de la convertir en binaire.
et pourtant je sais comment convertir n importe quelle nombre en binaire avec les “String” mais là rien il ne se passe rien.
Je suis trop scotché au code d’envoi d’une chaine de caracteres et du coup envoyer autre chose au module me laisse sans voix.

Je comprend pas.

Ton code tout en haut qui envoie "coucou" marche ?

Je t'ai donné 2 manière de transmettre une variable :

  • en ASCII en utilisant au choix itoa() ou String
  • en binaire avec l'exemple de code

Qu'est-ce qui coince ?

  int tempC = 12345;
   vw_send( (uint8_t *)&tempC, sizeof(tempC) );
  
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
       delay(200);

du coup je me retrouve avec ça. tempC etant ma variable ou est stocké la temperature.
Ne comprenant pas le decoulement de cette analyse je suis planté.

j ai bien compris en revanche : que je peu transmettre ma variable à condition qu’elle soit dans un format dans mon cas Binaire. et grace à String je sait convertir n’importe quel nombre en binaire.

Je ne dispose pas d’un exemple concret que je puisse modifier à volonté afin de faire “tilt” dans ma tête.
Désolé de paraître un brin boulet mais je suis tenace.

Une variable est toujours en binaire en mémoire.
Tu as le choix de transmettre soit en binaire (c'est à dire une copie des octets qui forment ta variable) ou de convertir ta variable en suite de caractères intelligibles pour l'humain mais qui n'apporte rien à la transmission (cf mon tuto).

un int (sur Arduino) occupe 2 octets en mémoire
En écrivant : vw_send( (uint8_t *)&tempC, sizeof(tempC) );
tu dit Envoyer 2 octets depuis l'endroit de la mémoire où stocké tempC

tempC : ta variable, du type "int"
&tempC : adresse en mémoire de ta variable (adresse du 1er octet) : du type "int " (pointeur sur int)
(uint8_t
) : transtypage (appellé aussi cast) : parce que vw_send() attend un (uint8_t *) (pointeur sur uint8_t) tu lui dit : prend mon "int *" comme un "uint8_t *" sans te plaindre, je sais ce que je fais.
sizeof(tempC) vaut 2 parce que tempC utilise 2 octets en mémoire

Coté réception tu devrais recevoir avec :

void loop()
{
    int tempC;
    uint8_t buflen = sizeof(tempC);
    if (vw_get_message((uint8_t*)&tempC, &buflen)) // Non-blocking
    {
int i;
// Message with a good checksum received, dump HEX
Serial.print("Got: ");
    Serial.println(tempC, DEC);
}
Serial.println("");
   }
}

Sinon tu peux utilisé itoa() pour convertir un entier en chaine de caractère. On te l'a dit 2 ou 3 fois.
As tu seulement essayé de trouver la doc de ce qu'on t'indique ?

Coté emission :

void loop()
{
    const char chaine[15];
    itoa( tempC, chaine, 10 );
    vw_send((uint8_t *)chaine, strlen(chaine)+1);
    delay(400);
}

Et ca tu peux le recevoir avec le code exemple de VW telquel.

Et finalement désolé mais String n'est pas adapté.

Juste pour compléter ce que dit barbudor

caco74:
j ai bien compris en revanche : que je peu transmettre ma variable à condition qu'elle soit dans un format dans mon cas Binaire. et grace à String je sait convertir n'importe quel nombre en binaire.

Tu peut transmettre n'importe quoi dans la mesure ou il s'agit un tableau de uint8_t (des octets sur 8 bits).

Ce qu'il faut bien te dire c'est que binaire = donnée brute tout droit sorti de la mémoire (non lisible par un humain), et texte (string, char, etc ...) = données textuelle lisible par un humain (mais lourd a gérer pour une machine).

Exemple :

int i = 12345;

En binaire : 0x30 0x39 -> 2 octets
En texte : '1', '2', '3', '4', '5' -> 5 octets

Merci du temps que vous me consacrez mais j aborde un coté obscur de la programmation qui me fait defaut et je prefere bien comprendre les tenants et les emboutissants.

je pense que au fur et à mesure de mes apprentissages je puisse enfin y voir une logique flagrante.

Merci pour les bouts de code.

Petite question pendant que je vous tiens : Est ce que toute les transmissions UHF ou Xbee se font de la même sortes ?

caco74:
Petite question pendant que je vous tiens : Est ce que toute les transmissions UHF ou Xbee se font de la même sortes ?

J'ai jamais touché à tout ce qui est Xbee, Zigbee & co ...
A mon avis le principe de transmission par "paquet" est le même, par contre il doit y avoir des subtilité au niveau de la transmission (checksum, entête, etc).

Apres bien des deboires mon code fonctionne bel et bien.

Au niveau de la reception je recoit des données de type 13618 pour 25°C.

Je ne sais pas comment est ce format. mais il change avec la temperature et je lui demande pourtant bien de me l'afficher en DEC.

Poste le code des 2 cotés