Afficher chaine de caractère - txt > lcd

Bonjour à tous,
aujourd'hui je souhaite afficher sur les deux lignes d'un lcd 16x2,
des lignes de texte d'un fichier txt de la carte SD.
Je nage dans la conversion de chaine...

Voici le code :

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;



void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);

}

void loop() {
  fichierSD = SD.open("test.txt", FILE_READ);
  while (fichierSD.available()) {
    Serial.write(fichierSD.read());
    lcd.setCursor(0, 0);
    lcd.print(fichierSD.read());
     delay(500);
  }
}

je n'y arrive pas...mon écran affiche des chiffres.

Bonjour,

read() retourne un int. Pour l'afficher en caractere il faut le caster en char

   Serial.write((char)fichierSD.read());

    lcd.print((char)fichierSD.read());

Remarque: tu ne peux pas relire plusieurs fois le même caractère car dans tel que ton programme est fait tu affiches un caractère sur deux sur la liaison série et un caractère sur deux sur le lcd.

Merci Kamill, j'avance...à petits pas.
j'ai modifié le code :

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;

void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
  fichierSD = SD.open("test.txt", FILE_READ);
  while (fichierSD.available()) {
  lcd.print((char)fichierSD.read());
  delay(500);
  }
}

j'ai encore un souci :
le texte s'affiche sans prendre en compte la taille de l'écran.(il continu d'écrire dans le vide)
Je souhaiterai que le code affiche mon texte
au fur et à mesure, ligne par ligne sur les 2 lignes de mon lcd 16x2.
PS : chaque ligne de mon fichier txt fait moins de 16 caractères.
j'ai essayé "Ligne 1 \n Ligne 2 \n Ligne 3 ..." dans mon txt mais rien y fait.

Si tes lignes de texte dans ton fichier se terminent par un line feed tu peux changer de ligne chaque fois que tu reçoit un line feed.

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;

void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
  static int ligne=0;
  fichierSD = SD.open("test.txt", FILE_READ);
  while (fichierSD.available()) {
    char c=fichierSD.read();
    if (c=='\n')
    {
      ligne=(ligne+1)%2;      // nouvelle ligne
      if (ligne==0)
        lcd.clear();
      else
        lcd.setCursor(ligne,0);
    }
    else
    {
      lcd.print(c);
    }
    delay(500);
  }
}

Si tu veux faire scroller le texte c'est possible mais un peu plus compliqué.

Merci Kamill, je fais quelques tests et reviens vers vous.

A nouveau merci Kamill,
je sors des tests enfin !!

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;

void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);
}
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
      delay(600);
      if (ligne==0)
      lcd.clear();
    else
       lcd.setCursor(ligne,1);
              }
   else
    {
     lcd.print(c);
    }
  }
}

La lecture fonctionne durant la première boucle.
Au démarrage de la seconde boucle
la ligne n2 du lcd n'apparaît pas, elle est remplacée par la ligne n3.

Ps : dés la première boucle, il y à un espace (non voulu) au début de la 2e ligne du lcd.

et la je pèche...

J'ai fait une petite erreur c'est lcd.setCursor(0,ligne); et non lcd.setCursor(ligne,1);

Bonsoir à tous,
et encore merci Kamill,
pour le temps passé a combler le vide sidérale,
dont je souffre en programmation.
Les modifs du code ont supprimé l'espace sur la ligne 2 du lcd. (j'aurai pu y pensé... mais non...(

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;

void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);
}
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
      delay(300);
      if (ligne==0)
      lcd.clear();
    else
       lcd.setCursor(0,ligne);
 }
   else
 {
     lcd.print(c);
 }
}
}

En revanche le code tourne bien durant la première boucle,
à la seconde boucle,
la ligne 2 du fichier txt n'est pas imprimée,
le programme passe directement à la 3e ligne du fichier txt
et l'imprime en ligne 2 du Lcd (soit la ligne 1 du code).
A la boucle suivante tout fonctionne à nouveau et ainsi de suite.

Tu es sur du contenu du fichier, il n'y aurait pas plusieurs line feed à la fin des lignes ?

Autant pour moi, j'ai oublié un CR+LF à la dernière ligne du txt.
D'ou le décalage de ligne une fois sur deux boucles...
Le code fonctionne:

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
File fichierSD;

void setup() {
  SD.begin(3);
  lcd.begin(16, 2);
  Serial.begin(9600);
}
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
      delay(2000);
      if (ligne==0)
      lcd.clear();

    else
       lcd.setCursor(0,ligne);

 }
   else
 {
    lcd.print(c);
 }
}
}

Sans vouloir transformer ce post en cours du soir,
y aurait il un moyen d'afficher les accents du txt.

Bonjour,

L'afficheur n'a pas de caractères accentués dans son générateur de caractère.
Pour afficher des caractères accentués avec ce type d'afficheur, il faut définir des caractères spéciaux (8 caractères max) et les afficher à la place des caractères accentués.

Je vais fouiller dans ce sens afin d'afficher les é et è.
Si je sèche, cela fera l'objet d'un prochain post.
Merci pour tout Kamill.