Exporter des données d'une sd card dans une autre CLASS

bonjour à tous
Dans la CLASS "SD_PIN" de mon code, j'affiche correctement la data de chaque SW_x , je l'ai mis pour le moment dans le serial pour vérifier le bon fonctionnement, tout est OK.
J'ai besoin d'exporter ces 64 SW_x vers une autre CLASS nommée "SWITCH_CASE_X".

chaque SW_x peut avoir la valeur 0,1,2 ou 3, je me demande si il n'y a pas un moyen simple et efficace en passant par exemple par un tableau pour exporter ses données vers la CLASS "SWITCH_CASE_X".

A savoir ces ces valeur "SW_x = 0,1,2 ou 3" ne sont lu qu'une fois durant le setup,. elles ne changent pas (sauf si je modifie le fichier "config*txt" de la SD)

à l'issue de l'export vers la CLASS "SWITCH_CASE_X", je dois récupérer les valeurs de chaque SW_x pour les exploiter dans une fonction qui est elle même appelée la fonction SWITCH CASE, case 1, etc.

void SD_PIN::SCAN_SD()      //  Affiche le résultat de la configuration *
{
  Serial.print("SW_1 = ");
  Serial.println(SW_1);
  Serial.print("SW_2 = ");
  Serial.println(SW_2);
  Serial.print("SW_3 = ");
  Serial.println(SW_3);
  Serial.print("SW_4 = ");
  Serial.println(SW_4);
  Serial.print("SW_5 = ");
  Serial.println(SW_5);
  Serial.print("SW_6 = ");
  Serial.println(SW_6);
  Serial.print("SW_7 = ");
  Serial.println(SW_7);
  Serial.print("SW_8 = ");
  Serial.println(SW_8);
  Serial.print("SW_9 = ");
  Serial.println(SW_9);
  Serial.print("SW_10 = ");
  Serial.println(SW_10);
  Serial.print("SW_11 = ");
  Serial.println(SW_11);
  Serial.print("SW_12 = ");
  Serial.println(SW_12);
  Serial.print("SW_13 = ");
  Serial.println(SW_13);
  Serial.print("SW_14 = ");
  Serial.println(SW_14);
  Serial.print("SW_15 = ");
  Serial.println(SW_15);
  Serial.print("SW_16 = ");
  Serial.println(SW_16);
  Serial.print("SW_17 = ");
  Serial.println(SW_17);
  Serial.print("SW_18 = ");
  Serial.println(SW_18);
  Serial.print("SW_19 = ");
  Serial.println(SW_19);
  Serial.print("SW_20 = ");
  Serial.println(SW_20); 
  Serial.print("SW_21 = ");
  Serial.println(SW_21); 
  Serial.print("SW_22 = ");
  Serial.println(SW_22);
  Serial.print("SW_23 = ");
  Serial.println(SW_23); 
  Serial.print("SW_24 = ");
  Serial.println(SW_24); 
  Serial.print("SW_25 = ");
  Serial.println(SW_25);
  Serial.print("SW_26 = ");
  Serial.println(SW_26);
  Serial.print("SW_27 = ");
  Serial.println(SW_27); 
  Serial.print("SW_28 = ");
  Serial.println(SW_28); 
  Serial.print("SW_29 = ");
  Serial.println(SW_29); 
  Serial.print("SW_30 = ");
  Serial.println(SW_30);
  Serial.print("SW_31 = ");
  Serial.println(SW_31);
  Serial.print("SW_32 = ");
  Serial.println(SW_32); 
  Serial.print("SW_33 = ");
  Serial.println(SW_33); 
  Serial.print("SW_34 = ");
  Serial.println(SW_34); 
  Serial.print("SW_35 = ");
  Serial.println(SW_35);
  Serial.print("SW_36 = ");
  Serial.println(SW_36);
  Serial.print("SW_37 = ");
  Serial.println(SW_37);
  Serial.print("SW_38 = ");
  Serial.println(SW_38); 
  Serial.print("SW_39 = ");
  Serial.println(SW_39); 
  Serial.print("SW_40 = ");
  Serial.println(SW_40); 
  Serial.print("SW_41 = ");
  Serial.println(SW_41);
  Serial.print("SW_42 = ");
  Serial.println(SW_42); 
  Serial.print("SW_43 = ");
  Serial.println(SW_43); 
  Serial.print("SW_44 = ");
  Serial.println(SW_44); 
  Serial.print("SW_45 = ");
  Serial.println(SW_45);
  Serial.print("SW_46 = ");
  Serial.println(SW_46);
  Serial.print("SW_47 = ");
  Serial.println(SW_47);
  Serial.print("SW_48 = ");
  Serial.println(SW_48); 
  Serial.print("SW_49 = ");
  Serial.println(SW_49); 
  Serial.print("SW_50 = ");
  Serial.println(SW_50);
  Serial.print("SW_51 = ");
  Serial.println(SW_51);
  Serial.print("SW_52 = ");
  Serial.println(SW_52); 
  Serial.print("SW_53 = ");
  Serial.println(SW_53); 
  Serial.print("SW_54 = ");
  Serial.println(SW_54); 
  Serial.print("SW_55 = ");
  Serial.println(SW_55);
  Serial.print("SW_56 = ");
  Serial.println(SW_56);
  Serial.print("SW_57 = ");
  Serial.println(SW_57);
  Serial.print("SW_58 = ");
  Serial.println(SW_58); 
  Serial.print("SW_59 = ");
  Serial.println(SW_59); 
  Serial.print("SW_60 = ");
  Serial.println(SW_60);
  Serial.print("SW_61 = ");
  Serial.println(SW_61); 
  Serial.print("SW_62 = ");
  Serial.println(SW_62); 
  Serial.print("SW_63 = ");
  Serial.println(SW_63); 
  Serial.print("SW_64 = ");
  Serial.println(SW_64);  
}

si un spécialiste à une idée ou un code répondant au besoin, je vous en remercie par avance.

chris

Votre sujet a été déplacé vers la section française du forum.

merci, je n'ai pas percuté en le faisant

bonjour

pas d'idée ?, tout ce que j'ai fait ne fonctionne pas :roll_eyes:

