[Résolu] VirtualWire : Envoie d'un tableaux de variables

Bonjour à tous !
Voilà, lundi prochain, je dois présenter mon projet devant un jury pour le bac, et bien que j’aurais voulu trouver la réponse tout seul je me trouve dans l’obligation de demander un peu d’aide.

Mon problème : Je bloque sur la partie émission / réception de données de mon programme. En effet, sur ma première carte, je lis via un joystick (= 2 potentiomètres) les valeurs A0 et A1 de ces potentiomètres, cependant je n’arrive pas à recevoir mon tableau de données correctement. Le plus étrange, c’est que pour une seule valeur, le programme marche (si dans ma fonction d’envoie / réception je ne mets qu’une variable, sans passer par un tableau), donc niveau montage aucun soucis.

J’utilise la libraire VirtualWire pour transmettre mes informations d’une carte à l’autre.

Voici le code de la carte “émission” :

#include <VirtualWire.h>
int joyPin1 = A0;          // slider variable connected to analog pin 0
int joyPin2 = A1;          // slider variable connected to analog pin 1
int valeurs[2];

void setup() {
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_tx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
}

void loop() {

  // Lecture de l'état du potentiomètre
  int value1 = analogRead(joyPin1);
  int value2 = analogRead(joyPin2);
  valeurs[0] = value1;
  valeurs[1] = value2;
  vw_send((uint8_t *) &valeurs, sizeof(valeurs));
  vw_wait_tx(); // Wait until the whole message is gone
  delay(200);
}

Code carte “réception” :

#include <VirtualWire.h>

int value1;                  // variable to read the value from the analog pin 0
int value2;                  // variable to read the value from the analog pin 1
int valeurs[VW_MAX_MESSAGE_LEN];

void setup() {
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_rx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
  Serial.begin(9600);
}

//Programme principal
void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
      if (vw_get_message(buf, &buflen)) // check to see if anything has been received
      {
        int i;

         for (i = 0; i < buflen; i++)
         {
           valeurs[i] = int(buf[i]);
         }

        valeurs[buflen] = '\0';

        value1 = valeurs[0];
        value2 = valeurs [1];
        Serial.print("reception_v1 : "), Serial.println(value1);
        Serial.print("reception_v2 : "), Serial.println(value2);
      }
}

J’ai pu déterminer qu’il n’y avait que cette partie du code qui ne fonctionnait pas et vous n’avez donc pas à vous souciez du reste du programme (pour le moment du moins :p). J’ai essayé plusieurs versions d’IDE (1.6.8, puis 1.5.7, pour les besoins de mon programme : en effet, la version 1.6.8 ne voulait pas compilé certaines fonctions qui ont parfaitement fonctionnées sous la version 1.5.7).

Je vous mets le code qui me permet d’envoyer une seule valeur (mais qui marche) :

Voici le code de la carte “émission” :

#include <VirtualWire.h>

int joyPin1 = A0;          // slider variable connected to analog pin 0

void setup() {
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_tx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
}

void loop() {

  // Lecture de l'état du potentiomètre
  int value1 = analogRead(joyPin1);
  vw_send((uint8_t *) &value1, sizeof(int));
  vw_wait_tx(); // Wait until the whole message is gone
  delay(200);
}

Code carte “réception” :

#include <VirtualWire.h>

int value1;                  // variable to read the value from the analog pin 0

void setup() {
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_rx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
  Serial.begin(9600);
}

//Programme principal
void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
      if (vw_get_message(buf, &buflen)) // check to see if anything has been received
   {
        value1 = *((int*) buf);
        Serial.print("reception_v1 : "), Serial.println(value1);
      }
}

Je pense donc que c’est mon tableau qui pose problème.

Je pensais sinon passer par la fonction itoa / atoi en convertissant mes int en char pour envoyer plus facilement mon tableau de données (on ne voit quasiment que des tableaux de chars sur le net lorsque l’on utilise VirtualWire, même si j’arrive à envoyer un int, donc je me dis qu’envoyer un tableaux d’int devraient être réalisable). De plus cette solution compliquerait davantage mon programme, or il est déjà assez conséquent et je ne ne suis déjà pas sur de pouvoir tenir le temps maximum imposé.

J’espère que quelqu’un pourra me venir en aide avant le délais qui arrive à grand pas. Je vous remercie d’avance.

Bonjour,

Pour l’émission, c’est presque ça, mais l’adresse du tableau c’est valeurs et non &valeurs

emission

#include <VirtualWire.h>
int joyPin1 = A0;          // slider variable connected to analog pin 0
int joyPin2 = A1;          // slider variable connected to analog pin 1
int valeurs[2];

void setup() {
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);   // Bits per sec
  vw_set_tx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
}

void loop() {

  // Lecture de l'état du potentiomètre
  int value1 = analogRead(joyPin1);
  int value2 = analogRead(joyPin2);
  valeurs[0] = value1;
  valeurs[1] = value2;
  vw_send((uint8_t *) valeurs, sizeof(valeurs));
  vw_wait_tx(); // Wait until the whole message is gone
  delay(200);
}

Pour la réception tu dois utiliser le même principe

réception:

#include <VirtualWire.h>

int value1;                  // variable to read the value from the analog pin 0
int value2;                  // variable to read the value from the analog pin 1
int valeurs[2];

void setup() {
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);   // Bits per sec
  vw_set_rx_pin(2);
  vw_rx_start();       // Start the receiver PLL running
  Serial.begin(9600);
}

//Programme principal
void loop() {
  uint8_t buflen = sizeof valeurs;
  if (vw_get_message((uint8_t *)valeurs, &buflen)) // check to see if anything has been received
  {
    value1 = valeurs[0];
    value2 = valeurs [1];
    Serial.print("reception_v1 : "), Serial.println(value1);
    Serial.print("reception_v2 : "), Serial.println(value2);
  }
}

Je n'ai qu'une chose à te répondre... MERCI !!! Mon programme fonctionne enfin alors que je commençais à désespérer un peu, mais maintenant je n'ai plus qu'à finaliser quelques petits trucs et mon projet sera prêt en temps et en heure, et cela notamment grâce à ton aide ! Je posterai l'intégralité de mes travaux dans la partie projet une fois fini et lorsque j'aurais un peu de temps libre (pour l'instant je vais me concentrer sur mes épreuves :p). Encore un grand merci..