Problème Xbee API + Arduino +ethernet shield

Bonjour à tous

Je possède un réseau de plusieurs xbee sur lesquels se trouvent en entrées plusieurs capteurs de température. Chaque xbee du réseau envoi une trame d'octets que je viens récupérer avec un autre xbee (receveur) et que je décode avec arduino. Sur le moniteur d'arduino je décode bien chaque trame reçu et les valeurs de températures sont affichées.
Maintenant j'aimerais les afficher sur une page internet, je reçois bien une trame avec une température ou bien l'autre trame de l'autre xbee d'ou la condition soit je reçois une première trame j'affiche la température, soit je reçois une autre trame j'affiche les autres valeurs de températures du réseau. Le problème est qu'au début j'affiche bien sur une page internet une trame ou bien l'autre et après j'affiche des valeurs erronées. d'ou est ce que ça peut venir cette erreur? Sachant qu'au début, cela s'affichait correctement.

Voici mon code arduino,

Je ne sais pas si j'ai été assez explicite, c'est assez délicat pour expliquer ce problème...

Merci d'avance,

Voici mon code :

#include <SPI.h>
#include <Ethernet.h>




// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x0F };
IPAddress ip(192,168,1, 110);

int packet[32];
int analogSamples[40];


// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup()
{
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  delay(1);
  //Serial.print("Starting.........."); 
  //Serial.println(); 


}

void loop()
{
  
 
  
  EthernetClient client = server.available();
  if (client) {
                    boolean currentLineIsBlank = true;
                    while (client.connected()) {
                      if (client.available()) {
                          char c = client.read();
                               if (c == '\n' && currentLineIsBlank) {
                                     client.println("HTTP/1.1 200 OK");
                                     client.println("Content-Type: text/html");
                                     client.println();
                                      // client.print("helllo");
                                             if (Serial.available() > 0) {
                                               client.print("helllo");
                                             int b = Serial.read();
                                              if (b == 0x7E) {
                                                   packet[0] = b;                           
                                                   packet[1] = readByte();
                                                   packet[2] = readByte();
                                                   int dataLength = (packet[1] << 8) | packet[2];  
                                                        //if (dataLength==0x1A) {      
                                                           for(int i=1;i<=dataLength;i++) {
                                                                  packet[2+i] = readByte();               
                                                                                          }
                                                                              int apiID = packet[3];                
                                                                              int moduleID;                                  
                                                                              if (apiID == 0x83) {                                                                                                                 
                                                                                   moduleID = (packet[4] << 8) | packet[5];
                                                                                   int SgnlPwr = packet[6];
                                                                                   int SampleNumber = packet[8];                                                                                                                    
                                                                                   int i;                                                                                                                                                                                                                                                                                                                                       
                                                                                      if (SampleNumber >= 3)  {                                                                                                        
                                                                                              analogSamples[1] = (packet[11] << 8) | packet[12];
                                                                                              analogSamples[2] = (packet[13] << 8) | packet[14];
                                                                                              analogSamples[3] = (packet[15] << 8) | packet[16];
                                                                                                              }
                                                                                      //else      {
                                                                                               //          Serial.println("Error");
                                                                                        //         }                                                                                 
                                                                                                 int reading = analogSamples[1];  
                                                                                                 int reading_2 = analogSamples[2];
                                                                                                 int reading_3 = analogSamples[3];
                                                                                                                  float v =((float) reading)*330/1024;  
                                                                                                                  float z =((float) reading_2)*330/1024;
                                                                                                                  float d =((float) reading_3)*330/1024;
                                                                                                                  int l=dataLength+4;
                                                                                                                  
                                                                                                                  
                                                                                                                  for(int i=0;i < l;i++) {
    if (packet[i] < 0xF) {
      // print leading zero for single digit values
     //Serial.print(0);
    }
    client.print(packet[i], HEX);
    //Serial.print(" ");
  }
  //Serial.println("");
                                                                                                                  client.print("Module ");
                                                                                                                  client.println(moduleID);
                                                                                                                  client.print("data: ");
                                                                                                                  client.print("Temperature 1: ");
                                                                                                                  client.println(v);
                                                                                                                  client.print("Temperature 2: ");
                                                                                                                  client.println(z);
                                                                                                                  client.print("Temperature 3: ");
                                                                                                                  client.println(d);
                                                                                                                  client.println();
                                                                                                                  client.println();  
                                                                                                 } 
                                                                                                                                                                              }
                                                                                    
                                             }   
          break;
     } 
                      
     if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
                }
              }
            }  
    // give the web browser time to receive the data
    delay(1000);
    // close the connection:
        client.stop();
      }

  }
 void printPacket(int l) {
  
}
int readByte() {         // prog pour lire les données sur le port série. il renvoie la valeur serial.read
  while (true) {						// si le port série est dispo et a une information
    if (Serial.available() > 0) {
      return Serial.read();
    }
  }
}