il faudrait poster tout le code... ce que vous avez posté ne nous sert à rien... Il faudrait aussi comprendre ce que vous avez en tête comme modèle objet... (pourquoi dupliquer les données dans 2 classes ?)

comme on dit souvent... Notre boule de cristal est au lave vaisselle...

bonjour

effectivement avec le code complet c est mieux. Pourquoi en CLASS, car c est plus simple pour moi d'organiser le code de cette manière et qu'on l'on m'a appris ainsi. Je peux aussi transférer ce code dans la "SWITCH_CASE_X", ce qui répondra au besoin,

le but est d'envoyer cela dans une CLASS "SWITCH_CASE_X" pour respecter la phylo de mes codes, une fois cela fait, j utilise ses données dans la fonction SWITCH CASE que je doit associer à la condition CASE déjà existante "switch (Switch_case_data + TBD ) "

du genre
case (Switch_case_data && TBD):
fonction x
break;

en espérant que cela soit plus clair

chris, merci

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

int Pin_Test = 2; 
int val = 1;         //******************NEW
 
/* Taille du buffer */
const byte BUFFER_SIZE = 32;
 
/* Variables d'exemple qui seront chargé depuis le fichier de configuration */
int SW_1 = 0, SW_2 = 0, SW_3 = 0, SW_4 = 0, SW_5 = 0, SW_6 = 0, SW_7 = 0, SW_8 = 0, SW_9 = 0, SW_10 = 0;
int SW_11 = 0, SW_12 = 0, SW_13 = 0, SW_14 = 0, SW_15 = 0, SW_16 = 0, SW_17 = 0, SW_18 = 0, SW_19 = 0, SW_20 = 0;
int SW_21 = 0, SW_22 = 0, SW_23 = 0, SW_24 = 0, SW_25 = 0, SW_26 = 0, SW_27 = 0, SW_28 = 0, SW_29 = 0, SW_30 = 0;
int SW_31 = 0, SW_32 = 0, SW_33 = 0, SW_34 = 0, SW_35 = 0, SW_36 = 0, SW_37 = 0, SW_38 = 0, SW_39 = 0, SW_40 = 0;
int SW_41 = 0, SW_42 = 0, SW_43 = 0, SW_44 = 0, SW_45 = 0, SW_46 = 0, SW_47 = 0, SW_48 = 0, SW_49 = 0, SW_50 = 0;
int SW_51 = 0, SW_52 = 0, SW_53 = 0, SW_54 = 0, SW_55 = 0, SW_56 = 0, SW_57 = 0, SW_58 = 0, SW_59 = 0, SW_60 = 0;
int SW_61 = 0, SW_62 = 0, SW_63 = 0, SW_64 = 0;
 
