Projet Arduino émetteur récepteur 433mHz

Bonjour,
Je suis en train d'essayer de communiquer entre un émetteur et un récepteur Arduino afin de mener à bien mon projet de fin d'année.
J'utilise pour cela la librairie VirtualWire. Pour effectuer une transmission de mots simples tels que "Bonjour", je n'ai aucun problème, cependant je dois communiquer une valeur variable (luminosité). J'utilise donc le programme de transmission suivant :

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

const char *msg = "Bonsoir"; // Tableau qui contient notre message

void setup() // Fonction setup()
{
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Tuto VirtualWire"); // Petit message de bienvenue

vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
Serial.print("");
}

void loop() // Fonction loop()
{
Serial.print("TX ... "); // On signale le début de l'envoi
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
Serial.println("Done !"); // On signal la fin de l'envoi
delay(1000); // Et on attend 1s pour pas flooder
}

Que j'ai modifié afin de changer le message de transmission en une variable :

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

float L ;

void setup() // Fonction setup()
{
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Tuto VirtualWire"); // Petit message de bienvenue

vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
Serial.print("");
}

void loop() // Fonction loop()
{
Serial.print("TX ... "); // On signale le début de l'envoi
vw_send((uint8_t *)L, strlen (L) ); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
Serial.println("Done !"); // On signal la fin de l'envoi
delay(1000); // Et on attend 1s pour pas flooder
}

Et la console Arduino m'affiche le message d'erreur suivant :

O:\SIN\transmission sans fil arduino\test_-2\test-_2.ino: In function 'void loop()':

test_-_2:27: error: invalid cast from type 'float' to type 'uint8_t* {aka unsigned char*}'

vw_send((uint8_t *)L, strlen (L) ); // On envoie le message

^

test_-_2:27: error: cannot convert 'float' to 'const char*' for argument '1' to 'size_t strlen(const char*)'

vw_send((uint8_t *)L, strlen (L) ); // On envoie le message

^

exit status 1
invalid cast from type 'float' to type 'uint8_t* {aka unsigned char*}'

Avec l'erreur sur la ligne en rouge. j'ai cru comprendre que la transmission devait s'effectuer avec une const char; mais je ne sais pas comment convertir ma variable L.

Merci de vos réponses

Bonjour,

Mets ton code entre balises de code

Il faut que tu passes l'adresse de la variable: &L et sa taille sizeof L (strlen c'est pour les chaines)

    vw_send((uint8_t *)&L, sizeof L); // On envoie le message

Bonjour,

Merci de ta réponse rapide. En effet le programme fonctionne désormais, nous pouvons transmettre une variable. Cependant, nous recevons des valeurs qui nous sont inconnues. Lors de la transmission d'une constante, nous recevions des données en code ASCII, et il a été assez simple de traduire les données.

Voici le programme d'émission modifié:

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

float L ;


 
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Tuto VirtualWire"); // Petit message de bienvenue
    pinMode (A0, INPUT);
    vw_setup(2000);     // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    Serial.print("");
}
 
void loop() // Fonction loop()
{
   
    L=analogRead(A0);
    Serial.print(L);





  
    Serial.print(" "); // On signale le début de l'envoi
    vw_send((uint8_t *)&L, sizeof L ); // On envoie le message 
    vw_wait_tx(); // On attend la fin de l'envoi
    Serial.println(""); // On signal la fin de l'envoi
    delay(1000); // Et on attend 1s pour pas flooder
}

Et voici le code de réception :

#include <VirtualWire.h> // inclusion de la librairie VirtualWire
 
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Tuto VirtualWire"); // Petit message de bienvenue
 
    vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
}
 
void loop() // Fonction loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
    uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
    
    
    if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
    {
        if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
        {
            Serial.print("RX : ");
            for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
                Serial.print(buf[i]);
            Serial.println("");
        }
    }
}

Faut-il changer quelque chose dans le programme de réception aussi?

Bonjour,

Oui, il faut faire la même chose dans le programme de réception

#include <VirtualWire.h> // inclusion de la librairie VirtualWire
 
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Tuto VirtualWire"); // Petit message de bienvenue
 
    vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
}

float L;
void loop() // Fonction loop()
{
    if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
    {
        uint8_t lg=sizeof L;
        if (vw_get_message((uint8_t *)&L, &lg)) // On copie le message, qu'il soit corrompu ou non
        {
            Serial.print("RX : ");
            Serial.println(L);
        }
    }
}

Cher kamill,

Je tiens à te remercier (pardon, nous tenons), le programme fonctionne.

Cependant, je ne comprends pas la ligne :

uint8_t lg=sizeof L;[code]

Que signifie elle exactement? 

Merci de nous accorder de votre temps

Dans l'instruction vw_get_message tu dois passer en 2eme paramètre un pointeur contenant la taille maximum et qui recevra le nombre d'octets lus.
Donc je crée une variable lg et je lui affecte la taille de L, et je passe l'adresse &lg.
C'est équivalent à l'instruction uint8_t buflen = VW_MAX_MESSAGE_LEN; mais qui elle est pour une table ce caractères