Afficher tableau [7][2] sur Liaision Série

Bonjour,

J'aimerais savoir si quelqu'un connait le moyen d'afficher un tableau de 7 lignes et 2 colonnes sur le port série ??

mon code:

#include <SD.h>
#include <SPI.h>


File fichierlog;
static char buf[50]; // buffer pour la lecture de la linge
int ligne=0; // compteur pour la lecture de la ligne



// Pour chaque ligne du cycleur
char *p1; // Cellule 1
char *p2; // Cellule 2 pas besoin d'être séparé (soit N soit B)
char *p12; // Partie à gauche du "+"
char *p22; // Partie à droite du "+"
char *p121; // Partie à gauche du "=" à gauche du "+"
char *p122; // Partie à droite du "=" à gauche du "+"
char *p221; // Partie à gauche du "=" à droite du "+"
char *p222; // Partie à droite du "=" à droite du "+"



//********************************************************************************************************************
// déclaration des structures
      struct relai {
        int numRelai;  // numéro du relai
        int etatRelai;  // état du relai
      };
relai variable {0,0};
      



void setup() {
  
// déclaration du tableau
  int Etape[7][2] =  
  {0,0};
  


//********************************************************************************************************************              
              
              // Ouverture du port série 
               Serial.begin(9600);
               while (!Serial) {};

     
// -----------------------Initialisation de la carte SD------------------------------     
               Serial.print("Initialisation de la carte SD ...");

               if (!SD.begin(4)) {
                                    Serial.println("initialisation echouee !");
                                    return;
                                  }
               Serial.println("initialisation reussie.");



               
//------------------------Ouverture du fichier csv-----------------------------------
fichierlog = SD.open ("READTEST.csv", FILE_READ);




//----------------------Lecture du fichier csv ligne par ligne-----------------------
 while (fichierlog.available())
 {

   int i;
   for (i = 0; fichierlog.available() && i < sizeof buf - 1; i++)
   {
     buf[i] = fichierlog.read();
     if (buf[i] == '\n')
       break;                // fin de ligne
   }
   buf[i] = 0;               // fin de la chaine
   ligne++;



   
//--------------séparation des données d'une ligne (ici 3 données max)---------------
// Séparation des cellules
 p1=strtok(buf,";"); 
 p2=strtok(NULL,";");

    // Séparation au niveau du "+"
    p12=strtok(p1, "+");
    p22=strtok(NULL, ";");

         // Séparation de la partie a gauche du "+" au niveau du "="
         p121=strtok(p12, "=");
         p122=strtok(NULL,";");

              // Séparation de la partie a droite du "+" au niveau du "="
              p221=strtok(p22, "=");
              p222=strtok(NULL, ";");



       
//------------------Verification de la lecture et du découpage--------------------
 //Serial.println(p1); // Cellule 1
 //Serial.println(p2); // Cellule 2 pas besoin d'être séparé (soit N soit B)
 //Serial.println(p12); // Partie à gauche du "+"
 //Serial.println(p22); // Partie à droite du "+"
 //Serial.println(p121); // Partie à gauche du "=" à gauche du "+"
 //Serial.println(p122); // Partie à droite du "=" à gauche du "+"
 //Serial.println(p221); // Partie à gauche du "=" à droite du "+"
 //Serial.println(p222); // Partie à droite du "=" à droite du "+"



 
//---------------------conversion du numéro du 1er relai----------------------------
if (strcmp(p121,"R1")==0)
    variable.numRelai=1; // Si on lit R1, on affecte à numRelai la valeur 1
  else if (strcmp(p121,"R2")==0)
    variable.numRelai=2; // Si on lit R2, on affecte à numRelai la valeur 2
  else 
    variable.numRelai=0;  // Si on lit ni R1 ni R2, le numéro du relai est 0
 // Serial.println(variable.numRelai); // affiche le résultat de la conversion



  
//----------------------conversion de l'etat du 1er relai----------------------------
if (strcmp(p122,"ON")==0)
    variable.etatRelai=1; // si on lit ON, on affecte à etatRelai la valeur 1
  else if (strcmp(p122,"OFF")==0)
    variable.etatRelai=0; // Si on lit OFF, on affecte à etatRelai la valeur 0
  else
    variable.etatRelai=5; // Si on lit ni ON ni OFF, on affecte à etatRelai la valeur 5 (à changer si necéssaire)
 // Serial.println(variable.etatRelai);



    


/*for(ligne=1;;)
{
  Etape[1][0]=variable.numRelai;
  Etape[1][1]=variable.etatRelai;
 };*/


// Affectation des paramètres lu dans le fichier .csv 
switch(ligne){
  case 1:
    Etape[1][0]=variable.numRelai;
    Etape[1][1]=variable.etatRelai;
    break;
  case 2 :
    Etape[2][0]=variable.numRelai;
    Etape[2][1]=variable.etatRelai;   
    break;
  case 3 :
    Etape[3][0]=variable.numRelai;
    Etape[3][1]=variable.etatRelai;   
    break;
  case 4 :
    Etape[4][0]=variable.numRelai;
    Etape[4][1]=variable.etatRelai;   
    break;
  case 5 :
    Etape[5][0]=variable.numRelai;
    Etape[5][1]=variable.etatRelai;   
    break;
  case 6 :
    Etape[6][0]=variable.numRelai;
    Etape[6][1]=variable.etatRelai;   
    break;
  case 7 :
    Etape[7][0]=variable.numRelai;
    Etape[7][1]=variable.etatRelai;   
    break;
  }
 }
}

