comunicazione sd e display 16x2

ciao ragazzi avrei bisogno di un aiuto, ho : un arduino uno, una ethernet shield che sfrutto per lo slot della micro sd e un display 16x2 acm1602b.
quello che vorrei fare è:
scrivere un file nella sd e visualizzarlo sul display.
i collegamenti li sono già riuscito a fare, c’è stato qualche problema perchè i pin necessari alla sd servivano anche per il display, ma sono riuscito a sistemare questo.
ho provato con questo codice ma nella prima riga mi mette “-1” e vorrei che venisse scritto il contenuto della sd

#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>

File myFile;
LiquidCrystal lcd(9, 5, 7, 6, 3, 2);

void setup() {
   Serial.begin(9600);
   while (!Serial) {
    ; 
  }
  
lcd.begin(16, 2);
  Serial.print("Initializing SD card...");
 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  myFile = SD.open("test.txt", FILE_WRITE);
  

    
    myFile.close();
    Serial.println("done.");
 
  
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
   
  } else {
    Serial.println("error opening test.txt");
  }
  // set up the LCD's number of columns and rows: 
  
  // Print a message to the LCD.
  lcd.print(myFile.read());
 
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

come posso fare? grazie!

Prova così:

#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>

File myFile;
LiquidCrystal lcd(9, 5, 7, 6, 3, 2);

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; 
  }
  lcd.begin(16, 2);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  myFile = SD.open("test.txt", FILE_WRITE);
  myFile.close();

  Serial.println("done.");
  lcd.clear();
  lcd.setCursor(0, 0);

  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    while (myFile.available()) {
      char c = myFile.read();
      Serial.write(c);
      lcd.print(c);
    }
  } 
  else {
    Serial.println("error opening test.txt");
  }
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}

Prima stampa e poi parte il conteggio.
Vuoi fare le cose in contemporanea?

il conteggio non mi serve, mi ritornava solo utile perchè almeno ero sicuro che il display stesse andando effettivamente e non rimaneva la scritta precedente, anche perchè poi mi servirà anche che venga scritto sulla seconda riga,adesso provo, grazie:)

ho provato, funziona, appare la scritta sulla prima :slight_smile:
ora cancello la parte con il conteggio, come faccio a far andare a capo e far continuare sulla seconda colonna?

Devi usare un indice; quando arriva a 16 sposti il cursore sulla seconda linea.
Se invece vuoi simulare uno scroll devi effettuare un’operazione un po’ più complessa.

come posso fare a fare quell’indice?
ti spiego… io vorrei fare in modo da poter caricare un file di testo anche lungo sulla sd… magari anche 50-100 righe o più ( e ogni volta potrebbe cambiare, quindi sarebbe meglio non dividerli in singole lettere), e, visualizzare il testo in modo da avere 16 caratteri sulla prima, 16 sulla seconda, e, se è possibile, fare uno scrolling verticale ogni volta che premo un pulsante su arduino, se lo premo, mi fa slittare la seconda riga sulla prima e sulla seconda fa apparire il seguito del testo, sarebbe possibile?

1 Like

Potresti leggere tutto il file e metterlo in memoria ma a seconda delle dimensioni la memoria si esaurirebbe.
Oppure di volta in volta che azioni un pulsante rileggi il file fino al punto in cui sei arrivato. Ti serve una o più variabili dove memorizzare le righe da visualizzare e le righe successive.

tradotto in codice come potrei far dividere il testo in righe ogniuna di 16 caratteri?
potrei anche fare in modo che il file di testo sia già scritto in righe da 16 caratteri ognuna, però dovrei capire come farla visualizzare sul display riga per riga, sapreste aiutarmi?

Vedi qui --> How to read a TXT file by line? - Storage - Arduino Forum
Avrai 2 buffer da 16. Quando uno termina una scrivi sull'altro alternativamente e li stampi su lcd.
Per scrivere su una riga dell'LCD posizioni il cursore all'inizio della stessa e gli invii 16 caratteri. semplice.