Bonjour,

Je suis en train d'essayer, me blâmer, de comprendre comment je pourraît interagir avec une carte SD sur une carte électronique. Arduino, et son shiend éthernet. Mais bon, c'est pour l'indication que je le met, plus que pour servir de point de départ !

Avec le site du constructeur, je suis arrivé à tester si la carte était présente, si elle avait bien un fichier. J'ai séparer ça dans des fonctions afin d'alléger l'initialisation qui deviendrais vraiment trop importante et qui nécessitais que l'on face ainsi pour le dépannage futur.

Au niveau des librairie, j'utilise la librairie SD.h expliqué en parti ici. Et enfin un exemple concret mais qui ne ressemble ni à mon code final ni à ce que je veux faire au final. Exemple.

Je vais essayer de synthétiser mon code, afin de ne mettre que ce qui concerne le fonctionnement de la carte SD et l'affichage LCD qui fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
 
/*
  Télécommande sur 433 Mhz bi-directionnelle
  ------------------------------------------
  
  Création : le 29 octobre 2012
  Version 1.0
  ------------------------------------------
  
            Pins utilisés
  TX1 -> Modem 433Mhz
  RX1 <- Modem 433Mhz
  SDA <-> Data I2C
  SCL <-> Horloge I2C
  
  SPI <-> Carte Ethernet / SD Card
  04 (PWM) -> Ethernet CS
  
  10 (PWM) -> Ethernet Librairie
  50 (Digit) -> Ethernet Librairie
  51 (Digit) -> Ethernet Librairie
  52 (Digit) -> Ethernet Librairie
  53 (Digit) -> Ethernet Librairie
  
  AN0 -> Voie 1
  AN1 -> Voie 2
  AN2 -> Voie 3
  AN3 -> Voie 4
  
  22 (Digit) -> Voie 5 = Btn On/Off/On 1
  23 (Digit) -> Voie 5 = Btn On/Off/On 1
  24 (Digit) -> Voie 6 = Btn On/Off/On 2
  25 (Digit) -> Voie 6 = Btn On/Off/On 2
  
  Pour infos:
  - Les voies analogiques sont reliée chacune à leur potar.
  
  - 22 et 23 Corresponde à un potar à 3 positions.
  - 00 = Milieu
  - 10 = Haut
  - 01 = Bas
  
  - 24 et 25 Corresponde à un potar à 3 positions.
  - 00 = Milieu
  - 10 = Haut
  - 01 = Bas
  
*/
 
/* INC */
#include <Wire.h>
#include <SD.h>
 
/* DEFINITIONS */
#define adresseLcd 0x63  //Ecran LCD
 
/* VARIABLES GLOBALES */
File myFile;
 
/* SETUP */
void setup() {
 
  //Lancer les ports séries
  Serial.begin(9600);  //Pour dépanner sur le port USB
  Serial1.begin(9600); //Pour gérer le modem
 
  //Initialiser l'écran LCD
  initLcd();  //Initialiser l'écran LCD
  ecrireLcd("Telecommande 433Mhz", 01);  //Ecrire
  ecrireLcd("Version 1.0", 24);  //Ecrire
  ecrireLcd("Bonjour", 66);  //Ecrire
 
  delay(2000);
 
  //Initialiser la carte SD
  if(initSD()) {
    testFichier("config.txt");
  }
 
  clearLcd();  //Effacer l'écran
}
 
/* LOOP */
void loop() {
}
 
/* FONCTION initLCD */
void initLcd() {
 
  //Initialisation de l'écran par I2C
  Wire.begin();  //Amorce la connection sur SDA et SCL
  Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
  Wire.write((byte)0x00);  //Assigne un null
  Wire.write((byte)0x0C);  //Effacer l'écran
  Wire.write((byte)0x13);  //Allume le rétro-éclairage
  Wire.write((byte)0x04);  //Ne pas afficher le curseur
  Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
}
 
/* FONCTION ecrireLcd */
void ecrireLcd(String texte, int positionEcran) {
 
  //Initialisation de l'écran par I2C
  Wire.begin();  //Amorce la connection sur SDA et SCL
  Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
  Wire.write((byte)0x00);  //Assigne un null
  Wire.write((byte)0x02);  //Placer le curseur
  Wire.write(positionEcran);  //Sur l'écran
  Wire.print(texte);  //Ecrire un texte
  Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
}
 
