Comment lire 2 valeurs par Xbee sur Arduino ?

Bonjour à tous !

J'ai un problème, je suis débutant et j'arrive pas à trouver la solution....

J'ai un module Xbee + Arduino + Acceleromètre qui doit envoyer 2 valeurs (byte) à un autre module Xbee + Arduino

Mais je ne sais pas comment faire... J'ai tester un truc mais la valeur reçu n'a rien à voir

Pourriez-vous m'aider svp ?

Merci d'avance

Striker

Je ne suis pas un spécialiste mais je tenterai comme ça:

int tableau[2] = {0,0}; // déclare un tableau avec 0 comme valeur par défaut

ensuite tu le remplis avec tes variables
tableau[0] = valeur1;
tableau[1] = valeur2;

et tu envois tableau

sur l’arduino distant, tu déclares de nouveau ton tableau
et tu récupères tes valeurs
patatipatata = tableau[0];
machinchose = tableau[1];

à tenter…

Merci je vais tester sa

Voila je viens de faire une partie du programme pour tester mais cela ne fonctionnement pas

int tableau[2] = {0,0}; 
byte x = 0 ;
byte y = 0 ;

void setup()
{
  Serial.begin(9600);
}
void loop ()
{ 
  if(Serial.available() > 0)
  {
    tableau[0] = Serial.read(tableau[0]) ;
    tableau[1] = Serial.read(tableau[1]) ;
    x = tableau[0];
    y = tableau[1];
  }
}

J’ai un problème avec le Serial.Read

read ne prend aucun argument Serial.read(tableau[0]).

Puisque tu stockes tes données dans ton tableau pas besoin de 'x' et 'y' ?

byte tableau[2] = {0}; //astuce raccourci: tu peux entrer la valeur d'initialisation qu'une seule fois (si toute identiques) .

void setup()
{
  Serial.begin(9600);
}
void loop ()
{ 
  if(Serial.available() > 0)
  {
    tableau[0] = Serial.read() ;
    tableau[1] = Serial.read() ;
  }
}

Sa ne va pas lire 2 fois la même valeur ?

Non non, chaque appel à read() aura pour effet de placé le "curseur" du buffer (circulaire) à la l'emplacement suivant. http://arduino.cc/en/Serial/Read

int HardwareSerial::read(void)
{
  // if the head isn't ahead of the tail, we don't have any characters
  if (_rx_buffer->head == _rx_buffer->tail) {
    return -1;
  } else {
    unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
    _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE;
    return c;
  }
}

Entre () pour revenir à l'emplacement précédent. http://arduino.cc/en/Serial/Peek

Bonjour,

je viens de refaire tout mon programme mais rien à changer.
j’envoie toujours les valeurs 104 et 96 (byte) et je recois des valeurs
qui ont rien à voir 50, 43, 10, 13, des choses de ce genre.

Voici le module 1 (Accéléromètre + Xbee + Arduino)

//Librairie
#include <LiquidCrystal.h>
//Config LCD
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2) ;
//Tableau
byte tableau[2] = {0} ;

void setup(){
  Serial.begin(9600) ;
  lcd.begin(16, 2) ;
  lcd.print("Atom by STX") ;
}
void loop(){
  tableau[0] = analogRead(A0) ;
  tableau[1] = analogRead(A1) ;
  Serial.println(tableau[0]) ;                     //envoie donnés port Serie
  Serial.println(tableau[1]) ;
  lcd.setCursor(0,1) ;                              //affichage LCD
  lcd.print("                ") ;
  lcd.setCursor(0,1) ;
  lcd.print("X= ") ;
  lcd.print(tableau[0]) ;
  lcd.setCursor(7,1) ;
  lcd.print("Y= ") ;
  lcd.print(tableau[1]) ;
  delay(750) ;
}

Voici le module 2 (Xbee + Arduino)

//tableau
byte tableau[2] = {0} ;

void setup()
{
  Serial.begin(9600) ;
}


void loop()
{
  if(Serial.available() > 0)
  {
    tableau[0] = Serial.read() ;
    tableau[1] = Serial.read() ;
    Serial.println(tableau[0]) ;             //me sert à voir les valeurs reçues
    Serial.println(tableau[1]) ;
    delay(750); 
  }
}

Désolé Striker, je ne peux pas plus t'aider. Par contre je reste attentif à la solution ;-)

Courage.

https://www.w3.org/community/d-tasks/simple-page/

Je me demande si c'est pas mon Xbee qui foire ...

quand je les inverse rien ne se passe sur le module 2, pas de valeurs....

En tout cas merci de ton aide

Je vous dis quoi ce soir

n'utilise pas println

void Print::println(void)
{
  print('\r');
  print('\n');  
}

mais write qui n'effectue aucun traitement sur ton byte (unsigned char) ou ajout à la transmission.

Serial.write(tableau[0]) ;                     //envoie donnés port Serie
Serial.write(tableau[1]) ;

Yep!

Normal que tu ne vois rien sur ton moniteur, les bytes ne s'affichent pas.

Exemple :

byte value = 127;

void setup() {
  
  Serial.begin(19200);
  
  delay(2000);
  
}