/* setup() */
void setup() 
{
 pinMode(Pin_Test, INPUT_PULLUP); // ************************** new
 
  /* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
  char buffer[BUFFER_SIZE], *key, *value;
 
  /* Déclare l'itérateur et le compteur de lignes */
  byte i, buffer_lenght, line_counter = 0;
 
  /* Initialise le port série */
  Serial.begin(9600);
  Serial.println("Chargement de la config Flipper");
 
  /* Initialise la carte SD */
  pinMode(10, OUTPUT);
  if (!SD.begin(53)) {                                    // Gère les erreurs     // 4 pour arduino
    Serial.println("Erreur de carte SD !");
    for(;;);
  }
 
  /* Ouvre le  fichier de configuration */
  File config_file = SD.open("config.txt", FILE_READ);
  if(!config_file) {                                      // Gère les erreurs
    Serial.println("Erreur d'ouverture du fichier !");
    for(;;);
  }
 
  /* Tant que non fin de fichier */
  while(config_file.available() > 0 ){
 
    /* Récupère une ligne entière dans le buffer */
    i = 0;
    while((buffer[i++] = config_file.read()) != '\n') {
 
      /* Si la ligne dépasse la taille du buffer */
      if(i == BUFFER_SIZE) {
 
        /* On finit de lire la ligne mais sans stocker les données */
        while(config_file.read() != '\n');
        break; // Et on arrête la lecture de cette ligne
      }
    }
 
    /* On garde de côté le nombre de char stocké dans le buffer */
    buffer_lenght = i;
 
    /* Gestion des lignes trop grande */
    if(i == BUFFER_SIZE) {
      Serial.print("Ligne trop longue à la ligne ");
      Serial.println(line_counter, DEC);
    }
 
    /* Finalise la chaine de caractéres ASCIIZ en supprimant le \n au passage */
    buffer[--i] = '\0';
 
    /* Incrémente le compteur de lignes */
    ++line_counter;
 
    /* Ignore les lignes vides ou les lignes de commentaires */
    if(buffer[0] == '\0' || buffer[0] == '#') continue;
       
    /* Cherche l'emplacement de la clef en ignorant les espaces et les tabulations en début de ligne */
    i = 0;
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) break; // Ignore les lignes contenant uniquement des espaces et/ou des tabulations
    }
    if(i == buffer_lenght) continue; // Gère les lignes contenant uniquement des espaces et/ou des tabulations
    key = &buffer[i];
 
    /* Cherche l'emplacement du séparateur = en ignorant les espaces et les tabulations âpres la clef */
    while(buffer[i] != '=') {
 
      /* Ignore les espaces et les tabulations */
      if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
         
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
 
    /* Transforme le séparateur = en \0 et continue */
    buffer[i++] = '\0';
 
    /* Cherche l'emplacement de la valeur en ignorant les espaces et les tabulations âpres le séparateur */
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
    value = &buffer[i];
 
    /* Transforme les données texte en valeur utilisable */
    /* C'est ce morceaux de code qu'il vous faudra adapter pour votre application <img draggable="false" role="img" class="emoji" alt="😉" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/1f609.svg"> */
          if(strcmp(key, "SW_1") == 0) 
          {SW_1 = atoi(value);} 
              
          else if(strcmp(key, "SW_2") == 0) 
          {SW_2 = atoi(value);} 
              
          else if(strcmp(key, "SW_3") == 0) 
          {SW_3 = atoi(value);} 
          
          else if(strcmp(key, "SW_4") == 0) 
          {SW_4 = atoi(value);} 
          
          else if(strcmp(key, "SW_5") == 0) 
          {SW_5 = atoi(value);} 
          
          else if(strcmp(key, "SW_6") == 0) 
          {SW_6 = atoi(value);}

          else if(strcmp(key, "SW_7") == 0) 
          {SW_7 = atoi(value);}

          else if(strcmp(key, "SW_8") == 0) 
          {SW_8 = atoi(value);}

          else if(strcmp(key, "SW_9") == 0) 
          {SW_9 = atoi(value);}

          else if(strcmp(key, "SW_10") == 0) 
          {SW_10 = atoi(value);}

          else if(strcmp(key, "SW_11") == 0) 
          {SW_11 = atoi(value);}

          else if(strcmp(key, "SW_12") == 0) 
          {SW_12 = atoi(value);}

          else if(strcmp(key, "SW_13") == 0) 
          {SW_13 = atoi(value);}

          else if(strcmp(key, "SW_14") == 0) 
          {SW_14 = atoi(value);}

          else if(strcmp(key, "SW_15") == 0) 
          {SW_15 = atoi(value);}

          else if(strcmp(key, "SW_16") == 0) 
          {SW_16 = atoi(value);}

          else if(strcmp(key, "SW_17") == 0) 
          {SW_17 = atoi(value);}

          else if(strcmp(key, "SW_18") == 0) 
          {SW_18 = atoi(value);}

          else if(strcmp(key, "SW_19") == 0) 
          {SW_19 = atoi(value);}

          else if(strcmp(key, "SW_20") == 0) 
          {SW_20 = atoi(value);}

          else if(strcmp(key, "SW_21") == 0) 
          {SW_21 = atoi(value);}

          else if(strcmp(key, "SW_22") == 0) 
          {SW_22 = atoi(value);}

          else if(strcmp(key, "SW_23") == 0) 
          {SW_23 = atoi(value);}

          else if(strcmp(key, "SW_24") == 0) 
          {SW_24 = atoi(value);}

          else if(strcmp(key, "SW_25") == 0) 
          {SW_25 = atoi(value);}

          else if(strcmp(key, "SW_26") == 0) 
          {SW_26 = atoi(value);}

          else if(strcmp(key, "SW_27") == 0) 
          {SW_27 = atoi(value);}

          else if(strcmp(key, "SW_28") == 0) 
          {SW_28 = atoi(value);}

          else if(strcmp(key, "SW_29") == 0) 
          {SW_29 = atoi(value);}

          else if(strcmp(key, "SW_30") == 0) 
          {SW_30 = atoi(value);}

          else if(strcmp(key, "SW_31") == 0) 
          {SW_31 = atoi(value);}

          else if(strcmp(key, "SW_32") == 0) 
          {SW_32 = atoi(value);}

          else if(strcmp(key, "SW_33") == 0) 
          {SW_33 = atoi(value);}

          else if(strcmp(key, "SW_34") == 0) 
          {SW_34 = atoi(value);}

          else if(strcmp(key, "SW_35") == 0) 
          {SW_35 = atoi(value);}

          else if(strcmp(key, "SW_36") == 0) 
          {SW_36 = atoi(value);}

          else if(strcmp(key, "SW_37") == 0) 
          {SW_37 = atoi(value);}

          else if(strcmp(key, "SW_38") == 0) 
          {SW_38 = atoi(value);}

          else if(strcmp(key, "SW_39") == 0) 
          {SW_39 = atoi(value);}

          else if(strcmp(key, "SW_40") == 0) 
          {SW_40 = atoi(value);}

          else if(strcmp(key, "SW_41") == 0) 
          {SW_41 = atoi(value);}

          else if(strcmp(key, "SW_42") == 0) 
          {SW_42 = atoi(value);}

          else if(strcmp(key, "SW_43") == 0) 
          {SW_43 = atoi(value);}

          else if(strcmp(key, "SW_44") == 0) 
          {SW_44 = atoi(value);}

          else if(strcmp(key, "SW_45") == 0) 
          {SW_45 = atoi(value);}

          else if(strcmp(key, "SW_46") == 0) 
          {SW_46 = atoi(value);}

          else if(strcmp(key, "SW_47") == 0) 
          {SW_47 = atoi(value);}

          else if(strcmp(key, "SW_48") == 0) 
          {SW_48 = atoi(value);}

          else if(strcmp(key, "SW_49") == 0) 
          {SW_49 = atoi(value);}

          else if(strcmp(key, "SW_50") == 0) 
          {SW_50 = atoi(value);}

          else if(strcmp(key, "SW_51") == 0) 
          {SW_51 = atoi(value);}

          else if(strcmp(key, "SW_52") == 0) 
          {SW_52 = atoi(value);}

          else if(strcmp(key, "SW_53") == 0) 
          {SW_53 = atoi(value);}

          else if(strcmp(key, "SW_54") == 0) 
          {SW_54 = atoi(value);}

          else if(strcmp(key, "SW_55") == 0) 
          {SW_55 = atoi(value);}

          else if(strcmp(key, "SW_56") == 0) 
          {SW_56 = atoi(value);}

          else if(strcmp(key, "SW_57") == 0) 
          {SW_57 = atoi(value);}

          else if(strcmp(key, "SW_58") == 0) 
          {SW_58 = atoi(value);}

          else if(strcmp(key, "SW_59") == 0) 
          {SW_59 = atoi(value);}

          else if(strcmp(key, "SW_60") == 0) 
          {SW_60 = atoi(value);}

          else if(strcmp(key, "SW_61") == 0) 
          {SW_61 = atoi(value);}

          else if(strcmp(key, "SW_62") == 0) 
          {SW_62 = atoi(value);}

          else if(strcmp(key, "SW_63") == 0) 
          {SW_63 = atoi(value);}

          else if(strcmp(key, "SW_64") == 0) 
          {SW_64 = atoi(value);}
            
                  
             else {  
                      Serial.print("Clef inconnu ");
                      Serial.println(key);
}
 
  }
 
  /* Ferme le fichier de configuration */
  config_file.close();
 
  /* Affiche le résultat de la configuration */
  Serial.print("SW_1 = ");
  Serial.println(SW_1);
  Serial.print("SW_2 = ");
  Serial.println(SW_2);
  Serial.print("SW_3 = ");
  Serial.println(SW_3);
  Serial.print("SW_4 = ");
  Serial.println(SW_4);
  Serial.print("SW_5 = ");
  Serial.println(SW_5);
  Serial.print("SW_6 = ");
  Serial.println(SW_6);
  Serial.print("SW_7 = ");
  Serial.println(SW_7);
  Serial.print("SW_8 = ");
  Serial.println(SW_8);
  Serial.print("SW_9 = ");
  Serial.println(SW_9);
  Serial.print("SW_10 = ");
  Serial.println(SW_10);
  Serial.print("SW_11 = ");
  Serial.println(SW_11);
  Serial.print("SW_12 = ");
  Serial.println(SW_12);
  Serial.print("SW_13 = ");
  Serial.println(SW_13);
  Serial.print("SW_14 = ");
  Serial.println(SW_14);
  Serial.print("SW_15 = ");
  Serial.println(SW_15);
  Serial.print("SW_16 = ");
  Serial.println(SW_16);
  Serial.print("SW_17 = ");
  Serial.println(SW_17);
  Serial.print("SW_18 = ");
  Serial.println(SW_18);
  Serial.print("SW_19 = ");
  Serial.println(SW_19);
  Serial.print("SW_20 = ");
  Serial.println(SW_20); 
  Serial.print("SW_21 = ");
  Serial.println(SW_21); 
  Serial.print("SW_22 = ");
  Serial.println(SW_22);
  Serial.print("SW_23 = ");
  Serial.println(SW_23); 
  Serial.print("SW_24 = ");
  Serial.println(SW_24); 
  Serial.print("SW_25 = ");
  Serial.println(SW_25);
  Serial.print("SW_26 = ");
  Serial.println(SW_26);
  Serial.print("SW_27 = ");
  Serial.println(SW_27); 
  Serial.print("SW_28 = ");
  Serial.println(SW_28); 
  Serial.print("SW_29 = ");
  Serial.println(SW_29); 
  Serial.print("SW_30 = ");
  Serial.println(SW_30);
  Serial.print("SW_31 = ");
  Serial.println(SW_31);
  Serial.print("SW_32 = ");
  Serial.println(SW_32); 
  Serial.print("SW_33 = ");
  Serial.println(SW_33); 
  Serial.print("SW_34 = ");
  Serial.println(SW_34); 
  Serial.print("SW_35 = ");
  Serial.println(SW_35);
  Serial.print("SW_36 = ");
  Serial.println(SW_36);
  Serial.print("SW_37 = ");
  Serial.println(SW_37);
  Serial.print("SW_38 = ");
  Serial.println(SW_38); 
  Serial.print("SW_39 = ");
  Serial.println(SW_39); 
  Serial.print("SW_40 = ");
  Serial.println(SW_40); 
  Serial.print("SW_41 = ");
  Serial.println(SW_41);
  Serial.print("SW_42 = ");
  Serial.println(SW_42); 
  Serial.print("SW_43 = ");
  Serial.println(SW_43); 
  Serial.print("SW_44 = ");
  Serial.println(SW_44); 
  Serial.print("SW_45 = ");
  Serial.println(SW_45);
  Serial.print("SW_46 = ");
  Serial.println(SW_46);
  Serial.print("SW_47 = ");
  Serial.println(SW_47);
  Serial.print("SW_48 = ");
  Serial.println(SW_48); 
  Serial.print("SW_49 = ");
  Serial.println(SW_49); 
  Serial.print("SW_50 = ");
  Serial.println(SW_50);
  Serial.print("SW_51 = ");
  Serial.println(SW_51);
  Serial.print("SW_52 = ");
  Serial.println(SW_52); 
  Serial.print("SW_53 = ");
  Serial.println(SW_53); 
  Serial.print("SW_54 = ");
  Serial.println(SW_54); 
  Serial.print("SW_55 = ");
  Serial.println(SW_55);
  Serial.print("SW_56 = ");
  Serial.println(SW_56);
  Serial.print("SW_57 = ");
  Serial.println(SW_57);
  Serial.print("SW_58 = ");
  Serial.println(SW_58); 
  Serial.print("SW_59 = ");
  Serial.println(SW_59); 
  Serial.print("SW_60 = ");
  Serial.println(SW_60);
  Serial.print("SW_61 = ");
  Serial.println(SW_61); 
  Serial.print("SW_62 = ");
  Serial.println(SW_62); 
  Serial.print("SW_63 = ");
  Serial.println(SW_63); 
  Serial.print("SW_64 = ");
  Serial.println(SW_64);  
}
 
