[RESOLU] Lecture Carte SD et envoie Data serveur PHP

Re,
me voici avec un nouveau soucis ....

le but du code suivant est de lire les données de tous les fichiers d'une carte SD et d'envoyer ensuite les données lues à un serveur Php pour alimenter une base de données.

La partie lecture des fichiers sur la carte SD fonctionne impec toute seule, et la partie envoie des données au serveur Php fonctionne aussi car je l'utilise dans un autre code.

Sauf que lorsque je mets les deux (lecture carte SD + Envoie des données au serveur PHP) dans le même code et bien rien ne se passe ...

#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD
#include <Ethernet.h>
#include <SPI.h> 
File myDir; // objet file 
File myFile;
int numTabs = 0;
boolean test=false; 
EthernetClient client;
IPAddress srvphp(192, 168, 0, 135); // Adresse IP serveur perso PHP
IPAddress ip(192, 168, 0, 35);
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };

void setup()
{
char data[3000];
  char LectSDcaractere;
  char LectSDnbreimpulsion[50];
  char LectSDduree[50];
  char LectSDheure[50];
  char LectSDminut[50];
  char LectSDsec[50];
  char LectSDjour[50];
  char LectSDmois[50];
  char LectSDannee[50];
  char LectSDmot[50];
  char LectSDsolaire[50];
  int i = 0;
  int j = 0;
  Serial.begin(115200); // utiliser le meme debit coté Terminal Serie
  Ethernet.begin(mac, ip);

  //----- initialisation de la carte SD ----- 
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(4); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire 

  myDir = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Operation Terminee!");

  } // fin si initialisation réussie







   while(true) { // tant que vrai = crée une "loop" qui séxécute tant que contenu
   // la sortie se fait par break;

     File entry =  myDir.openNextFile(); // ouvre le fichier ou repertoire suivant

     if (! entry) { // si aucun nouveau fichier /repertoire

       //Serial.println("** pas d'autre fichier ou repertoires**");
       break; // sort de la fonction 

     } // fin si aucun nouveau fichier / répertoire

     // affiche le nombre de tab voulu - 0 si racine, 1 si sous Rép, 2 si sous-sous rép, etc..
     for (int i=0; i<numTabs; i++) {
       Serial.print('\t');
     }

     Serial.println(entry.name()); // affiche le nom du fichier/repertoire
      
entry.close();



  // re-open the file for reading:
  myFile = SD.open(entry.name());
  if (myFile) {
    Serial.println(entry.name());

    LectSDcaractere = (myFile.read());
    data[i] = LectSDcaractere;

    // read from the file until there's nothing else in it:
    while (myFile.available()) {

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDnbreimpulsion[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDnbreimpulsion[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDnbreimpulsion[j] = '\0';
        Serial.print(LectSDnbreimpulsion);
      }


      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDduree[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDduree[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDduree[j] = '\0';
        Serial.print(LectSDduree);


      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDheure[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDheure[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDheure[j] = '\0';
        Serial.print(LectSDheure);
      }


      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDminut[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDminut[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDminut[j] = '\0';
        Serial.print(LectSDminut);


      }



      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDsec[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDsec[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDsec[j] = '\0';
        Serial.print(LectSDsec);
      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDjour[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDjour[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDjour[j] = '\0';
        Serial.print(LectSDjour);
      }

      if (LectSDcaractere == (';')) {
        //  Serial.print("ca marche");
        j = 0;
        i = 0;
        LectSDmois[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDmois[j] = LectSDcaractere;
          // Serial.write(data[i]);
          // Serial.print("idem");
          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDmois[j] = '\0';
        Serial.print(LectSDmois);
      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDannee[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDannee[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDannee[j] = '\0';
        Serial.print(LectSDannee);


      }
    //	Serial.write(data[i]);
    }

    // close the file:
    myFile.close();
    
    
    
   
      
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
   } // fin while(true)


 if (client.connect(srvphp, 80)) {
    char reqhttp[100];
    
    Serial.println("connected srvphp");
    // Make a HTTP request:
    sprintf( reqhttp, "GET /solaire/txp2.php?nom_inst=Dupont&date_prod=%04d%02d%02d%02d%02d%02d&prod=%05d&commentaires=arduino HTTP/1.0",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
    client.println(reqhttp);
    client.println();
    Serial.println(F("Fin envoie srvphp"));
    client.stop();
    } 



} // fin setup()  

void loop(){



}

Bonjour,

La carte c'est une mega ou une uno ?

Parce que le coup du buffer de 3.5Ko de char c'est franchement pas une bonne idée !
(2Ko de RAM sur la UNO, 8Ko de RAM sur la mega 2560)

Un seul buffer de char bien dimensionné (disons 30 char) et une série de boucle + sscanf() suffiraient largement ...

Bonjour,

C'est une carte UNO.
alors j'ai réduit un peu tous les Char et cela tourne en effet bcp mieux :slight_smile:
par contre je n'arrive tjrs pas à envoyer vers mon serveur Php
j'ai repris ton exemple de syntaxe

client.println(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
sprintf( reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
client.println(reqhttp);
client.println(F("&commentaires=arduino HTTP/1.0"));

La console m'indique bien qu'il passe dans la boucle de transfert vers mon serveur Php mais je n'ai aucune entrée qui se fait dans la BDD.
J'ai essayé de bricoler l'envoie de la requete en la mettant "en dur" mais pas mieux ... alors que cette requete directement dans mon navigateur fonctionne
http://192.168.0.135/solaire/txp2.php?nom_inst=Dupont&date_prod=20121212121212&prod=674122&commentaires=ip

PITP2:
La console m'indique bien qu'il passe dans la boucle de transfert vers mon serveur Php mais je n'ai aucune entrée qui se fait dans la BDD.
J'ai essayé de bricoler l'envoie de la requete en la mettant "en dur" mais pas mieux ... alors que cette requete directement dans mon navigateur fonctionne
http://192.168.0.135/solaire/txp2.php?nom_inst=Dupont&date_prod=20121212121212&prod=674122&commentaires=ip

7
Oups, j'ai oublié de supprimer deux ...ln au niveau des println() :blush:

client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
sprintf( reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05d",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
client.print(reqhttp);
client.println(F("&commentaires=arduino HTTP/1.0"));

Yes , j'avais vu la boulette en essayant de faire marcher mon code en fin d'après midi.
Ceci dit cela ne donne pas satisfaction , tjrs aucune nouvelle entrée dans ma BDD

j'ai ajouté un printl de rqhtt et là c'est le drame !
voila ce que j'ai dans le terminal
la valuer de rqhttp est tjrs celle là 210221002098209220942096&prod=

alors que j'affiche bien les valeurs de chacune des varaibles qui elles changent
0;46087103;9;37;29;17;12;2012;
51;1250110;14;48;41;17;12;2012;

que passa :0

Initialisation de la SD card...
Initialisation reussie !
Operation Terminee!
TEST.TXT
0;46087103;9;37;29;17;12;2012;
connected srvphp
Fin envoie srvphp
210221002098209220942096&prod=
12171448.TXT
51;1250110;14;48;41;17;12;2012;
connected srvphp
Fin envoie srvphp
210221002098209220942096&prod=
12171450.TXT
53;1376135;14;50;47;17;12;2012;
connected srvphp
Fin envoie srvphp
210221002098209220942096&prod=

Il manquait un d à la fin du prod=%05 (copier/coller foireux).

Sinon ce serait possible d'avoir le nouveau code complet histoire de voir ce qui plante ? :wink:

Avec plaisir :slight_smile:

et j'ai mis en pièce jointe les fichiers .txt que j'utilise pour mes tests

Merci pour ton aide

#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD
#include <Ethernet.h>
#include <SPI.h> 
File myDir; // objet file 
File myFile;
int numTabs = 0;
boolean test=false; 
EthernetClient client;
IPAddress srvphp(192, 168, 0, 135); // Adresse IP serveur perso PHP
IPAddress ip(192, 168, 0, 35);
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };

void setup()
{

  Serial.begin(115200); // utiliser le meme debit coté Terminal Serie
  Ethernet.begin(mac, ip);

  //----- initialisation de la carte SD ----- 
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(4); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire 

  myDir = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Operation Terminee!");

  } // fin si initialisation réussie







   while(true) { // tant que vrai = crée une "loop" qui séxécute tant que contenu
   // la sortie se fait par break;

     File entry =  myDir.openNextFile(); // ouvre le fichier ou repertoire suivant

     if (! entry) { // si aucun nouveau fichier /repertoire

       //Serial.println("** pas d'autre fichier ou repertoires**");
       break; // sort de la fonction 

     } // fin si aucun nouveau fichier / répertoire

     // affiche le nombre de tab voulu - 0 si racine, 1 si sous Rép, 2 si sous-sous rép, etc..
     for (int i=0; i<numTabs; i++) {
       Serial.print('\t');
     }

     // Serial.println(entry.name()); // affiche le nom du fichier/repertoire
      
entry.close();

char data[50];
  char LectSDcaractere;
  char LectSDnbreimpulsion[10];
  char LectSDduree[20];
  char LectSDheure[2];
  char LectSDminut[2];
  char LectSDsec[2];
  char LectSDjour[2];
  char LectSDmois[2];
  char LectSDannee[4];
  char LectSDmot[50];
  char LectSDsolaire[50];
  int i = 0;
  int j = 0;

  // re-open the file for reading:
  myFile = SD.open(entry.name());
  if (myFile) {
    Serial.println(entry.name());

    LectSDcaractere = (myFile.read());
    data[i] = LectSDcaractere;

    // read from the file until there's nothing else in it:
    while (myFile.available()) {

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDnbreimpulsion[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDnbreimpulsion[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDnbreimpulsion[j] = '\0';
        
        Serial.print(LectSDnbreimpulsion);
      }


      if (LectSDcaractere == (';')) {
        j = 0;
        i = 0;
        LectSDduree[0] = '\0';
        
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDduree[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDduree[j] = '\0';
        Serial.print(LectSDduree);


      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDheure[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDheure[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDheure[j] = '\0';
        Serial.print(LectSDheure);
      }


      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDminut[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDminut[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDminut[j] = '\0';
        Serial.print(LectSDminut);


      }



      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDsec[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDsec[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDsec[j] = '\0';
        Serial.print(LectSDsec);
      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDjour[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDjour[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDjour[j] = '\0';
        Serial.print(LectSDjour);
      }

      if (LectSDcaractere == (';')) {
        //  Serial.print("ca marche");
        j = 0;
        i = 0;
        LectSDmois[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDmois[j] = LectSDcaractere;
          // Serial.write(data[i]);
          // Serial.print("idem");
          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDmois[j] = '\0';
        Serial.print(LectSDmois);
      }

      if (LectSDcaractere == (';')) {

        j = 0;
        i = 0;
        LectSDannee[0] = '\0';
        do 
        { 
          LectSDcaractere = (myFile.read());
          data[i] = LectSDcaractere;
          LectSDannee[j] = LectSDcaractere;

          i++;
          j++;
        } 
        while ((LectSDcaractere != (';')) && (myFile.available()));
        LectSDannee[j] = '\0';
        Serial.print(LectSDannee);


      }
    //	Serial.write(data[i]);
    }
 
    // close the file:
    myFile.close();
    
 if (client.connect(srvphp, 80)) {
    char reqhttp[50] ;
    
    Serial.println("connected srvphp");
    // Make a HTTP request:
   client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
    sprintf( reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
    client.print(reqhttp);
    client.println(F("&commentaires=arduino HTTP/1.0"));
    Serial.println(F("Fin envoie srvphp"));
    Serial.println(reqhttp);
    client.stop();
    }    
    

      
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
   } // fin while(true)






} // fin setup()  

void loop(){



}

12171448.TXT (34 Bytes)

12171450.TXT (34 Bytes)

test.TXT (33 Bytes)

Je vois ... ça va pas du tout ... :wink:

  • Il reste toujours plusieurs buffer ... un seul suffit.
  • Toutes les boucles pourrait être remplacé par un unique sscanf().
  • Faire un sprintf %d d'un tableau de char est une erreur (la variable DOIT être un int, d'où le problème)

Voici un exemple "propre" à adapter (remplacer $ par ; pour le délimiteur de début, changer les champs à extraire, ...) :

Un peu de doc sur sscanf() et sprintf() :
http://www.cplusplus.com/reference/cstdio/sprintf/
http://www.cplusplus.com/reference/cstdio/sscanf/

Merci pour la doc je regarde cela ce soir et demain et j'espère me sortir de ce bourbier :slight_smile:

Bon et bien voila un code qui fonctionne, j'espère qu'il te plaira plus que le précédent :slight_smile:

#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD
#include <Ethernet.h>
#include <SPI.h>


File myDir; // objet file 
File myFile;
int numTabs = 0;
boolean test=false; 
EthernetClient client;
IPAddress srvphp(192, 168, 0, 135); // Adresse IP serveur perso PHP
IPAddress ip(192, 168, 0, 35);
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };
//char data[50];
char LectSDcaractere[50];
unsigned long LectSDnbreimpulsion;
unsigned long LectSDduree;
byte LectSDheure;
byte LectSDminut;
byte LectSDsec;
byte LectSDjour;
byte LectSDmois;
int LectSDannee;



void setup()
{

  Serial.begin(115200); // utiliser le meme debit coté Terminal Serie
  Ethernet.begin(mac, ip);

  //----- initialisation de la carte SD ----- 
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(4); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

    //----- affiche le contenu du répertoire 

    myDir = SD.open("/"); // ouvre la SD Card à la racine

    Serial.println("Operation Terminee!");

  } // fin si initialisation réussie


  while(true) { // tant que vrai = crée une "loop" qui séxécute tant que contenu
    // la sortie se fait par break;

    File entry =  myDir.openNextFile(); // ouvre le fichier ou repertoire suivant

    if (! entry) { // si aucun nouveau fichier /repertoire

      //Serial.println("** pas d'autre fichier ou repertoires**");
      break; // sort de la fonction 

    } // fin si aucun nouveau fichier / répertoire

    // affiche le nombre de tab voulu - 0 si racine, 1 si sous Rép, 2 si sous-sous rép, etc..
    for (int i=0; i<numTabs; i++) {
      Serial.print('\t');
    }

    // Serial.println(entry.name()); // affiche le nom du fichier/repertoire

    entry.close();


    int i = 0;
    int j = 0;

    // re-open the file for reading:
    myFile = SD.open(entry.name());
    if (myFile) {
      Serial.println(entry.name());
      while (myFile.available()) {


        LectSDcaractere[i] = (myFile.read());
        i++;
      }

    }
    Serial.println(LectSDcaractere);
    sscanf(LectSDcaractere, ";%d ;%*d ;%d ;%d ;%d ;%d ;%d ;%d", &LectSDnbreimpulsion,&LectSDheure,&LectSDminut,&LectSDsec,&LectSDjour,&LectSDmois,&LectSDannee);
    Serial.println(LectSDannee);
    Serial.println(LectSDmois);
    Serial.println(LectSDjour);
    Serial.println(LectSDheure);
    Serial.println(LectSDminut);
    Serial.println(LectSDsec);
    Serial.println(LectSDnbreimpulsion);
    myFile.close();

    // close the file:


    if (client.connect(srvphp, 80)) {
      char reqhttp[100] ;

      Serial.println("connected srvphp");
      // Make a HTTP request:
     // client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
     // sprintf( reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05d",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
     // client.print(reqhttp);
     // client.print(F("&commentaires=arduino HTTP/1.0"));
     // client.println();
      
      sprintf( reqhttp, "GET /solaire/txp2.php?nom_inst=Dupont&date_prod=%04d%02d%02d%02d%02d%02d&prod=%05d&commentaires=arduino HTTP/1.0",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
    client.println(reqhttp);
    client.println();
      
      Serial.println(F("Fin envoie srvphp"));
      Serial.println(reqhttp);
      client.stop();
     
    }    

    else {
      // if the file didn't open, print an error:
      Serial.println("error opening test.txt");
    }
  }

}// fin setup()  

void loop(){



}

par contre tu remarqueras que ca ne fonctionne pas

client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
     // sprintf( reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05d",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
     // client.print(reqhttp);
     // client.print(F("&commentaires=arduino HTTP/1.0"));
     // client.println();

alors que ca fonctionne mais je ne sais pas pourquoi .....

sprintf( reqhttp, "GET /solaire/txp2.php?nom_inst=Dupont&date_prod=%04d%02d%02d%02d%02d%02d&prod=%05d&commentaires=arduino HTTP/1.0",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
    client.println(reqhttp);
    client.println();

sinon merci pour ton aide :slight_smile:

Je me suis permis de reprendre ton code pour voir ce qui pouvait être amélioré :wink:

Quelques petites remarques :

  • pas besoin de booléen en variable globale pour tester l'initialisation de la carte sd
  • si ta carte sd plante au setup le code tombera quand même dans la boucle de traitement et fera n'importe quoi
  • pour faire une jolie boucle infini while(1) { } -> for( ; ; ) ; le compilateur ne fait pas de warning en utilisant cette syntaxe
  • c'est une impression mais on dirait qu'il reste des morceaux de copier/coller :grin:
  • il reste aussi des chaines de caractères sans F("..."), même si c'est pour grappiller 10 octets de RAM c'est toujours ça de gagné
  • tu ne test pas si ton "entry" est un fichier ou un dossier, met un dossier sur ta carte sd et normalement ton code va planter
  • de même la partie affichage des tabulations ne sert à rien car "numTabs" n'est jamais modifié
  • inutile de fermer puis de ré-ouvrir le fichier
  • la variable "j" n'est pas utilisé, de plus pas mal de variables globales pourraient être locales
  • dans ta boucle de remplissage du buffer prévois un test pour ne pas faire de buffer overflow
  • ton "else" au niveau du test de la connexion TCP affiche un message erroné

Pour le problème du sprintf + lot de print() je crois avoir compris, il faut deux \n pour clôturer une requête HTTP.

client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
sprintf(reqhttp, "%04d%02d%02d%02d%02d%02d&prod=%05d",LectSDannee,LectSDmois,LectSDjour,LectSDheure,LectSDminut,LectSDsec,LectSDnbreimpulsion);
client.print(reqhttp);
client.println(F("&commentaires=arduino HTTP/1.0")); // à mon avis ce println() manquant était la cause du soucis
client.println();

Voila ce que ça donne âpres être passé à la "skymoulinette" :grin:

/* ----- Dépendances ----- */
#include <SD.h>       /* Pour la carte SD */
#include <Ethernet.h> /* Pour la shield ethernet */
#include <SPI.h>      /* Pour la communication bas niveau (carte SD et ethernet) */

/** Taille du buffer pour la lecture du fichier texte et l'envoi de la requete HTTP */
static const byte BUFFER_SIZE = 50;

/** Adresse IP du serveur distant */
static IPAddress serverIp(192, 168, 0, 135);

/** Adresse IP de l'ethernet shield */
static IPAddress ip(192, 168, 0, 35);

/** Adresse MAC de l'ethernet shield */
static byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };

/** Objet File pointant sur le dossier "root" de la carte SD */
File rootDir;

/** Fonction d'initialisation hardware */
void setup() {

  /* Initialisation du port série */
  Serial.begin(115200);

  /* Initialisation de la shield ethernet */
  Ethernet.begin(mac, ip);

  /* Initialisation de la carte SD */
  Serial.print(F("Initialisation de la carte SD ... "));
  pinMode(10, OUTPUT); /* Obligatoire pour que la communication SPI fonctionne (10 UNO, 53 Mega)*/
  if (!SD.begin(4)) {  /* Broche "CS" de la carte SD sur D4 */
    Serial.println(F("Echec !"));
    for(;;);
  } 
  Serial.println(F("Ok !"));

  /* Ouverture du dossier "root" */
  rootDir = SD.open("/");
  Serial.println(F("Setup Termine !"));
}

/** Fonction de travail (appelé en boucle) */
void loop() {
  /* Buffer temporaire pour la lecture du fichier et la création de la requete HTTP */
  char buffer[BUFFER_SIZE];

  /* Variables contenant les résultats de la lecture du fichier texte */
  int nbImpulsions, heures, minutes, secondes, jours, mois, annees;

  /* Ouverture du prochain fichier disponible sur la carte SD */
  File entry =  rootDir.openNextFile();
  if (!entry) {
    Serial.println(F("Probleme d'ouverture ou plus de fichier disponible !"));
    for(;;);
    /* On pourrait aussi faire un rootDir.rewindDirectory() pour reprendre au 1er fichier */
  }

  /* Test pour savoir si il s'agit d'un répertoire */
  if(entry.isDirectory()) {
    /* Dans le cas d'un répertoire il est posible de faire un scan récursive.
     * Ici on ignore juste les dossiers */
    entry.close();
    return;
  }

  /* Affichage du nom du fichier en cours (pour debug) */
  Serial.print(F("Traitement de "));
  Serial.println(entry.name());

  /* Lecture des données du fichier */
  byte i = 0;
  while(entry.available() > 0) { /* Jusqu'a la fin du fichier */
    buffer[i] = entry.read(); /* Buffering */

    /* Test anti buffer-overflow */
    if(++i == BUFFER_SIZE) {
      Serial.println(F("Fichier trop gros !"));
      entry.close();
      return;
    }
  }

  /* Fermeture du fichier */
  entry.close();

  /* Pour debug */
  Serial.print(F("Buffer: "));
  Serial.println(buffer);

  /* Extraction des champs */
  if(sscanf(buffer, ";%d ;%*d ;%d ;%d ;%d ;%d ;%d ;%d", &nbImpulsions, &heures, &minutes, &secondes, &jours, &mois, &annees) != 7) {
    Serial.println(F("Fichier malforme !"));
    return;
  }

  /* Pour debug */
  Serial.print(F("Annees: "));
  Serial.println(annees);
  Serial.print(F("Mois: "));
  Serial.println(mois);
  Serial.print(F("Jours: "));
  Serial.println(jours);
  Serial.print(F("Heures: "));
  Serial.println(heures);
  Serial.print(F("Minutes: "));
  Serial.println(minutes);
  Serial.print(F("Secondes: "));
  Serial.println(secondes);
  Serial.print(F("Nb impulsions: "));
  Serial.println(nbImpulsions);

  /* Ouverture de la connexion TCP */
  EthernetClient client;
  Serial.print(F("Connexion au serveur ... "));
  if (!client.connect(serverIp, 80)) {
    Serial.println(F("Echec !"));
    return;
  }
  Serial.println(F("Ok !"));

  /* Envoi de la requete HTTP */
  sprintf(buffer, "%04d%02d%02d%02d%02d%02d&prod=%05d", annees, mois, jours, heures, minutes, secondes, nbImpulsions);
  client.print(F("GET /solaire/txp2.php?nom_inst=Dupont&date_prod="));
  client.print(buffer);
  client.println(F("&commentaires=arduino HTTP/1.0"));
  client.println();

  /* Fin de la requete HTTP */
  Serial.println(F("Fin envoi ..."));
  delay(10); /* Permet au serveur distant de recevoir les données avant de fermer la connexion*/
  client.stop();  
}

Bon et bien je viens d'utiliser ton code et en effet il fonctionne super ...
tu n'as pas honte de faire des codes aussi vite alors que j'ai passé l'après midi à bricoler le mien :0

En tout cas merci bcp !
je peux tager cela en RESOLU :slight_smile:

par contre pourquoi utiliser des variables locales plutot que globales ? (cela prend moins de mémoire ?)
Y a t il moyen de voir ce qu'il reste en RAM ?

PITP2:
Bon et bien je viens d'utiliser ton code et en effet il fonctionne super ...
tu n'as pas honte de faire des codes aussi vite alors que j'ai passé l'après midi à bricoler le mien :0

Et j'ai même pas de quoi tester le code, ça compile mais pour le reste faut faire jouer le cerveau pour trouver les possibles erreurs :grin:
C'est aussi ça l'effet IUT informatique, à force on apprend à coder vite (ou on dégage) :grin:

PITP2:
par contre pourquoi utiliser des variables locales plutot que globales ? (cela prend moins de mémoire ?)
Y a t il moyen de voir ce qu'il reste en RAM ?

Les variables globales sont stocké en ram à une adresse fixe lors de la compilation.
Les variables locales sont allouées / désallouées au grès de l'exécution du programme.

Utiliser des variables locales quand c'est possible ça évite :

  • de pas bouffer de la RAM inutilement
  • d'éviter les erreurs si plusieurs fonctions utilise une même variable
  • de rendre le code plus propre visuellement