void loop() {
}

J'aimerais afficher le tableau Etape.

Merci de votre aide.

Bonjour,

Tout d'abord il y a une erreur dans ton code, les indices dans Etape ne vont pas de 1 à 7, mais de 0 à 6;

Pour afficher Etape sur la liaison série il suffit de faire 2 boucles

for (int l=0; l<7; l++)
 {
   Serial.print("Etape[");
    Serial.print(l);
    Serial.print("]: ");
   for (int c=0; c<2; c++)
   {
     Serial.print(Etape[l][c]);
     if (c==0)
       Serial.print(',');
     else
       Serial.println();
   }
 }

J'ai quelques remarques sur ton programme:

  • Pourquoi ne pas avoir déclaré
 relai Etape[7];

au lieu de

 int Etape[7][2];

Ca rendrait ton code plus clair et plus simple

  • Si tu déclares Etape dans Setup, tu ne pourras pas y accéder dans loop(). Il faudra le déclarer en global.

kamill:
J'ai quelques remarques sur ton programme:

  • Pourquoi ne pas avoir déclaré
 relai Etape[7];

au lieu de

 int Etape[7][2];

Ca rendrait ton code plus clair et plus simple

Si je fais ça, faut il enlever cette ligne ?

relai variable {0,0};

Comment déclarer ces lignes ?

    Etape[0][0]=variable.numRelai;
    Etape[0][1]=variable.etatRelai;

Merci pour ton aide toujours au top :wink:

kooxy:
Si je fais ça, faut il enlever cette ligne ?

relai variable {0,0};

Pas forcément, tu peut ranger les valeurs directement dans tableau ou utiliser une variable intermédiaire comme tu le fais actuellement.
Dans ce cas l’affectation au tableau sera par exemple:

Etape[0]=relai;

Merci beaucoup !!

J'aurais certainement encore besoin de toi :wink:

Je rieviens déja :slight_smile:

J'essaye de modifier le petit bout de programme pour afficher le tableau avec 4 collones

j'ai changer:

for (int c=0; c<2; c++)

par

for (int c=0; c<4; c++)

mais il manque un truc a mon avis dans la suite mais je ne vois pas quoi.

Ton tableau a 2 colonnes, donc tu ne peux en afficher que 2. Qu'est ce que tu veux faire? afficher 2 lignes du tableau sur le même ligne?

J'ai changer mon tableau, il a maintenant 4 collones avec le numéro et l'état de 2 relai.

alors quel est le problème?

kamill:
alors quel est le problème?

J'aimerais afficher les 4 collones ^^

Ca doit fonctionner. Tu peux mettre ton code

#include <SD.h>
#include <SPI.h>


File fichierlog;
static char buf[50]; // buffer pour la lecture de la linge
int ligne=0; // compteur pour la lecture de la ligne