/* loop() */
void loop(){
                        
   }

je ne vois pas la définition de vos classes ?

voilà le *.CPP et *.h

cette class fonctionne parfaitement bien

*.cpp

// https://skyduino.wordpress.com/2012/06/19/arduino-charger-un-fichier-de-configuration-depuis-une-carte-sd/

#include <arduino.h>
#include "SD_PIN.h"

SD_PIN::SD_PIN()
{
}

void SD_PIN::Init()
{

// pinMode(Pin_Test, INPUT_PULLUP); // ************************** new
 
  /* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
  char buffer[BUFFER_SIZE], *key, *value;
 
  /* Déclare l'itérateur et le compteur de lignes */
  byte i, buffer_lenght, line_counter = 0;
 
//  /* Initialise le port série */
//  Serial.begin(9600);
//  Serial.println("\t *** Chargement de la config Flipper\n");
 
  /* Initialise la carte SD */
  pinMode(10, OUTPUT);
  if (!SD.begin(53)) 
  {                                    // Gère les erreurs     // 4 pour arduino
    Serial.println("Erreur de carte SD !");
    for(;;);
  }
 
  /* Ouvre le  fichier de configuration */
  File config_file = SD.open("config.txt", FILE_READ);
  if(!config_file) {                                      // Gère les erreurs
    Serial.println("Erreur d'ouverture du fichier !");
    for(;;);
  }
 
  /* Tant que non fin de fichier */
  while(config_file.available() > 0 ){
 
    /* Récupère une ligne entière dans le buffer */
    i = 0;
    while((buffer[i++] = config_file.read()) != '\n') {
 
      /* Si la ligne dépasse la taille du buffer */
      if(i == BUFFER_SIZE) {
 
        /* On finit de lire la ligne mais sans stocker les données */
        while(config_file.read() != '\n');
        break; // Et on arrête la lecture de cette ligne
      }
    }
 
    /* On garde de côté le nombre de char stocké dans le buffer */
    buffer_lenght = i;
 
    /* Gestion des lignes trop grande */
    if(i == BUFFER_SIZE) {
      Serial.print("Ligne trop longue à la ligne ");
      Serial.println(line_counter, DEC);
    }
 
    /* Finalise la chaine de caractéres ASCIIZ en supprimant le \n au passage */
    buffer[--i] = '\0';
 
    // Incrémente le compteur de lignes
    ++line_counter;
 
    /* Ignore les lignes vides ou les lignes de commentaires */
    if(buffer[0] == '\0' || buffer[0] == '#') continue;
       
    /* Cherche l'emplacement de la clef en ignorant les espaces et les tabulations en début de ligne */
    i = 0;
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) break; // Ignore les lignes contenant uniquement des espaces et/ou des tabulations
    }
    if(i == buffer_lenght) continue; // Gère les lignes contenant uniquement des espaces et/ou des tabulations
    key = &buffer[i];
 
    /* Cherche l'emplacement du séparateur = en ignorant les espaces et les tabulations âpres la clef */
    while(buffer[i] != '=') {
 
      /* Ignore les espaces et les tabulations */
      if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
         
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
 
    /* Transforme le séparateur = en \0 et continue */
    buffer[i++] = '\0';
 
    /* Cherche l'emplacement de la valeur en ignorant les espaces et les tabulations âpres le séparateur */
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
    value = &buffer[i];
 
    /* Transforme les données texte en valeur utilisable */
    /* C'est ce morceaux de code qu'il vous faudra adapter pour votre application <img draggable="false" role="img" class="emoji" alt="😉" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/1f609.svg"> */
          if(strcmp(key, "SW_1") == 0) 
          {SW_1 = atoi(value);} 
              
          else if(strcmp(key, "SW_2") == 0) 
          {SW_2 = atoi(value);} 
              
          else if(strcmp(key, "SW_3") == 0) 
          {SW_3 = atoi(value);} 
          
          else if(strcmp(key, "SW_4") == 0) 
          {SW_4 = atoi(value);} 
          
          else if(strcmp(key, "SW_5") == 0) 
          {SW_5 = atoi(value);} 
          
          else if(strcmp(key, "SW_6") == 0) 
          {SW_6 = atoi(value);}

          else if(strcmp(key, "SW_7") == 0) 
          {SW_7 = atoi(value);}

          else if(strcmp(key, "SW_8") == 0) 
          {SW_8 = atoi(value);}

          else if(strcmp(key, "SW_9") == 0) 
          {SW_9 = atoi(value);}

          else if(strcmp(key, "SW_10") == 0) 
          {SW_10 = atoi(value);}

          else if(strcmp(key, "SW_11") == 0) 
          {SW_11 = atoi(value);}

          else if(strcmp(key, "SW_12") == 0) 
          {SW_12 = atoi(value);}

          else if(strcmp(key, "SW_13") == 0) 
          {SW_13 = atoi(value);}

          else if(strcmp(key, "SW_14") == 0) 
          {SW_14 = atoi(value);}

          else if(strcmp(key, "SW_15") == 0) 
          {SW_15 = atoi(value);}

          else if(strcmp(key, "SW_16") == 0) 
          {SW_16 = atoi(value);}

          else if(strcmp(key, "SW_17") == 0) 
          {SW_17 = atoi(value);}

          else if(strcmp(key, "SW_18") == 0) 
          {SW_18 = atoi(value);}

          else if(strcmp(key, "SW_19") == 0) 
          {SW_19 = atoi(value);}

          else if(strcmp(key, "SW_20") == 0) 
          {SW_20 = atoi(value);}

          else if(strcmp(key, "SW_21") == 0) 
          {SW_21 = atoi(value);}

          else if(strcmp(key, "SW_22") == 0) 
          {SW_22 = atoi(value);}

          else if(strcmp(key, "SW_23") == 0) 
          {SW_23 = atoi(value);}

          else if(strcmp(key, "SW_24") == 0) 
          {SW_24 = atoi(value);}

          else if(strcmp(key, "SW_25") == 0) 
          {SW_25 = atoi(value);}

          else if(strcmp(key, "SW_26") == 0) 
          {SW_26 = atoi(value);}

          else if(strcmp(key, "SW_27") == 0) 
          {SW_27 = atoi(value);}

          else if(strcmp(key, "SW_28") == 0) 
          {SW_28 = atoi(value);}

          else if(strcmp(key, "SW_29") == 0) 
          {SW_29 = atoi(value);}

          else if(strcmp(key, "SW_30") == 0) 
          {SW_30 = atoi(value);}

          else if(strcmp(key, "SW_31") == 0) 
          {SW_31 = atoi(value);}

          else if(strcmp(key, "SW_32") == 0) 
          {SW_32 = atoi(value);}

          else if(strcmp(key, "SW_33") == 0) 
          {SW_33 = atoi(value);}

          else if(strcmp(key, "SW_34") == 0) 
          {SW_34 = atoi(value);}

          else if(strcmp(key, "SW_35") == 0) 
          {SW_35 = atoi(value);}

          else if(strcmp(key, "SW_36") == 0) 
          {SW_36 = atoi(value);}

          else if(strcmp(key, "SW_37") == 0) 
          {SW_37 = atoi(value);}

          else if(strcmp(key, "SW_38") == 0) 
          {SW_38 = atoi(value);}

          else if(strcmp(key, "SW_39") == 0) 
          {SW_39 = atoi(value);}

          else if(strcmp(key, "SW_40") == 0) 
          {SW_40 = atoi(value);}

          else if(strcmp(key, "SW_41") == 0) 
          {SW_41 = atoi(value);}

          else if(strcmp(key, "SW_42") == 0) 
          {SW_42 = atoi(value);}

          else if(strcmp(key, "SW_43") == 0) 
          {SW_43 = atoi(value);}

          else if(strcmp(key, "SW_44") == 0) 
          {SW_44 = atoi(value);}

          else if(strcmp(key, "SW_45") == 0) 
          {SW_45 = atoi(value);}

          else if(strcmp(key, "SW_46") == 0) 
          {SW_46 = atoi(value);}

          else if(strcmp(key, "SW_47") == 0) 
          {SW_47 = atoi(value);}

          else if(strcmp(key, "SW_48") == 0) 
          {SW_48 = atoi(value);}

          else if(strcmp(key, "SW_49") == 0) 
          {SW_49 = atoi(value);}

          else if(strcmp(key, "SW_50") == 0) 
          {SW_50 = atoi(value);}

          else if(strcmp(key, "SW_51") == 0) 
          {SW_51 = atoi(value);}

          else if(strcmp(key, "SW_52") == 0) 
          {SW_52 = atoi(value);}

          else if(strcmp(key, "SW_53") == 0) 
          {SW_53 = atoi(value);}

          else if(strcmp(key, "SW_54") == 0) 
          {SW_54 = atoi(value);}

          else if(strcmp(key, "SW_55") == 0) 
          {SW_55 = atoi(value);}

          else if(strcmp(key, "SW_56") == 0) 
          {SW_56 = atoi(value);}

          else if(strcmp(key, "SW_57") == 0) 
          {SW_57 = atoi(value);}

          else if(strcmp(key, "SW_58") == 0) 
          {SW_58 = atoi(value);}

          else if(strcmp(key, "SW_59") == 0) 
          {SW_59 = atoi(value);}

          else if(strcmp(key, "SW_60") == 0) 
          {SW_60 = atoi(value);}

          else if(strcmp(key, "SW_61") == 0) 
          {SW_61 = atoi(value);}

          else if(strcmp(key, "SW_62") == 0) 
          {SW_62 = atoi(value);}

          else if(strcmp(key, "SW_63") == 0) 
          {SW_63 = atoi(value);}

          else if(strcmp(key, "SW_64") == 0) 
          {SW_64 = atoi(value);}
           

                  
             else {  
                   Serial.print("Clef inconnu ");
                   Serial.println(key);
                  }
  }
 
          config_file.close();        // Ferme le fichier de configuration 
          Serial.println("\t *** SD CARD Initialised"); 
}