Tu cherche a tout faire en même temps
Ce n'est pas une bonne idée

Tu as des évènements asynchrone : d'une part les trames qui arrivent des Xbee, et d'autre par les requètes des utilisateurs

Dans ta boucle gère cela séparément :

  • Si tu a des trames a recevoir, récupère, dépile et stocke dans une variable globale (par exemple inte Temperatures[NB_CAPTEURS])
  • Si tu a s une requete web, génère la page

Yop yop,
Pas tout compris mais

Quelques remarques :

  • l'indentation je sais pas si ça vient du copier coller mais sinon va falloir mettre tout ça au propre. :~
  • la lecture du port serie en même temps qu'une réception sur le shield eth ?
  • reprise de l'exemple server arduino pas top.
  • ta fonction bloquante readByte risqué.
  • des int pour traiter des valeurs hexadécimale qui ne dépasseront jamais 255 (juste de l'optimisation mémoire) ...

Conseils:

  • Nettoyer ton code (indentation).
  • Séparé réception ethernet et réception serial.
  • récupérer toute les données et traiter seulement après.
  • Au cas ou particularité arduino, voir loop comme une boucle infinie (en fait il s'agit d'une fonction dans une boucle infinie).

D'accord je comprends, parce que le code que je vous ai envoyé n'est qu'un bout du code. Je fais communiquer qu'un seul xbee (API) que je décode avec le receveur et l'arduino. Si je reçois l'octet traitant la longueur de la trame (commande AT) alors je récupére et stocke tous les autres octets et je convertis ce qui m'intéresse.

Si j'ai bien compris d'abord je recupére la trame, je décode je stocke dans une variable? et par la suite je fais la requête du serveur web?

Je pensais que faire la requête et recevoir la trame à traiter pouvait se faire...c'est pour cela qu'il répond au début mais après mon serveur ne reçoit plus rien...

Je ne sais pas comment fonctionne ton système capteur de température+xbee, envoie de valeurs à la demande ou toute les x min, sec ?
Dans le premier cas tu peux faire lecture et traitement éventuel de la requête html (sans fermé la connexion), tu demandes la valeurs temp+xbee (dans un delay raisonnable), tu introduits la valeurs reçue dans le code html de retour et tu envois, enfin tu fermes la connexion.
Dans le deuxième cas à chaque réception de valeurs tu la (les) stockes dans une variable globale (variable en dehors de tout block {} généralement déclaré en début de code ) et lors d'une requête html tu introduis cette valeurs stockée dans la variable globale dans le code html de réponse.
Chaque actions séparément et pas l'un dans l'autre.

J'utilise un xbee en émetteur par exemple avec des capteurs de températures en entrée analogique du xbee. J'envoi donc donc une commande AT a un receveur et avec un arduino je décode la trame reçue. Ensuite, j'utilise un autre xbee émetteur avec une adresse différente avec des capteurs de température en entrée analogique de ce xbee. J'ai donc crée un petit réseau. Le receveur va donc recevoir soit une trame du xbee 1, soit la trame du xbee 2. soit je récupère les températures du xbee 1 soit celles du xbee 2. Sur le serial monitor d'arduino j'ai bien le loop qui me fait afficher soit une trame soit l'autre.

Les xbees sont programmés pour envoyer une trame toutes les secondes au receveur a la vitesse 9600 bauds.

Maintenant reste à afficher soit la trame 1 ou 2 (sachant que je ne reçois pas régulièrement l'un et après l'autre c'est à dire que je peux recevoir 5 fois la même trame ensuite la trame 2 etc ce n'est pas régulier) sur Internet, sur une page Web pour pouvoir solliciter ce serveur et stocker ces données.

Le code revient à faire çà du coup, je crée un sous programme qui lit la liaison série (readpacket()) et je stocke les paquets qui m’intéressent dans une variable locale temp*?*

```
*#include <SPI.h>
#include <Ethernet.h>
#define NB_CAPTEUR 3
#define NB_SAMPLE 3
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x0F };
IPAddress ip(192,168,1, 110);

int packet[32];
int analogSamples[NB_SAMPLE];
int temp[NB_CAPTEUR];
EthernetServer server(80);

void setup()
{
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  delay(1);
  //Serial.print("Starting..........");
  //Serial.println();
}

void loop()
{
EthernetClient client = server.available();
  if (client) {
                    boolean currentLineIsBlank = true;
                    while (client.connected()) {
                      if (client.available()) {
                          char c = client.read();
                              if (c == '\n' && currentLineIsBlank) {
                                    client.println("HTTP/1.1 200 OK");
                                    client.println("Content-Type: text/html");
                                    client.println();
                                      // client.print("helllo");
         
          readpacket();
          int i;         
          for(i=1; i<=NB_CAPTEUR; i++){                                                 
          temp[i]=analogSamples[i]*330/1024;
          client.print(temp[i]);
          }
          break;
    }
                     
    if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
                }
              }
            } 
    // give the web browser time to receive the data
    delay(1000);
    // close the connection:
        client.stop();
      }

}
void readpacket()
{
      if (Serial.available() > 0) {

int b = Serial.read();
                                              if (b == 0x7E) {
                                                  packet[0] = b;                         
                                                  packet[1] = readByte();
                                                  packet[2] = readByte();
                                                  int dataLength = (packet[1] << 8) | packet[2]; 
                                                        //if (dataLength==0x1A) {     
                                                          for(int i=1;i<=dataLength;i++) {
                                                                  packet[2+i] = readByte();             
                                                                                          }
                                                                              int apiID = packet[3];               
                                                                              int moduleID;                                 
                                                                              if (apiID == 0x83) {                                                                                                               
                                                                                  moduleID = (packet[4] << 8) | packet[5];
                                                                                  int SgnlPwr = packet[6];
                                                                                  int SampleNumber = packet[8];                                                                                                                   
                                                                                  int i;                                                                                                                                                                                                                                                                                                                                     
                                                                                      if (SampleNumber >= 3)  {                                                                                                       
                                                                                              analogSamples[1] = (packet[11] << 8) | packet[12];
                                                                                              analogSamples[2] = (packet[13] << 8) | packet[14];
                                                                                              analogSamples[3] = (packet[15] << 8) | packet[16];
                                                                                                              }
                                                                                          }
                                                                                                  int l=dataLength+4;
                                                                                                      for(int i=0;i < l;i++) {
                                                                                                            if (packet[i] < 0xF) {
                                                                                                                             
                                                                                                                      Serial.print(packet[i], HEX);
   
                                                                                                                                            }
                                                                                                      }
                                                                                                    }
                                              } 
                                            }

int readByte() {        // prog pour lire les données sur le port série. il renvoie la valeur serial.read
  while (true) { // si le port série est dispo et a une information
    if (Serial.available() > 0) {
      return Serial.read();
    }
  }
}*
```

C'est perso mais je trouve ton indentation pour être pas polis dégueulasse :grin: , c'est inlisible on s'y retrouve pas.
Par exemple :

void loop()
{
EthernetClient client = server.available();
  if (client) 
  {
      boolean currentLineIsBlank = true;
      while (client.connected()) 
      {
        if (client.available()) 
        {
            char c = client.read();
             if (c == '\n' && currentLineIsBlank) 
             {
               client.println("HTTP/1.1 200 OK");
               client.println("Content-Type: text/html");
               client.println();
                // client.print("helllo");
               readpacket(); 
               int i;          
               for(i=1; i<=NB_CAPTEUR; i++){                                                  
               temp[i]=analogSamples[i]*330/1024;
               client.print(temp[i]);
            }
          break;
         } 
                      
         if (c == '\n') 
         {
              // you're starting a new line
              currentLineIsBlank = true;
          } 
          else if (c != '\r') 
          {
              // you've gotten a character on the current line
              currentLineIsBlank = false;
          }
        }
      }  
      // give the web browser time to receive the data
      delay(1000);
      // close the connection:
      client.stop();
    }
}

C'est quand même plus lisible.

Sinon niveau code, c'est toujours pas ça, tu inclus toujours ton relevé en même temps qu'une requête, tu peux faire ta lecture serie en dehors de ton block "while (client.connected())" puisque tu stockes ta valeurs dans une variable globale.
Un relevé toute les seconde c'est un peux short comme timing, tu peux pas faire toute les 5 sec ou même 1 minute ?

Oui j'avoue moi-même je trouve illisible mais le code et moi ça fait deux ! :confused: faut s'y mettre !! :slight_smile:
Oui je comprends, je vais essayer de sortir la variable globale de la requête.
Oui je peux paramétrer mes xbee en valeur hexa suivant la valeur de pas souhaité !

Cela revient à faire çà ? :

void loop()
{
EthernetClient client = server.available();
  if (client) 
    {
     boolean currentLineIsBlank = true;
     readpacket(); 
     while (client.connected()) 
            {
             if (client.available()) 
               {
                char c = client.read();
                if (c == '\n' && currentLineIsBlank) 
                  {
                  client.println("HTTP/1.1 200 OK");
                  client.println("Content-Type: text/html");
                  client.println();
                  int i;          
                  for(i=1; i<=NB_CAPTEUR; i++)
                     {                                                  
                     temp[i]=analogSamples[i]*330/1024;
                     client.print(temp[i]);
                     delay(1); 
                     }
                  break;
                  }
                  if (c == '\n') 
                    {
                    currentLineIsBlank = true;
                    }  
                    else if (c != '\r') 
                      {
                      // you've gotten a character on the current line
                      currentLineIsBlank = false;
                      }
               }
            }  
    // give the web browser time to receive the data
    delay(1000);
    // close the connection:
    client.stop();
    } 
}

Tu peux même le sortir du block "if (client) " j'avais pas fais attention, vraiment bien séparé la partie réception eth et serie.
Pour la réception série tu reçois une valeurs ou toute une trame ? Comment sait-tu qui a envoyer quoi ?
Parce que

int readByte() 
{ 
  while (true) 
  {						
    if (Serial.available() > 0) 
    {
      return Serial.read();
    }
  }
}

Ne renvoie jamais qu'un octet (unsigned char), tu peux directement faire la lecture dans le loop "if (Serial.available() > 0) " en dehors de la requête, par contre ça peux encore être un peux différent pour la lecture de plusieurs octet si la trame en est composé de plusieurs, là il faudra d'abord reconstruire la trame .
Entre () encore une bizarrerie du core arduino, la signature de read() donne un int (2 octet) en retour mais dans le code retourne un unsigned char (ce qu'il devrait retourné naturellement vu que udr le registre tempon du port série ne fait qu'1 octet) ...

Pour le calcul "temp=analogSamples_330/1024;" tu risque d'avoirs des valeurs tronquée en un entier vu que temp est de type entier int, peut être directement faire le calcul à la réception aussi ?_
Bien indenté comme je l'aime :grin: .
_
```*_
*void loop()
{
 if (Serial.available() > 0) //le reste sans doute pas comme ça ou while pour lire plusieurs octet ????
 {
    analogSamples[?] = Serial.read()*330/1024; ///1 seul fois ????
 }

EthernetClient client = server.available();
 if (client)
 {
   boolean currentLineIsBlank = true;
       
   while (client.connected())
   {
     if (client.available())
     {
       char c = client.read();
       if (c == '\n' && currentLineIsBlank)
       {
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println();
               
         for(int i=1; i<=NB_CAPTEUR; i++)
         {                                                  
           client.print(temp[i]); //on ne fais qu'affiché les valeurs stockées lors de la denière lecture.
           client.print(' '); // ajout d'un petit espace ou '\n ' pour un passage à la ligne ?
           delay(1);
         }
           break;
       }
       if (c == '\n')
       {
         currentLineIsBlank = true;
       }  
       else if (c != '\r')
       {
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }  
   // give the web browser time to receive the data
   delay(1000);
   // close the connection:
   client.stop();
 }
}
_
```*_
A mon avis sauf si tu fais une requête html toute les seconde tu peux régler un delay d'1 minute entre mesures.

Tu peux même le sortir du block "if (client) " j'avais pas fais attention, vraiment bien séparé la partie réception eth et serie.
Pour la réception série tu reçois une valeurs ou toute une trame ? Comment sait-tu qui a envoyer quoi ?
Parce que

Pour la réception série, je reçois toute un trame alors si j'ai plusieurs xbee en réseau, je vais recevoir plusieurs trames de xbee avec leur propre adresse. Pour l'instant je fais qu'un test avec un seul xbee et un xbee en reception + arduino.
Pour les différencier vu que l'adresse est : 0x01 0x02 ou 0x03 suivant le nombre de xbee, je ferais une condition du style si la trame a l'adresse 1 il fait ça sinon si adresse 2 il fait çà sinon si adresse 3 il fait ça.

Ne renvoie jamais qu'un octet (unsigned char), tu peux directement faire la lecture dans le loop "if (Serial.available() > 0) " en dehors de la requête, par contre ça peux encore être un peux différent pour la lecture de plusieurs octet si la trame en est composé de plusieurs, là il faudra d'abord reconstruire la trame .
Entre () encore une bizarrerie du core arduino, la signature de read() donne un int (2 octet) en retour mais dans le code retourne un unsigned char (ce qu'il devrait retourné naturellement vu que udr le registre tempon du port série ne fait qu'1 octet) ...

Pour le calcul "temp=analogSamples*330/1024;" tu risque d'avoirs des valeurs tronquée en un entier vu que temp est de type entier int, peut être directement faire le calcul à la réception aussi ?

non parce que je rçois une trame en octet et je récupère le packet en héxa qui m'intéresse la conversion ne peut se faire que sur arduino à moins que je mette analogSamples en float?

Voici le type de trame d'un xbee par exemple :

7E 00 0A 83 56 78 32 00 01 02 00 00 69 77

56 78 : adresse du xbee
00 69 valeur qui m'interesse c'est cette valeur la ou je récupérerais ma température
00 0A : longueur de la trame
83 : mode API
32 : force du signal
00 01 : nombre de samples
77 : checksum

Voici le code pour décoder la trame

void readpacket()
  {
  if (Serial.available() > 0) 
    {
    int b = Serial.read();
    if (b == 0x7E) 
      {
        packet[0] = b;                           
        packet[1] = readByte();
        packet[2] = readByte();
        int dataLength = (packet[1] << 8) | packet[2];  
      //if (dataLength==0x1A)     
        for(int i=1;i<=dataLength;i++) 
          {
            packet[2+i] = readByte();               
          }
        int apiID = packet[3];                
        int moduleID;                                  
        if (apiID == 0x83) 
            {                                                                                                                 
              moduleID = (packet[4] << 8) | packet[5];
              int SgnlPwr = packet[6];
              int SampleNumber = packet[8];                                                                                                                    
              int i;                                                                                                                                                                                                                                                                                                                                       
              if (SampleNumber >= 3)  
                {                                                                                                        
                  analogSamples[1] = (packet[11] << 8) | packet[12];
                  analogSamples[2] = (packet[13] << 8) | packet[14];
                  analogSamples[3] = (packet[15] << 8) | packet[16];
                } 
                        
              for(i=1; i<=NB_CAPTEUR; i++)
                  {                                                  
                  temp[i]=((float)analogSamples[i])*330/1024;                
                  }                                                                                 
          
                  int l=dataLength+4;
                  for(int i=0;i < l;i++) 
                    {
                      if (packet[i] < 0xF) 
                        {
                          Serial.print(packet[i], HEX);
                        }
                    }
            }
      }
    }
  }
 
int readByte() 
  {         // prog pour lire les données sur le port série. il renvoie la valeur serial.read
    while (true) 
      {						// si le port série est dispo et a une information
        if (Serial.available() > 0) 
          {
            return Serial.read();
          }
      }
  }

Donc c'est bien ce qu'il me semblait, il faut que tu récupères toute la trame et ensuite que tu traites celle ci.

mika47:
non parce que je reçois une trame en octet et je récupère le packet en héxa qui m'intéresse la conversion ne peut se faire que sur arduino à moins que je mette analogSamples en float?

La valeurs à convertir ce fait sur 1 octet ou 2 octet, plus ?
Parce que la lecture sur le port serie ne se fait que sur 1 octet à la fois même s'il retourne un int de 2 octet (valeur hexa ou entière peux importe, 1 octet non signé c'est 0 -> 255 ou 0x00 -> 0xFF en représentation hexadécimale).
Sauf si tu veux des valeurs entière je pense que tu devras passé analogSamples en float.

