Bonjour à tous,
je cherche à démarrer la lecture d'un fichier txt sur une ligne aléatoire impaire.
je vous livre ici mon code en grande partie codé par (encore merci Kamill) :
void loop() {
fichierSD = SD.open("test.txt");
static int ligne = 0;
int a;
while (fichierSD.available()) {
char c = fichierSD.read();
if (c == "\n")
{
ligne = (ligne + 1) % 2; // nouvelle ligne
if (ligne == 0)
delay(7000);
if (ligne == 0)
display.clearDisplay();
else
ligne = (ligne * 15);
display.setTextSize( 2 );
display.setCursor(0, ligne);
}
else
{
display.setTextSize( ligne / 7 );
display.setTextColor( WHITE );
display.print(c);
display.display();
}
}
}
J'ai un bout de code qui donne un nombre aléatoire jusqu'à 300...
Merci pour votre réponse J-M-L,
je vais appliquer ""(testez modulo 2 == 0) - ajoutez 1 et il sera aléatoire et impair"".
dés que j'aurai atteint ce stade...
Avant ça, j'ai un problème, je ne sais pas accéder à un numéro de ligne de mon fichier txt.
Pensez-vous que cela est possible avec mon code actuel ?
#include <Adafruit_SSD1306.h>
#include <SD.h>
File fichierSD;
#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );
void setup() {
SD.begin(3);
display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
display.clearDisplay();
}
void loop() {
fichierSD = SD.open("test.txt");
static int ligne = 0;
while (fichierSD.available()) {
char c = fichierSD.read();
if (c == '\n')
{
ligne = (ligne + 1) % 2; // nouvelle ligne
if (ligne == 0)
delay(3500);
if (ligne == 0)
display.clearDisplay();
else
delay(2000);
ligne = (ligne * 15);
display.setTextSize( 2 );
display.setCursor(0, ligne);
}
else
{
display.setTextSize( ligne / 7 );
display.setTextColor( WHITE );
display.print(c);
delay(1);
display.display();
}
}
}
Mentalement, je ne modélise pas, en langage C encore moins.
Dois-je créer une variable qui compte les \n ?? je suis beaucoup perdu !
Ps : mon avatar c'est : "En programmation je suis un enfant de 5 ans"
Votre code cherche les '\n' qui sont les marques de fin de ligne - donc oui il suffirait avant le while de générer ce nombre aléatoire impair, puis de compter un certain nombre de marques de fin de ligne et voilà. Faudra gérer le cas où votre nombre aléatoire est après la fin du fichier cependant, saut si vous savez avant combien de lignes max vous avez (calculable en parcourant une fois le fichier avant)
Merci pour votre explication J-M-L,
je reviens vers vous car j'ai mon chiffre aléatoire "randNumber"
mais je ne sais pas compter le nombre de '\n' ,
je ne sais pas non plus démarrer la lecture du fichier txt à la ligne voulue.
void loop() {
fichierSD = SD.open("test.txt");
static int ligne = 0;
randNumber = random(50);
while (fichierSD.available()) {
char c = fichierSD.read();
if (c == '\n')
{
ligne = (ligne + 1) % 2; // nouvelle ligne
if (ligne == 0)
delay(3500);
if (ligne == 0)
display.clearDisplay();
else
delay(2000);
ligne = (ligne * 15);
display.setTextSize( 2 );
display.setCursor(0, ligne);
}
else
{
display.setTextSize( ligne / 7 );
display.setTextColor( WHITE );
display.print(c);
delay(1);
display.display();
}
}
}
j'ai bien essayé : if (c == '\n' * randNumber) ... mais sans succès.
Si le caractère lu est égal a la valeur du caractère "retour à la ligne" multiplié par un nombre aléatoire....
Sérieusement vous pensez que ça va compter les lignes? Un "retour à la ligne" restera toujours un "retour à la ligne" même si c'est le 30eme que vous lisez...Le caractère dans le fichier est le même...
Essayez d'exprimer en français avec des opérations élémentaires ( des tant que, lire un caractère, comparer, ajouter 1, si alors ...) ce que vous voulez faire
Merci à nouveau J-M-L
mais votre réponse dépasse mes compétences.
Quand j'ai posté mon problème, j'étais dans le brouillard, désormais, je suis dans la nuit..
Si je peux réitérer ma demande plus simplement :
-Est-il possible de démarrer la lecture d'un fichier txt
à partir de la ligne n* 13 et de l'afficher sur l'écran oled à la ligne n* 1,
comme le propose mon code. (sauf que celui-ci démarre à la ligne n*1 du fichier txt).
#include <Wire.h>
#include <Event.h>
#include <Timer.h>
#include <Adafruit_SSD1306.h>
#include <SD.h>
File fichierSD;
#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );
void setup() {
SD.begin(3);
display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
randomSeed(analogRead(0));
display.clearDisplay();
}
void loop() {
fichierSD = SD.open("test.txt");
static int ligne = 0;
int n = 13; // MA LIGNE DE DEBUT DE LECTURE
while (fichierSD.available()) {
char c = fichierSD.read();
if (c == '\n')
{
ligne = (ligne + 1) % 2; // nouvelle ligne
if (ligne == 0)
delay(3500);
if (ligne == 0)
display.clearDisplay();
else
delay(2000);
ligne = (ligne * 15);
display.setTextSize( 2 );
display.setCursor(0, ligne);
}
else
{
display.setTextSize( ligne / 7 );
display.setTextColor( WHITE );
display.print(c);
delay(1);
display.display();
}
}
}
Si oui, je suis preneur d'une solution (un bout de code voir un emplacement)
Je vais essayer d'avancer par déduction.
-Quand formuler la demande n'est pas simple, comprendre les réponses, les tout autant.
Ce que vous écrivez c'est si le caractère lu est le passage la ligne, alors ne rien faire
Incrementez i
Boucler
--> donc vous lisez 13 caracteres et sortez du while
La raison: il y a un ; de trop après le if - si vous pressiez ctrl-T dans l'éditeur pour indenter correctement le code, vous auriez pu voir que l'incrémentation de i n'est pas dans le bloc du if... une bonne raison pour indenter son code...
La première qui va 'avaler' les 13 première lignes et qui n'affichera rien - vous avez quasiment le code pour cela si vous virez votre tentative d'affichage du texte
Puis une seconde qui continue lire le fichier une fois passer le 13ème '\n' et qui va afficher tout jusqu'à rencontrer le 15ème '\n' et s'arrêter là (si vous voulez afficher 2 lignes)
Ouvrir le fichier en lecture
nb = 0
Tant que nb < 13
Lire caractère
Si caractère == retour à la ligne incrémenter nb
Fin tant que
// ici on a lu 13 retour à la ligne
nb = 0
Tant que nb < 2
Lire caractère
Si caractère == retour à la ligne
Incrémenter nb
Si nb == 1 passer à la ligne sur le LCD
Sinon afficher caractère
Fin tant que
// ici on a lu 2 lignes
Fermer le fichier
Idéalement il faut aussi tester le cas si vous arrivez la fin du fichier ou erreur de lecture en cours de route car la sortie des "tant que" dépend de si vous trouvez assez de retour à la ligne et donc dans ce cas vous seriez dans une boucle infinie