Bonjour, je fais appel à votre aide et merci d'avance !
Je cherche à réutiliser des valeur inscrite dans un fichier txt se trouvant dans une carte sd monté à l' arduinomega 2560 r3.
exemple :
sauvegarde_01:
x:0
y:0
z:0
et j'aimerais faire un pilotage automatique " exemple "
imaginons que nous sommes en
x:100
y:100
z:100
la situation n'est pas réel mais dans un bute de compréhension
je cherche donc à charger les valeur x , y et z de sauvegarde_01
pour les réutiliser dans des "int"
Je vous remercie d'avance !!
#include <SPI.h> // Interface pour carte SD
#include <SD.h>
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define sdCardCsPin 9 // Chip Select du lecteur de carte SD à adapter
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
String logFileName = ""; // Nom du fichier d'enregistrement (Texte)
char logSdFileName[13]; // "" (char)
int x, y, z;
float xfl, yfl, zfl;
void setup()
{
Serial.begin(115200);
delay(500);
//------------------------------------- Demarrage carte SD
Serial.println("Initialisation carte SD...");
if (!SD.begin(sdCardCsPin)) // Si la carte SD ne repond pas
{
Serial.println("Carte SD out ou absente");
return;
}
Serial.println("Carte SD OK");
logFileName = "Sauv_01.txt"; // longueur max 8+3 caractères
logFileName.toCharArray(logSdFileName, 13);
////--------------------------------- Récupération des variables sutr carte SD
logFileLectureVariables();
Serial.println("Variable X = " + String(x));
Serial.println("Variable Y = " + String(y));
Serial.println("Variable Z = " + String(z));
Serial.println("Variable Xfl = " + String(xfl));
Serial.println("Variable Yfl = " + String(yfl));
Serial.println("Variable Zfl = " + String(zfl));
while(1){}
}
void loop()
{
}
void logFileLectureVariables()
{
String lineFromSd;
File dataFile = SD.open((String)logSdFileName, FILE_READ);
Serial.println("\nLecture " + (String)logSdFileName);
if (dataFile)
{
while (dataFile.available())
{
lineFromSd = dataFile.readStringUntil('\n');
String varName = lineFromSd.substring(0, lineFromSd.indexOf(":")); // On prends la partie gauche pour extraire le nom de la variable
varName.toUpperCase(); // Le nom de la variable, mise en majuscule
varName.trim(); // Enlever les espaces inutiles
String varValue = (lineFromSd.substring(lineFromSd.indexOf(":") +1)); // On prends la partie droite comme valeur
if (varName == "X")
{
x = varValue.toInt();
}
else if (varName == "Y")
{
y = varValue.toInt();
}
else if (varName == "Z")
{
z = varValue.toInt();
}
else if (varName == "XFL")
{
xfl = varValue.toFloat();
}
else if (varName == "YFL")
{
yfl = varValue.toFloat();
}
else if (varName == "ZFL")
{
zfl = varValue.toFloat();
}
else
{
if (varName != "") // Si pas ligne vide
{
Serial.println("Variable " + varName + " INCONNUE!!!");
}
}
}
}
else
{
Serial.println("BAD " + String(logSdFileName));
}
Serial.println("Fin lecture\n");
dataFile.clearWriteError();
dataFile.close();
}
Il y a certainement mieux à faire, mais c’est assez simple à comprendre et à manipuler
Dans le cadre des simplifications et pour prendre tout de suite de bonnes habitudes sur les petits micro-contrôleurs où la mémoire est limitée: il ne faut pas mettre des String partout quand il n'y en a pas besoin;
Par exemple:
String logFileName = ""; // Nom du fichier d'enregistrement (Texte)
char logSdFileName[13]; // "" (char)
...
logFileName = "Sauv_01.txt"; // longueur max 8+3 caractères
logFileName.toCharArray(logSdFileName, 13);
autant juste fairechar logSdFileName[] ="Sauv_01.txt"; ou si le nom n'est pas amené à changerconst char * logSdFileName ="Sauv_01.txt";
La majorité des fonctions savent traiter des cString (tableau de caractères terminés par un caractère nul) donc pas la peine de passer par un objet String pour cela: File dataFile = SD.open((String)logSdFileName, FILE_READ);la fonction sait travailler sur une cString directement donc File dataFile = SD.open(logSdFileName, FILE_READ);ça ira bien
Tous les Serial Print de ce genre Serial.println("Variable X = " + String(x));peuvent avantageusement (plus rapide à exécuter et moins de mémoire utilisée) s'écrire
Serial.print("Variable X = ");
Serial.println(x);
Voilà - vous verrez que moins vous aurez de Strings (avec un S majuscule) dans les code, mieux votre arduino se portera
Bonsoir et tout dabord merci de vos réponses mais j'ai toutefois un problème " ce ne serais pas drôle autrement ^^"
j'ai donc voulu dans un premier temps essayer le programme sans modification sauf le cs qui pour moi est au 53 "carte atmega2560 r3"
j'ai donc pris le programme gentiment codé par @jpbbricole , merci encore
mais voilà, le problème est que les valeurs affichés ne sont pas luent
"cf image en lien"
j'ai tester pour verrifier mon materiel avec la partie "exemple du logiciel arduino lecture et ecriture sur une carte sd" le matériel semble bon car il a fonctionné
J'aimerais svp que l'on m'explique :
lire que la ligne 1 ,
lancer la lecture que de la ligne 2
récuperer la valeur de la ligne 1
donner à X; la valeur de la ligne 1 afin de l'exploiter dans le programme
micro SD 2 GB marque : dane elec
en haut a droite vous voyez le bloc note avec se qui est inscrit dedans en bas a droite se qui es affiché par le moniteur en série lorsque celui ci s’exécute carte dans le dispositif, vous pouvez voir dans le titre du bloc note son nom et le format enregistré normalement il n'y a pas d'erreur :s
ce qui est bizarre c'est qu'on ne voit pas le résultat de
Serial.println("Carte SD OK");
dans la console.... pouvez vous poster votre code ici (pas sous forme d'image, c'est du texte) en utilisant les balises de code (lire comment utiliser le forum)
ce n'est pas parce qu'un fichier s'appelle .TXT qu'il ne contient pas du RTF ou un format exotique
Bonsoir malox56
[j'ai donc voulu dans un premier temps essayer le programme sans modification sauf le cs qui pour moi est au 53 "carte atmega2560 r3"
[/quote]
Pour ce qui est du hardware, 53 c'est OK.
Par contre, la trace de la console est bizzzzarre!
La console est à 9600 et le programme à 115200!
Le résultat dans la console m'indique que le fichier n'a pas été trouvé (réponses à 0) mais sans que ce texte apparaisse.
Au cas où le fichier n'est pas trouvé, il y a ceci:
Initialisation carte SD...
Carte SD OK
Lecture Sauv_22.txt BAD Sauv_22.txt
Fin lecture
Variable X = 0
Variable Y = 0
Variable Z = 0
Variable Xfl = 0.00
Variable Yfl = 0.00
Variable Zfl = 0.00
et quand tout est OK
Initialisation carte SD...
Carte SD OK
Lecture Sauv_01.txt
Variable ABC INCONNUE!!!
Fin lecture
Variable X = 111
Variable Y = 222
Variable Z = 333
Variable Xfl = 222.25
Variable Yfl = 123.65
Variable Zfl = 445.12
là tout fonctionne , seul la variable abc est inconnue et non affiché sur la console.
bien vu sur quand c est marqué sur la même ligne ça fonctionne
du coup c est le saut de ligne qui ne fonctionne pas"lecture" :s
bien vu sur quand c est marqué sur la même ligne ça fonctionne
je ne comprends pas ce que vous voulez dire par là??
Donc si ça marche avec ce fichier, cela voudrait dire que votre fichier est dans un format bizarre...
j'utilise pas de PC (suis sur Mac) donc "bloc note" je ne fréquente pas.. il doit y avoir sans doute moyen de lui dire de stocker en format ASCII simple ?
si vous voyez mon fichier tout sur une ligne, c'est que les PC et Mac ne sont pas trop d'accord sur ce qui représente un passage à la ligne
pour créer ce fichier je l'ai fait à la main avec vi dans le terminal unix
voila la façon que vous m'avez envoyez
x:111y:222z:333xfl:222.25yfl:123.65zfl:445.12abc:988
j'avais écris de cette façon :
x:111
y:222
z:333
xfl:222.25
yfl:123.65
zfl:445.12
abc:988
est il possible de rentre la lecture celon l'exemple 2
x
y
z
pour rendre possible la recherche d'une valeur par ligne exemple : ligne 5 résultat 123.65
le format .txt marche pour windows et mac je suppose ^^
Au fait @J-M-L, merci pour l'assistance , je suis parti dîner (souper chez nous) et, après la vaisselle, je suis revenu et le problème était quasiment résolu, merci.