Utilisation d'une carte SD

Bonjour à tous,

Je cherche une solution assez précise concernant un de mes projets.

J’ai créé un boitier fonctionnant grace à un arduino nano.
Le principe souhaité : un “precode” est envoyé par l’utilisateur et un code définitif lui est remis en retour.

Le fonctionnement est le suivant actuellement :
J’ai un écran LCD 2 lignes comme interface proposé à l’utilisateur et un clavier 4x3 permettant de faire une saisie.

Voici le code complet actuel :

#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4); 

const char bouton = 2;

const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
     {'1','2','3'},
     {'4','5','6'},
     {'7','8','9'},
     {'-','0','+'}
};

byte rowPins[ROWS] = {9, 4, 5, 7}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 10, 6};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

int compteur=0;
int lettre=0;

  char cle='A';
  char clea = 0;
  char cleb = 0;
  char clec= 0;

  char precode[4];



void setup() {

  lcd.init();
  lcd.backlight();
  
  
    lcd.setCursor(0,0);
    lcd.print("Precode:    ----");
    lcd.setCursor(0,1);
    lcd.print("Code : ----");

    pinMode(bouton,INPUT_PULLUP);

    Serial.begin(9600);
}







void loop() {


  char key = keypad.getKey();


     
  if (key=='-'||key=='+')
  {
     if (key=='-')
     { 
        if(lettre==1||lettre==0)
        {lettre=26;}
        else {lettre--;}
     }
      else if (key=='+')
      {
        if(lettre==26)
        {lettre=1;}
        else {lettre++;}
      }

            if(lettre==1){cle='A';}
            else if(lettre==2){cle='B';}
            else if(lettre==3){cle='C';}
            else if(lettre==4){cle='D';}
            else if(lettre==5){cle='E';}
            else if(lettre==6){cle='F';}
            else if(lettre==7){cle='G';}
            else if(lettre==8){cle='H';}
            else if(lettre==9){cle='I';}
            else if(lettre==10){cle='J';}
            else if(lettre==11){cle='K';}
            else if(lettre==12){cle='L';}
            else if(lettre==13){cle='M';}
            else if(lettre==14){cle='N';}
            else if(lettre==15){cle='O';}
            else if(lettre==16){cle='P';}
            else if(lettre==17){cle='Q';}
            else if(lettre==18){cle='R';}
            else if(lettre==19){cle='S';}
            else if(lettre==20){cle='T';}
            else if(lettre==21){cle='U';}
            else if(lettre==22){cle='V';}
            else if(lettre==23){cle='W';}
            else if(lettre==24){cle='X';}
            else if(lettre==25){cle='Y';}
            else if(lettre==26){cle='Z';}
    
    lcd.setCursor(12,0);
    lcd.print(cle);
    }

  else if ( key != NO_KEY)
  {
    if (compteur==0)
    {
      clea=key;
      lcd.setCursor(13,0);
      lcd.print(clea);
      compteur++;
      }

    else if (compteur==1)
    {
      cleb=key;
      lcd.setCursor(14,0);
      lcd.print(cleb);
      compteur++;
      }

    else if (compteur==2)
    {
      clec=key;
      lcd.setCursor(15,0);
      lcd.print(clec);
      compteur=0;
      }

    }

    if (digitalRead(bouton)==HIGH)
    {
      delay(50);
      char precode[]={cle,clea,cleb,clec};
      printf(precode,"%s.%s.%s.%s",precode[0],precode[1],precode[2],precode[3],precode[4]);
   }


 
}

Le but jusqu’ici étant d’enregistrer une chaine de 4 caracteres saisie par l’utilisateur comprenant lettre et chiffres. Jusqu’à présent tout va bien !
Du moins je le pense : tout fonctionne comme je le souhaite et comme je l’imaginais.

la saisie au clavier permet d’afficher en temps réel le precode alliant lettre et chiffre.
Un bouton de validation permet de conserver la saisie de l’utilisateur.

Mon problème :

Le but est de comparer cette chaine de caractere au fichier precode.txt enregistrée sur carte SD dont le format est le suivant :
"
A100
A200

"

pour récupérer la chaine de caractere à la ligne correspondante sur un fichier code.txt enregistrée sur cette meme carte SD avec un format similaire évidemment
"
0895
4587

"

Le but final étant évidemment de permettre à l’utilisateur de saisir son “precode” et de lui afficher en retour son “code” d’accès final sur l’afficheur.