Edit de ton edit:
Oki c'est sur deux octet, donc récupéré le premier octet (LSB ?) le mettre dans le int, récupéré le deuxième octet (MSB ?) et opérer un décalage de 8 bit vers la gauche ( <<8 ) et l'ajouter au int.

int val = 0;
val = trame[11];
val += (trame[12]<<8);

La valeurs à convertir ce fait sur 1 octet ou 2 octet, plus ?
Parce que la lecture sur le port serie ne se fait que sur 1 octet même s'il retourne un int de 2 octet (valeur hexa ou entière peux importe, 1 octet non signé c'est 0 -> 255 ou 0x00 -> 0xFF en représentation hexadécimale).
Sauf si tu veux des valeurs entière je pense que tu devras passé analogSamples en float.

Tout dépend du nombre de capteurs en entrée :
1 capteur : 2 octets
2 capteurs : 4 octets
3 capteurs : 6 octets
etc
En prenant en compte l'octet non signé !

Je sais pas si tu as vu. :~

osaka:
Edit de ton edit:
Oki c'est sur deux octet, donc récupéré le premier octet (LSB ?) le mettre dans le int, récupéré le deuxième octet (MSB ?) et opérer un décalage de 8 bit vers la gauche ( <<8 ) et l'ajouter au int.