/* FONCTION ecrireLcdChar */
void ecrireLcdChar(char texte[32], int positionEcran) {
 
  //Initialisation de l'écran par I2C
  Wire.begin();  //Amorce la connection sur SDA et SCL
  Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
  Wire.write((byte)0x00);  //Assigne un null
  Wire.write((byte)0x02);  //Placer le curseur
  Wire.write(positionEcran);  //Sur l'écran
  Wire.write(texte);  //Ecrire un texte
  Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
}
 
/* FONCTION clearLcd() */
void clearLcd() {
 
  //Initialisation de l'écran par I2C
  Wire.begin();  //Amorce la connection sur SDA et SCL
  Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
  Wire.write((byte)0x00);  //Assigne un null
  Wire.write((byte)0x0C);  //Effacer l'écran
  Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
}
 
/* FONCTION initSD() */
boolean initSD() {
 
  clearLcd();  //Effacer l'écran
  ecrireLcd("Init SD Card...", 01);  //Ecrire
 
  //Si la carte n'est pas présente ou qu'elle est en défaut
  if(!SD.begin(4)) {
 
    //Afficher l'écran LCD
    clearLcd();  //Effacer l'écran
    ecrireLcd("Init SD Card failed", 01);  //Ecrire
    delay(1000);
    return false;
  }
 
  clearLcd();  //Effacer l'écran
  ecrireLcd("Init SD Card done", 01);  //Ecrire
 
  delay(1000);
  return true;
}
 
/* FONCTION testFichier(fichier) */
void testFichier(char fic[]) {
 
  clearLcd();  //Effacer l'écran
  ecrireLcd("Init File in SD...", 01);  //Ecrire
 
  //Ouvrir le fichier
  myFile = SD.open(fic, FILE_READ);
 
  //Si le fichier n'est pas présent
  if(myFile == false) {
 
    clearLcd();  //Effacer l'écran
    ecrireLcd("SD: File not found", 01);  //Ecrire
 
    /*
      peut tre remplacer par une demande d'apuie
      de bouton Valider pour passer à l'utilisation de la télécommande
    */
 
    for(;;); //Boucle infini
  }
 
  clearLcd();  //Effacer l'écran
 
  ecrireLcd("File in SD done", 01);  //Ecrire
 
  delay(1000);
}
 
/* FONCTION de lecture des configurations */
void lectureConf() {
 
 
}
Maintenant, je vais vous parler des configurations. Dans ma télécommande, je peux "true" ou "false" autoriser des mixages de voies. Donc on écrit pas 0 ou 1 mais bien true ou false. Ça c'est pour ma petite convention.

Ensuite, j'admet tout type de données. Texte, Chiffre, Byte, Binaire, Exadécimale...

Chaque modèles à sa propre ligne. Ainsi, si je dois gérer plusieurs modèles, il me faudra faire un fichier écrit de la façon suivante:
MODELE-01,Nom,Type,Conf1,Conf2,Conf3,Conf4...
soit:
MODELE-01,Robot Go,Robot,true,false,false,false...
MODELE-02,Minimog 02,Sous-marin,true,true,false,false...
MODELE-03,G-Bot,Robot,false,false,true,false...
DERNIER-MODELE,MODELE-02

Il faut bien sûr que j'implémente un switching sur MODELE-xx. Ceci permettant de passer d'un modèle à l'autre sans rebooter la télécommande. A voir plus tard.

Il faut aussi que je puisse récupérer chaque valeurs, sauf la première dans un tableau, sachant que la limite de longueur est un "\n".

Et enfin, il faut que je puisse modifier un true pour un false, ainsi de suite.

Donc ma première question, comment je pourrait écrire une petite fonction qui lise les modèles présent ? (Attention, DERNIER-MODELE,MODELE-02 est là pour pas changer de modèle à chaque redémarrage et donc, il faut le décompter des modèles à récupérer).

Pour moi qui suis débutant, je galère pas mal. J'insiste donc sur votre indulgence. Je reste ouvert s'il y a moyen de simplifier un peu dans mes fonctions.

Merci de votre patience.