int SD_PIN::SCAN_SD()  //  Affiche le résultat de la configuration *
{

  Serial.print("SW_1 = ");
  Serial.println(SW_1);
  Serial.print("SW_2 = ");
  Serial.println(SW_2);
  Serial.print("SW_3 = ");
  Serial.println(SW_3);
  Serial.print("SW_4 = ");
  Serial.println(SW_4);
  Serial.print("SW_5 = ");
  Serial.println(SW_5);
  Serial.print("SW_6 = ");
  Serial.println(SW_6);
  Serial.print("SW_7 = ");
  Serial.println(SW_7);
  Serial.print("SW_8 = ");
  Serial.println(SW_8);
  Serial.print("SW_9 = ");
  Serial.println(SW_9);
  Serial.print("SW_10 = ");
  Serial.println(SW_10);
  Serial.print("SW_11 = ");
  Serial.println(SW_11);
  Serial.print("SW_12 = ");
  Serial.println(SW_12);
  Serial.print("SW_13 = ");
  Serial.println(SW_13);
  Serial.print("SW_14 = ");
  Serial.println(SW_14);
  Serial.print("SW_15 = ");
  Serial.println(SW_15);
  Serial.print("SW_16 = ");
  Serial.println(SW_16);
  Serial.print("SW_17 = ");
  Serial.println(SW_17);
  Serial.print("SW_18 = ");
  Serial.println(SW_18);
  Serial.print("SW_19 = ");
  Serial.println(SW_19);
  Serial.print("SW_20 = ");
  Serial.println(SW_20); 
  Serial.print("SW_21 = ");
  Serial.println(SW_21); 
  Serial.print("SW_22 = ");
  Serial.println(SW_22);
  Serial.print("SW_23 = ");
  Serial.println(SW_23); 
  Serial.print("SW_24 = ");
  Serial.println(SW_24); 
  Serial.print("SW_25 = ");
  Serial.println(SW_25);
  Serial.print("SW_26 = ");
  Serial.println(SW_26);
  Serial.print("SW_27 = ");
  Serial.println(SW_27); 
  Serial.print("SW_28 = ");
  Serial.println(SW_28); 
  Serial.print("SW_29 = ");
  Serial.println(SW_29); 
  Serial.print("SW_30 = ");
  Serial.println(SW_30);
  Serial.print("SW_31 = ");
  Serial.println(SW_31);
  Serial.print("SW_32 = ");
  Serial.println(SW_32); 
  Serial.print("SW_33 = ");
  Serial.println(SW_33); 
  Serial.print("SW_34 = ");
  Serial.println(SW_34); 
  Serial.print("SW_35 = ");
  Serial.println(SW_35);
  Serial.print("SW_36 = ");
  Serial.println(SW_36);
  Serial.print("SW_37 = ");
  Serial.println(SW_37);
  Serial.print("SW_38 = ");
  Serial.println(SW_38); 
  Serial.print("SW_39 = ");
  Serial.println(SW_39); 
  Serial.print("SW_40 = ");
  Serial.println(SW_40); 
  Serial.print("SW_41 = ");
  Serial.println(SW_41);
  Serial.print("SW_42 = ");
  Serial.println(SW_42); 
  Serial.print("SW_43 = ");
  Serial.println(SW_43); 
  Serial.print("SW_44 = ");
  Serial.println(SW_44); 
  Serial.print("SW_45 = ");
  Serial.println(SW_45);
  Serial.print("SW_46 = ");
  Serial.println(SW_46);
  Serial.print("SW_47 = ");
  Serial.println(SW_47);
  Serial.print("SW_48 = ");
  Serial.println(SW_48); 
  Serial.print("SW_49 = ");
  Serial.println(SW_49); 
  Serial.print("SW_50 = ");
  Serial.println(SW_50);
  Serial.print("SW_51 = ");
  Serial.println(SW_51);
  Serial.print("SW_52 = ");
  Serial.println(SW_52); 
  Serial.print("SW_53 = ");
  Serial.println(SW_53); 
  Serial.print("SW_54 = ");
  Serial.println(SW_54); 
  Serial.print("SW_55 = ");
  Serial.println(SW_55);
  Serial.print("SW_56 = ");
  Serial.println(SW_56);
  Serial.print("SW_57 = ");
  Serial.println(SW_57);
  Serial.print("SW_58 = ");
  Serial.println(SW_58); 
  Serial.print("SW_59 = ");
  Serial.println(SW_59); 
  Serial.print("SW_60 = ");
  Serial.println(SW_60);
  Serial.print("SW_61 = ");
  Serial.println(SW_61); 
  Serial.print("SW_62 = ");
  Serial.println(SW_62); 
  Serial.print("SW_63 = ");
  Serial.println(SW_63); 
  Serial.print("SW_64 = ");
  Serial.println(SW_64);  
 
}

