et pour le ficher sd, comment faire soit pour lire a l'envers soit pour ecrir en haut a chaque ajout ?
On ne peut pas écrire en haut à chaque ajout, on écrit toujours à la fin.
Tenez voici un bout de code de démo qui prend la technique du fichier d'index pour lire à l'envers.
(.ino attaché en PJ)
Il y a des constantes importantes pour la gestion des Index ou de l'affichage
const uint8_t nombreDeLignesAffichage = 10; // le nombre de ligne dans une page d'affichage
const uint8_t tailleMaxLigne = 80; // le nombre max de caractère dans une ligne de la page
L'idée est un affichage du fichier de log par 'pages' donc il faut connaître la taille d'une page. ici je dis qu'une page c'est 10 lignes.
Ensuite j'ai décidé de forcer un buffer de taille fixe par ligne pour l'affichage (pas forcément dans le log) est ici c'est 80.
Au début dans le setup il faut appeler prepareFichiersLog("bla bla bla en tête", booléen)
.
Si le booléen est vrai, on détruit les fichiers de logs s'ils existaient. (donc attention !)
Si le booléen est faux et que les 2 fichiers existent déjà, on ne fait rien, mais si un des deux fichier n'est pas là alors on détruit celui qui existe (attention donc!) et on prépare un fichier d'index avec juste 0x00000000 dedans puisque que ce sera le début de la première page du fichier de log et enfin on écrit l'en tête du fichier de log avec "bla bla bla en tête"
Une fois cela fait, il y a une fonction logMessage("ce que l'on veut mettre dans le log")
qui écrit dans le fichier de log et qui se charge de maintenir le fichier d'index pour vous. c'est ce qu'il faut utiliser dans le programme à chaque log. Attention il ne faut pas de saut de ligne au sein du message (il faut donc avoir bâti dans un cString ce que l'on veut écrire).
Dans ce fichier d'exemple, j'ai rajouté à la fin de prepareFichiersLog() un petit bout de code pour remplir mon fichier de log avec plus de 2000 lignes pour la démo
// ici on triche et on pré-rempli le fichier, à enlever bien sûr
char message[100]; // un buffer assez grand pour notre message
for (int i = 1; i < 2023; i++) { // 24 pages de 10, la dernière n'ayant que 7 lignes (ligne d'en tête dans le fichier de log)
sprintf(message, "%03d\tles valeurs sont A0=%d et A1=%d\t{%ld}", i, analogRead(A0), analogRead(A1), random(-32000, 32000));
logMessage(message);
}
Serial.println("Fichier de log de démo créé avec 2023 lignes");
cette création prend un peu de temps bien sûr car je voulais un fichier de log assez important.
Voilà. La loop est toute simple, elle attend un caractère sur la console série à 115200 bauds. tapez 'd' pour lire la page de début, 'f' pour lire la page de fin, '+' ou 's' pour lire la page suivante et '-' ou 'p' pour lire la page précédente.
Le fichier de log s'appelle "log.txt" et celui d'index associé est "_log.txt"
je vous laisse essayer (ne prenez pas votre carte SD de votre système, je ne veux pas être responsable de son effacement
)
Vous verrez que c'est assez rapide d'accéder à la dernière page ('f') et de remonter ('-') malgré le fait que l'on ait plus de 2000 lignes dans le fichier
essayez de faire 'f----+++----' par exemple et vous verrez que ça speed pas mal 
On pourrait envisager facilement un petit bout de code à exécuter une fois séparément qui lit votre fichier de log existant et construit l'index de façon à ce que vous puissiez intégrer la nouvelle fonctionnalité sans avoir à détruire le log existant.
SD_LogAndScroll.ino (8.86 KB)