//uint8_t trame[] ou  unsigned char trame[] ou byte trame[] ça revient au même.

int val = 0;
val = trame[11];
val += (trame[12]<<8);

mika47:
Tout dépend du nombre de capteurs en entrée :
1 capteur : 2 octets
2 capteurs : 4 octets
3 capteurs : 6 octets
etc
En prenant en compte l'octet non signé !

Ah oki donc il va vraiment falloir s'occuper d'abord de récupéré toute la trame, parser les valeurs et les travaillé ensuite.

Cela revient à faire ce que je t'ai montré pour décoder la trame ? je t'ai mis le code plus haut...je ne sais pas si tu l'as vu? c'est void (readpacket())

Arf j'avais pas vu ton deuxième edit pour mettre le code ,on c'est croisé et passé en deuxième page. :sweat_smile:
Là où j'hésite dans ton code c'est la lecture et traitement synchronisé c'est pas spécialement mauvais et j'avais jamais pensé procédé de la sorte comme une boucle infinie "while(true)" est jugée à risque et tout dépend si ton code ne sert qu'a cela (relevé de temp) ou autre vaut mieux pas rester bloquer, donc moi je me serais assuré d'avoir toute la trame avant tout traitement.
Maintenant tu peux aussi sécurisé cette boucle en mettant un delay maximum de réception peut être ?