// Pour chaque ligne du cycleur
char *p1; // Cellule 1
char *p2; // Cellule 2 pas besoin d'être séparé (soit N soit B)
char *p12; // Partie à gauche du "+"
char *p22; // Partie à droite du "+"
char *p121; // Partie à gauche du "=" à gauche du "+"
char *p122; // Partie à droite du "=" à gauche du "+"
char *p221; // Partie à gauche du "=" à droite du "+"
char *p222; // Partie à droite du "=" à droite du "+"



//********************************************************************************************************************
// déclaration des structures
      struct relai {
        int numRelai;  // numéro du relai
        int etatRelai;  // état du relai
        int numRelai2;  // numéro du relai
        int etatRelai2;  // état du relai
      };
relai variable {0,0};
      
// déclaration du tableau
  int Etape[8][4] = //Nouveau
  {0,0,0,0};


void setup() {
  

  


//********************************************************************************************************************              
              
              // Ouverture du port série 
               Serial.begin(9600);
               while (!Serial) {};

     
// -----------------------Initialisation de la carte SD------------------------------     
               Serial.print("Initialisation de la carte SD ...");

               if (!SD.begin(4)) {
                                    Serial.println("initialisation echouee !");
                                    return;
                                  }
               Serial.println("initialisation reussie.");



               
//------------------------Ouverture du fichier csv-----------------------------------
fichierlog = SD.open ("READTEST.csv", FILE_READ);




//----------------------Lecture du fichier csv ligne par ligne-----------------------
 while (fichierlog.available())
 {

   int i;
   for (i = 0; fichierlog.available() && i < sizeof buf - 1; i++)
   {
     buf[i] = fichierlog.read();
     if (buf[i] == '\n')
       break;                // fin de ligne
   }
   buf[i] = 0;               // fin de la chaine
   ligne++;



   
//--------------séparation des données d'une ligne (ici 3 données max)---------------
// Séparation des cellules
 p1=strtok(buf,";"); 
 p2=strtok(NULL,";");

    // Séparation au niveau du "+"
    p12=strtok(p1, "+");
    p22=strtok(NULL, ";");

         // Séparation de la partie a gauche du "+" au niveau du "="
         p121=strtok(p12, "=");
         p122=strtok(NULL,";");

              // Séparation de la partie a droite du "+" au niveau du "="
              p221=strtok(p22, "=");
              p222=strtok(NULL, ";");



       
//------------------Verification de la lecture et du découpage--------------------
 //Serial.println(p1); // Cellule 1
 //Serial.println(p2); // Cellule 2 pas besoin d'être séparé (soit N soit B)
 //Serial.println(p12); // Partie à gauche du "+"
 //Serial.println(p22); // Partie à droite du "+"
 //Serial.println(p121); // Partie à gauche du "=" à gauche du "+"
 //Serial.println(p122); // Partie à droite du "=" à gauche du "+"
 //Serial.println(p221); // Partie à gauche du "=" à droite du "+"
 //Serial.println(p222); // Partie à droite du "=" à droite du "+"



 


//********************************1er Relai*****************************************
 
//---------------------conversion du numéro du 1er relai----------------------------
if (strcmp(p121,"R1")==0)
    variable.numRelai=1; // Si on lit R1, on affecte à numRelai la valeur 1
  else if (strcmp(p121,"R2")==0)
    variable.numRelai=2; // Si on lit R2, on affecte à numRelai la valeur 2
  else 
    variable.numRelai=0;  // Si on lit ni R1 ni R2, le numéro du relai est 0
 // Serial.println(variable.numRelai); // affiche le résultat de la conversion



  
//----------------------conversion de l'etat du 1er relai----------------------------
if (strcmp(p122,"ON")==0)
    variable.etatRelai=1; // si on lit ON, on affecte à etatRelai la valeur 1
  else if (strcmp(p122,"OFF")==0)
    variable.etatRelai=0; // Si on lit OFF, on affecte à etatRelai la valeur 0
  else
    variable.etatRelai=5; // Si on lit ni ON ni OFF, on affecte à etatRelai la valeur 5 (à changer si necéssaire)
 // Serial.println(variable.etatRelai);



 


//********************************2ème Relai*****************************************//Nouveau

 //---------------------conversion du numéro du 2ème relai----------------------------
if (strcmp(p221,"R1")==0)
    variable.numRelai2=1; // Si on lit R1, on affecte à numRelai la valeur 1
  else if (strcmp(p221,"R2")==0)
    variable.numRelai2=2; // Si on lit R2, on affecte à numRelai la valeur 2
  else 
    variable.numRelai2=0;  // Si on lit ni R1 ni R2, le numéro du relai est 0
 // Serial.println(variable.numRelai); // affiche le résultat de la conversion



//----------------------conversion de l'etat du 2ème relai----------------------------
if (strcmp(p222,"ON")==0)
    variable.etatRelai2=1; // si on lit ON, on affecte à etatRelai la valeur 1
  else if (strcmp(p222,"OFF")==0)
    variable.etatRelai2=0; // Si on lit OFF, on affecte à etatRelai la valeur 0
  else
    variable.etatRelai2=5; // Si on lit ni ON ni OFF, on affecte à etatRelai la valeur 5 (à changer si necéssaire)
 // Serial.println(variable.etatRelai);

    



// Affectation des paramètres lu dans le fichier .csv 
switch(ligne){
  case 1:
    Etape[0][0]=variable.numRelai;
    Etape[0][1]=variable.etatRelai;
    Etape[0][2]=variable.numRelai2; //Nouveau
    Etape[0][3]=variable.etatRelai2; //Nouveau
    break;
  case 2 :
    Etape[1][0]=variable.numRelai;
    Etape[1][1]=variable.etatRelai; 
    Etape[1][2]=variable.numRelai2; //Nouveau
    Etape[1][3]=variable.etatRelai2;   //Nouveau
    break;
  case 4 :
    Etape[2][0]=variable.numRelai;
    Etape[2][1]=variable.etatRelai;
    Etape[2][2]=variable.numRelai2;//Nouveau
    Etape[2][3]=variable.etatRelai2;   //Nouveau
    break;
  case 6 :
    Etape[3][0]=variable.numRelai;
    Etape[3][1]=variable.etatRelai; 
    Etape[3][2]=variable.numRelai2;//Nouveau
    Etape[3][3]=variable.etatRelai2; //Nouveau
    break;
  case 8 :
    Etape[4][0]=variable.numRelai;
    Etape[4][1]=variable.etatRelai;
    Etape[4][2]=variable.numRelai2;//Nouveau
    Etape[4][3]=variable.etatRelai2;   //Nouveau
    break;
  case 10 :
    Etape[5][0]=variable.numRelai;
    Etape[5][1]=variable.etatRelai;  
    Etape[5][2]=variable.numRelai2;//Nouveau
    Etape[5][3]=variable.etatRelai2; //Nouveau
    break;
  case 12 :
    Etape[6][0]=variable.numRelai;
    Etape[6][1]=variable.etatRelai;  
    Etape[6][2]=variable.numRelai2;//Nouveau
    Etape[6][3]=variable.etatRelai2; //Nouveau
    break;
  case 14 :
    Etape[7][0]=variable.numRelai;
    Etape[7][1]=variable.etatRelai;
    Etape[7][2]=variable.numRelai2;//Nouveau
    Etape[7][3]=variable.etatRelai2; //Nouveau
   }


 }


 for (int l=0; l<8; l++)
 {
   Serial.print("Etape[");
    Serial.print(l);
    Serial.print("]: ");
   for (int c=0; c<4; c++)//Nouveau
   {
     Serial.print(Etape[l][c]);
     if (c==0)
       Serial.print(',');
     else
       Serial.println();
   }
 }
 
}

C'est juste une question de faire le saut de ligne à la fin de la ligne et non en plein milieu
modifie comme ceci

   for (int l = 0; l < 8; l++)
   {
     Serial.print("Etape[");
      Serial.print(l);
      Serial.print("]: ");
     for (int c = 0; c < 4; c++) //Nouveau
     {
       Serial.print(Etape[l][c]);
       if (c < 3)
         Serial.print(',');
       else
         Serial.println();
     }
   }

Sa marche nickel :wink: :

Initialisation de la carte SD ...initialisation reussie.
Etape[0]: 1,0,2,0
Etape[1]: 1,1,0,5
Etape[2]: 2,1,0,5
Etape[3]: 2,0,0,5
Etape[4]: 1,0,0,5
Etape[5]: 1,0,2,0
Etape[6]: 1,0,2,0
Etape[7]: 1,0,2,0