carte SD lecture/ écriture

Bonjour, je fais appel à votre aide et merci d'avance ! :slight_smile:
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 !! :slight_smile:

postez au moins un bout de code ou vous ouvrez le fichier et essayez de lire le contenu... on vous aidera ensuite à progresser...

Bonjour malox56

malox56:
je cherche donc à charger les valeur x , y et z de sauvegarde_01
pour les réutiliser dans des “int”

Attention au nom du fichier, sauvegarde_0, c’est 8 caractères + l’extension .TXT = 12 caractères, pas sensibles à la case)

le fichier utilisé dans l’exemple, SAUV_01.TXT contient:

x:111
y:222
z:333
xfl:222.25
yfl:123.65
zfl:445.12
abc:988

Un petit bout de code

#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

A ta disposition
Cordialement
jpbbricole

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 :slight_smile:

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 :confused:
"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

merci pour vos réponces

Votre image:

→ vous avez quoi dans votre carte? c’est ce qu’on voit en haut à droite? est-ce que le fichier est bien sauvé en format texte de base ?

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

Cordialement
jpbbricole

je teste avec le programme exemple j’ abtien ça :

avec le programme précédent et malgres de nombreux essaie avec des carte différente x9 su 10 j’obtien un résultat comme celui ci :confused:
http://zupimages.net/viewer.php?id=18/48/39eq.jpg

:s

passez la console série à 115200 bauds… (le popup en bas à droite)

39eq.jpg

ah super merci !!!
bon maintenant on voit mieux :

par contre les valeurs toujours non lues :s

Bon on va arrêter de poster des images et mettez juste du texte avec des copier coller…

pouvez vous postez votre code modifié?

je vous joins en PJ un fichier à mettre sur la SD

SAUV_01.TXT (60 Bytes)

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 :slight_smile:

pour créer ce fichier je l'ai fait à la main avec vi dans le terminal unix :slight_smile:

malox56:
seul la variable abc est inconnue et non affiché sur la console.

C'est fait exprès, c'est pour la démo.

Cordialement
jpbbricole

jpbbricole:
C'est fait exprès, c'est pour la démo.

:slight_smile: effectivement le code ne cherche pas de variable nommée abc !! ça explique tout

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 ^^

Bonsoir

Au fait @J-M-L, merci pour l'assistance :slight_smile: :slight_smile: , 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.

Cordialement, bonne soirée
jpbbricole

malox56:
pour rendre possible la recherche d'une valeur par ligne exemple : ligne 5 résultat 123.65

C'est à dire, je veux chercher la valeur de la variable y dans le fichier xxx.TXT?

Cordialement
jpbbricole