unsigned long delayMax = 0;

void loop()
{
   readpacket();
}

void readpacket()
{
  if (Serial.available() > 0) 
  {
      delayMax = millis()+50;
      .
      .
      .
      packet[1] = readByte();
      packet[2] = readByte();
      .
      .
      .
      
   }
}

uint8_t readByte() 
  {
    while (true) 
      {
	if(delayMax <= millis())
        {
            break;
        }
        if (Serial.available() > 0) 
        {
          return Serial.read();
        }
      }
    return 0;  
  }

Ok trés bien ! Pour un seul xbee ton delay Max me fait fonctionner l'affichage Web !! Un très bon point !! Maintenant, il reste à faire afficher 2 xbees en réseau !
Voici mon code pour deux xbee en réseau avec un receveur, il voit un seul xbee mais pas le deuxième...
Merci en tout cas pour ton aide !

#include <SPI.h>
#include <Ethernet.h>
//#define NB_CAPTEUR 3
//#define NB_SAMPLE 3
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x0F };
IPAddress ip(192,168,1, 110);


unsigned long delayMax = 0;
int packet[32];
int analogSamples[3];
int dataLength[10];
float v[5];
float z[1];
//int temp[NB_CAPTEUR];
EthernetServer server(80);

void setup()
{
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  delay(1);
  //Serial.print("Starting.........."); 
  //Serial.println(); 
}