void loop() {
  
  Serial.println();
  Serial.print("BYTE : ");
  Serial.println(value);
  Serial.print("INT : ");
  Serial.println(int(value));
  Serial.print("WRITE : ");
  Serial.write(value);
  
  delay(5000);
  
}

Me retourne :

BYTE :  INT : 127 WRITE : 

Si tu veux voir les valeurs qui arrivent, faut effectuer une petite conversion ( Serial.println(int(value)); )

...
Serial.println(int(tableau[0])) ;             //me sert à voir les valeurs reçues
Serial.println(int(tableau[1])) ;
...

@+

Zoroastre.

D'après ce que j'ai compris son port serie lui sert à la transmission entre arduino via xbee (d'où write et non println dans le premier ) et l'affichage des valeurs sur le lcd, par contre je remarque seulement qu'il retourne les valeurs reçue sur le deuxième vers le premier ... (alors qu'il veut l'affiché sur le serial monitor de l'ide arduino ?). :sweat_smile:

Merci de votre aide

Le module 1 : Accéléromètre + Arduino + Xbee + Ecran LCD

Le module 2 : Xbee + Arduino

Sur le module 2 j'essaye de voir sur le terminal ce que reçoit le Xbee Sur le module 1 je vois bien les même valeurs que sur le LCD avec le terminal

Excusez moi mais mettre des fragments de code a mettre dans mon programme m'aide pas car je me perds.... Pourriez vous le remettre dans le programme svp ? Désoler je suis debutant

Striker:
Sur le module 2 j’essaye de voir sur le terminal ce que reçoit le Xbee
Sur le module 1 je vois bien les même valeurs que sur le LCD avec le terminal

Quand tu parles de terminal tu parle bien du moniteur serie de l’ide arduino ?
Parce que soit tu utilise le porte serie pour la communication entre tes deux arduino via xbee, soit tu affiche une valeur dans le moniteur serie de l’ide mais pas faire les deux en même temps (des valeurs peuvent s’afficher sur le terminal mais globalement on utilise pas un même port serie pour 2 choses différentes).
Edit:
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.Serial

La librairie Serial est utilisée pour les communications par le port série entre la carte Arduino et un ordinateur ou d’autres composants

.
Le “ou d’autres” peut être ton module xbee, mais le “ou” signifie l’un ou l’autre mais pas les deux.

Il te faudrait une autre méthode pour vérifier les valeurs ressuent sur l’arduino récepteur.

void loop()
{
  if(Serial.available() > 0)
  {
    tableau[0] = Serial.read() ;
    tableau[1] = Serial.read() ;
    Serial.println(tableau[0]) ;             //là tu renvoies les données à ton premier arduino emeteur via xbee
    Serial.println(tableau[1]) ;
    delay(750); 
  }
}

Les pin0(rx) et pin1(tx) sont ceux qui serve à la liaison serie entre tes deux arduino via port serie, mais c’est également ceux ci qui servent à la programmation et à la communication du “terminal” “moniteur” serie de l’ide arduino via ton usb.

Donc,
ici rien ne change sauf “Serial.write(tableau[0]) ;” au lieu de “Serial.println(tableau[0]) ;”

//Librairie
#include <LiquidCrystal.h>
//Config LCD
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2) ;
//Tableau
byte tableau[2] = {0} ;

void setup(){
  Serial.begin(9600) ;
  lcd.begin(16, 2) ;
  lcd.print("Atom by STX") ;
}
void loop(){
  tableau[0] = analogRead(A0) ;
  tableau[1] = analogRead(A1) ;
  Serial.write(75) ;                     //envoie donnés port Serie (valeur arbitraire pour tester)
  Serial.write(64) ;
  lcd.setCursor(0,1) ;                              //affichage LCD
  lcd.print("                ") ;
  lcd.setCursor(0,1) ;
  lcd.print("X= ") ;
  lcd.print(tableau[0]) ;
  lcd.setCursor(7,1) ;
  lcd.print("Y= ") ;
  lcd.print(tableau[1]) ;
  delay(750) ;
}
byte tableau[2] = {0} ;

void setup()
{
  Serial.begin(9600) ;
  pinMode(13, OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
    tableau[0] = Serial.read() ;
    tableau[1] = Serial.read() ;
    
    //trouver une autre méthode de contrôle des valeurs ressuent ?

    if(tableau[0] == 75 && tableau[1] == 64) //valeur arbitraire pour tester
    {
      digitalWrite(13, HIGH); on allume la diode inclus dans ton arduino correspondant à la pin13
    }
    delay(750); 
  }
}

peut être plutôt utilisé le deuxième en envois et contrôler sur le lcd les valeurs ressuent (juste le temps des testes).

Merci de votre aide
Je vais test cela et je vous dis quoi !

pliz je veux programmer la carte arduino mega pour qu’il puisse recoit une information de la forme (date,concentration1,concentration2) a partir d’un port rs232 d’‘un analyseur qui detecte la concentration de co2 .
est ce que la fonction Serial.read() peut lire une donnée de cette forme (date,concentration1,concentration2) en considerant que l’'annalyseur a chaque second envoyer une information??