Je découvre l’utilisation des cartes SD avec Arduino : et j’ai beau chercher, je ne parvient pas à trouver une solution.

Je sais ce que vous me direz : pourquoi ne pas créer un tableau pour effectuer cette comparaison ?
Tout simplement la taille : il existe environ 25000 combinaisons possibles qui renvoient toutes à un code parfaitement aléatoire, d’où l’intérêt d’utiliser une mémoire externe pour stocker ces données.

Vous remerciant par avance pour toute suggestion ou pour une aide :wink:
Bien cordialement,

Je découvre l'utilisation des cartes SD avec Arduino : et j'ai beau chercher, je ne parvient pas à trouver une solution.

Je ne vois pas ce qui pose problème. Lire le fichier ligne par ligne jusqu'à trouver le bon precode ?

Le soucis c'est qu'à la lecture du fichier, ca se passe pas par ligne mais au caractere.

Du coup, en admettant que je puisse récupérer par 4 caracteres ( et je vois pas trop comment le faire )
pour faire la comparaison, il faudra egalement que je puisse lire le deuxieme fichier pour afficher la correspondance.

Il suffit d'utiliser fgets().
Voir l'exemple fgets de la librairie SDFAT.

J'ai parcouru plusieurs exemples d'utilisation et j'ai suivi ton conseil :wink:

En revanche, j'ai bien peur que ca dépasse encore ma capacité de raisonnement habituelle ^^'

L'idée si je te suit, ce serait d'utiliser la fonction fgets() pour chercher la chaine de caractere c'est bien cela ?
A partir de la, j'imagines que mon idée première d'utiliser deux fichiers txt n'est pas nécessaire ?

si j'utilise un seul fichier txt et que j'utilise cette fonction pour tomber sur la chaine de caractere voulue, est ce que je peut utiliser une sorte de pointeur pour recuperer les 4 caracteres suivants par exemple ?

le fichier pourrait contenir :
A100-5895
A200-2587
.......

par exemple ?

il existe environ 25000 combinaisons possibles

Avec 12 touches et 4 chiffres le nombre de combinaison possibles est inférieur à 21000, mais cela ne change pas le problème.

Pourquoi ne pas mettre le tableau directement dans un fichier? Un tableau c'est la succession des valeurs, et pour avoir l'une d'elles, on en donne l'adresse, genre
valeur = table[precode]

Le précode donné est en base 12 (12 touches). La valeur peut être stockée dans un int en base 12 ou dans une suite de 4 caractères, 4 octets ou 4 quartets. Le fichier ferait alors 42ko ou 84ko.

Pour lire la valeur dont le précode est N dans un fichier, il faut simplement positionner la lecture sur le premier caractère et lire la valeur. Si la valeur est stockée sur N octets, pour faire:
valeur = table[precode]
il faut chercher du côté de
seek(precode*N);
read(valeur, N);
Pas besoin de lire toute la table, cela ira plus vite pour moins de code.

le fichier pourrait contenir :
A100-5895
A200-2587

Bien entendu, et fgets() te permettra de récupérer le couple. Ensuite tu peux récupérer les 4 premiers octets pour comparer avec la saisie et récupérer les 4 dernier octets si la comparaison est OK.

if(lettre==1){cle='A';}
            else if(lettre==2){cle='B';}
            else if(lettre==3){cle='C';}
            else if(lettre==4){cle='D';}
            else if(lettre==5){cle='E';}
            else if(lettre==6){cle='F';}
            else if(lettre==7){cle='G';}
            else if(lettre==8){cle='H';}
            else if(lettre==9){cle='I';}
            else if(lettre==10){cle='J';}
            else if(lettre==11){cle='K';}
            else if(lettre==12){cle='L';}
            else if(lettre==13){cle='M';}
            else if(lettre==14){cle='N';}
            else if(lettre==15){cle='O';}
            else if(lettre==16){cle='P';}
            else if(lettre==17){cle='Q';}
            else if(lettre==18){cle='R';}
            else if(lettre==19){cle='S';}
            else if(lettre==20){cle='T';}
            else if(lettre==21){cle='U';}
            else if(lettre==22){cle='V';}
            else if(lettre==23){cle='W';}
            else if(lettre==24){cle='X';}
            else if(lettre==25){cle='Y';}
            else if(lettre==26){cle='Z';}

ouch, tout ça s"écrit en une seule ligne :

cle = lettre - 1 + 'A';

c'est magique !