void loop()
{

  readpacket();
  EthernetClient client = server.available();
  
  if (client) 
    {
       boolean currentLineIsBlank = true; 
       while (client.connected()) 
         {
           if (client.available()) 
             {
               char c = client.read();
               if (c == '\n' && currentLineIsBlank) 
                 {
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println();
                    if (dataLength[1]==0x1A)
                     {
                    
                        client.println(v[1]); //on ne fais qu'affiché les valeurs stockées lors de la denière lecture.
                        client.println(v[2]);
                        client.println(v[3]);
                        client.println();
                     }
                     else if (dataLength[1]==0x0A)
                     {
                        client.print(z[1]); // ajout d'un petit espace ou '\n ' pour un passage à la ligne ?
                     }                 
                  break;
                 }
             
             if (c == '\n') 
               {
                 currentLineIsBlank = true;
               }  
               else if (c != '\r') 
               {
                  // you've gotten a character on the current line
                  currentLineIsBlank = false;
               }
         }
    } 
    // give the web browser time to receive the data
    delay(500);
    // close the connection:
    client.stop();
    }   
}
void readpacket()
  {
  if (Serial.available() > 0) 
    {
    delayMax = millis()+50;
    int b = Serial.read();
    if (b == 0x7E) 
      {
        packet[0] = b;                           
        packet[1] = readByte();
        packet[2] = readByte();
        dataLength[1] = (packet[1] << 8) | packet[2];  
      if (dataLength[1]==0x1A)
       {     
        for(int i=1;i<=dataLength[1];i++) 
          {
            packet[2+i] = readByte();               
          }
        int apiID = packet[3];                
        int moduleID;                                  
        if (apiID == 0x83) 
            {                                                                                                                 
              moduleID = (packet[4] << 8) | packet[5];
              int SgnlPwr = packet[6];
              int SampleNumber = packet[8];                                                                                                                    
              int i;                                                                                                                                                                                                                                                                                                                                       
              if (SampleNumber >= 3)  
                {                                                                                                        
                  analogSamples[1] = (packet[11] << 8) | packet[12];
                  analogSamples[2] = (packet[13] << 8) | packet[14];
                  analogSamples[3] = (packet[15] << 8) | packet[16];
                } 
                 int reading = analogSamples[1];  // On lit la valeur de la broche  19
                 int reading_2 = analogSamples[2];
                 int reading_3 = analogSamples[3];
      // On converti la valeur lue  en millivolts
                 v[1] =((float) reading)*335/1024;  //la valeur renvoyée ( 2 bits)  dans le paquet représente une valeur entiere sur une échelle de 0 à 1023 (0x0 - 0x3FF)
                 v[2] =((float) reading_2)*335/1024;
                 v[3] =((float) reading_3)*335/1024;       
              //for(i=1; i<=NB_CAPTEUR; i++)
                  //{                                                  
                  //temp[i]=((float)analogSamples[i])*330/1024;                
                  //}                                                                                 
                  int l=dataLength[1]+4;
                  for(int i=0;i < l;i++) 
                    {
                      if (packet[i] < 0xF) 
                        {
                          Serial.print(packet[i], HEX);
                        }
                    }
            }
            else if (dataLength[1]==0x0A)
            {
              for(int i=1;i<=dataLength[1];i++) 
                {
                  packet[2+i] = readByte();               
                }
             int apiID = packet[3];                
             int moduleID;
             if (apiID == 0x83) 
               {
                 moduleID = (packet[4] << 8) | packet[5];
                 int SgnlPwr = packet[6];
                 int SampleNumber = packet[8];
                 if (SampleNumber >= 1)  
                   {
                    analogSamples[1] = (packet[11] << 8) | packet[12];
                    //analogSamples[2] = (packet[13] << 8) | packet[14];
                    //analogSamples[3] = (packet[15] << 8) | packet[16];
                   }
        	int reading_4 = analogSamples[1];
                z[1] =((float) reading_4)*310/1024;
               }
            }
       }
      }
    }
  }
  
 
  
 uint8_t readByte() 
  {
    while (true) 
      {
	if(delayMax <= millis())
        {
            break;
        }
        if (Serial.available() > 0) 
        {
          return Serial.read();
        }
      }
    return 0;  
  }
//int readByte() 
//  {         // prog pour lire les données sur le port série. il renvoie la valeur serial.read
//    while (true) 
//      {						// si le port série est dispo et a une information
//        if (Serial.available() > 0) 
//          {
//            return Serial.read();
//          }
//      }
//  }

mika47:
Ok trés bien ! Pour un seul xbee ton delay Max me fait fonctionner l'affichage Web !! Un très bon point !!

Arf ça doit signifié que ça bloque quelque part dans ta lecture, soit rien n'arrive, soit pas de lecture au bon moment.
Je suis toujours d'avis qu'il faudrait d'abord réceptionner toute la trame et traiter après.
D'ailleurs il faudrait que tu testes réception xbee et requête html séparément dans 2 code séparer histoire d'être certain qu'ils sont fonctionnel indépendamment, après tu peux faire ton code définitifs.
Donc:
-Un fichier test shield eth (fonctionne déjà normalement).
-Un fichier test reception xbee.
-Un fichier test traitement (avec des valeurs fictive de réception xbee, mais trame ok comme elle devrait être).
-un fichier final eth shield et reception xbee avec traitement.
C'est lourd mais ça peux faire gagner en temps, debug et clarté.