*.h

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

#ifndef SD_PIN_lib
#define SD_PIN_lib

class SD_PIN
{
  public:
     SD_PIN();
     void Init();
     
      int SCAN_SD();         //  dans le setup du main ino

  private:

    const byte BUFFER_SIZE = 32;     /* Taille du buffer */
     
    /* Variables d'exemple qui seront chargé depuis le fichier de configuration */
    int SW_1 = 0, SW_2 = 0, SW_3 = 0, SW_4 = 0, SW_5 = 0, SW_6 = 0, SW_7 = 0, SW_8 = 0, SW_9 = 0, SW_10 = 0;
    int SW_11 = 0, SW_12 = 0, SW_13 = 0, SW_14 = 0, SW_15 = 0, SW_16 = 0, SW_17 = 0, SW_18 = 0, SW_19 = 0, SW_20 = 0;
    int SW_21 = 0, SW_22 = 0, SW_23 = 0, SW_24 = 0, SW_25 = 0, SW_26 = 0, SW_27 = 0, SW_28 = 0, SW_29 = 0, SW_30 = 0;
    int SW_31 = 0, SW_32 = 0, SW_33 = 0, SW_34 = 0, SW_35 = 0, SW_36 = 0, SW_37 = 0, SW_38 = 0, SW_39 = 0, SW_40 = 0;
    int SW_41 = 0, SW_42 = 0, SW_43 = 0, SW_44 = 0, SW_45 = 0, SW_46 = 0, SW_47 = 0, SW_48 = 0, SW_49 = 0, SW_50 = 0;
    int SW_51 = 0, SW_52 = 0, SW_53 = 0, SW_54 = 0, SW_55 = 0, SW_56 = 0, SW_57 = 0, SW_58 = 0, SW_59 = 0, SW_60 = 0;
    int SW_61 = 0, SW_62 = 0, SW_63 = 0, SW_64 = 0;
    
};
#endif

OK

au lieu de câbler en dur vos variables ce qui rend l'accès et l'analyse difficile

je créerai une classe (ou structure) de stockage d'une liste de clef/valeur (à la main car sur petit arduino on n'a pas accès aux classes container avancées du C++ comme les vecteurs etc)

struct ClefValeur {
  const char * clef;
  byte valeur;
};

Cette structure/classe ClefValeur pourrait être augmentée pour fournir des accesseurs pour lire la valeur, la clé ou mettre une nouvelle valeur.

Vous pourriez instancier un tableau de clefs avec vos noms de broches

ClefValeur lesBroches[] = {
  {"SW_1", 0}, {"SW_2", 0}, {"SW_3", 0}, {"SW_4", 0}, {"SW_5", 0}, {"SW_6", 0}, {"SW_7", 0}, {"SW_8", 0},
  {"SW_9", 0}, {"SW_10", 0}, {"SW_11", 0}, {"SW_12", 0}, {"SW_13", 0}, {"SW_14", 0}, {"SW_15", 0}, {"SW_16", 0},
  {"SW_17", 0}, {"SW_18", 0}, {"SW_19", 0}, {"SW_20", 0}, {"SW_21", 0}, {"SW_22", 0}, {"SW_23", 0}, {"SW_24", 0},
  {"SW_25", 0}, {"SW_26", 0}, {"SW_27", 0}, {"SW_28", 0}, {"SW_29", 0}, {"SW_30", 0}, {"SW_31", 0}, {"SW_32", 0},
  {"SW_33", 0}, {"SW_34", 0}, {"SW_35", 0}, {"SW_36", 0}, {"SW_37", 0}, {"SW_38", 0}, {"SW_39", 0}, {"SW_40", 0},
  {"SW_41", 0}, {"SW_42", 0}, {"SW_43", 0}, {"SW_44", 0}, {"SW_45", 0}, {"SW_46", 0}, {"SW_47", 0}, {"SW_48", 0},
  {"SW_49", 0}, {"SW_50", 0}, {"SW_51", 0}, {"SW_52", 0}, {"SW_53", 0}, {"SW_54", 0}, {"SW_55", 0}, {"SW_56", 0},
  {"SW_57", 0}, {"SW_58", 0}, {"SW_59", 0}, {"SW_60", 0}, {"SW_61", 0}, {"SW_62", 0}, {"SW_63", 0}, {"SW_64", 0}
};
constexpr size_t nombreDeBroches = sizeof lesBroches / sizeof * lesBroches;

la classe SD_PIN dans son constructeur pourrait prendre un tableau de ClefValeur et le nombre de clefs en paramètre

class SD_PIN
{
  private:
    const byte BUFFER_SIZE = 32;     /* Taille du buffer */
    ClefValeur* clefs
    const size_t nombreDeClefs;

  public:
     SD_PIN(ClefValeur* clefs, const size_t n) ;

que vous implémentez sous la forme

SD_PIN:: SD_PIN(ClefValeur* clefs, const size_t n) : clefs(clefs), nombreDeClefs(n) {}

ainsi dans la classe SD_PIN au lieu de câbler en dur l'identification de clés

vous n'auriez qu'à faire une boucle sur les nombreDeClefs entrées du tableau des ClefValeur pour voir si vous reconnaissez une des clés. Le code serait beaucoup plus court et la classe simplement adaptable au rajout ou suppression de clé puisque c'est ce que vous mettez comme texte dans le tableau qui définit les clés.

Une fois l'analyse effectuée, vous avez directement accès au tableau des clés qui serait un peu le SWITCH_CASE_X dont vous parliez.

hello
pour moi, c'est plutôt brouillon ...
si je comprends bien,
en clair cela donne:
64 switchs qui doivent déclencher une action parmi 4 possibles selon la valeur d'une case mémoire parmi 64 cases .
Ces 64 cases mémoires ayant été initialisées avec des valeurs allant de 1 à 4 récupérées sur une carte SD.
est ce bien ça?

on suppose le switch 44 actionné, la case qui s'y rapporte disons case 44 contient la valeur 3.
donc le switch 44 doit exécuter l'action qui par exemple allume une ampoule.
quelle est l'action qui doit éteindre l'ampoule?

on suppose le switch 21 actionné, la case qui s'y rapporte disons case 21 contient la valeur 1.
donc le switch 21 doit exécuter l'action qui par exemple incrémente un score de 10000
le score est incrémenté de 10000 puis affiché.

c'est bien cela qu'il faut comprendre ?

Hellob à tous
JLM & Dfgh... oui c est exactement ca. En revanche eteindre l ampoule sur le sujet 44 n'est pas a gérer.

Je vais prendre prendre tous vos conseils ainsi que la mise a jour du code pour reconstruire correctement cette CLASS. J ai recu le PCB , cela sera plus simple pour les tests que le proto filaire.

En vous remerciant. Pas facile de birn voir sur le téléphone et je n ai clairement pas votre experience d'où l effet brouillon vu ( j en suis conscient) .

Merci je reviens avec le resultat et probablement des questions afin que je pige bien le code.

Thx

Chris

hello
je n'ai pas réussi à mettre sous forme fonctionnelle la procédure de J-M-L .

chris

c'est à dire ? vous voulez des fonctions au lieu d'une classe ?
où vous n'avez pas réussi à faire fonctionner cette approche ?

Bonjour
Tout mon code fonctionne en CLASS ce qui me permet d'être mieux organisé.
Dans le cas de l extraction des données de cette Carte SD, je souhaite que les fonctions dédiées me permettant d obtenir les data de la SD soient dans le CPP et le h associé.
Apres je pense suite à la lecture de votre 1er mail, que ma méhode est loin d'être la plus simple (voire totalement inefficace pour le résult attendu).

Je pense qu il est préférable d'écrire mes données ainsi

1 = 0, 1, 2 ou 4.. au lieu de sw_1 = 0 1 2 ou3

Traduction.. le switch 1 pourra prendre la valeur 0 1 2 ou 3 via une fonction ce 1 et du genre xx (sw, valeur);

Sw de 1 à 64

Valeur 0 1 2 ou 3

J ai véritablement essayé de mettre en place vos conseil, mais je n ai pas reussi..

Je mettrai ce soir le code complet ino + cpp + h dans un zip

Chris

Vers la CLASS B SWICTH CASE de mon code

Le souci c’est que vos classes ne sont pas super "objet".

Si vous avez une classe qui est supposée encapsuler l’accès aux données alors vous devriez conserver les données dans cette classe et fournir des accesseurs, pas avoir une autre classe type container dans laquelle vous feriez une recopie des données. A quoi ça sert d’avoir les infos 2 fois en RAM?

Si vous pouviez envoyer en binaire ce serait même encore plus simple.

Envoyer en RAM car je ne connais que cette méthode, je suis tres loin de vos connaissances, cela ne permet pas d arriver a vos codes optimisés.
En binaire, je n ai pas de souci à partir du moment ou sur la SD la liste des infos se presente ainsi:

1 = 0
2 = 3
3 = 1

A l issue je compare la colonne de gauche dans un SWITCH CASE et je me sert de lanseconde variable if ( xxxx ) { yyy } pour lancer la rotation d un moteur.. les 0 1 2 3
Correspondent à des vitesses du moteur.

Chris

Ça c’est de l’ascii

Je voulais dire en un seul octet vous pourriez coder votre commande
6 bits pour les 64 possibilités et 2 bits pour les 4 choix.

La lecture est ainsi hyper simple et efficace et la place mémoire très optimisée

Ok.. a part que je ne sais pss faire.

Chris

avez vous besoin que le fichier sur la carte SD soit lisible par un humain ?
est-ce que ce fichier est créé par votre code, et relu par votre code uniquement ?

vous déclarez une structure comme cela

struct CommandeSwitch {
  uint8_t switchID : 6; // le N° du switch de 0 à 63
  uint8_t commande : 2; // la commande de 0 à 3
} ; 

et les commandes peuvent avoir des noms "parlants"

enum : uint8_t {AUCUNE_COMMANDE = 0, COMMANDE1 = 1, COMMANDE2 = 2, COMMANDE3 = 3};

vous pouvez avoir un tableau de 64 CommandeSwitch

const byte nbSwitches = 64;
CommandeSwitch lesSwitches[nbSwitches];

et vous pouvez l'initialiser comme cela par exemple

for (uint8_t i=0; i < nbSwitches; i++) {
  lesSwitches[I].switchID = i;
  lesSwitches[I].commande = AUCUNE_COMMANDE;
}

l'avantage c'est que vous pouvez sauver ce tableau d'un seul coup dans un fichier en faisant un write et le relire de la même façon avec un read ou vous pouvez accéder dans le fichier à un switch donné (puisque tout tient sur un seul octet) en avançant dans le fichier du bon nombre d'octets (par exemple aller à l'octet 10 pour lire ce qui concerne le switch 10)