Lettura file su SD card e inserimento su stringa

Salve ragazzi vi spiego il problema.

su un file x.txt GIA' presente su SD card vorrei leggere il suo contenuto ( 1 sola riga massimo 15-20 caratteri ) e trasferirla su di una variabile STRINGA che poi verrà fatta visualizzare sul display RGB

tutta la parte di funzionamento SD è OK tutta la parte di visualizzazione della stringa è OK ( ovviamente è testata con una stringa già inserita nello sketch )

lo scopo è quello di inserire un messaggio pubblicitario ( ad esempio ) e farlo comparire quando necessario.

ovviamente un conto è ricompilare lo sketch un conto che una volta finito si inserisce la sd card con il file e tutto è risolto.

Ovvio che il nome del file è obbligatori e stabilito ( ad esempio il file sulla SD deve chiamarsi che ne so BANNER.TXT ed il codice funziona solo se il fila presente si chiama in quel modo )

Ora arriviamo all'errore che sono certo saprete aiutarmi nel correggere

questo è il codice SBAGLIATO (ovvero dà errore )

void banner ()
{
    if (!SD.begin(38)) {
//    Serial.println("initialization failed!");
    return;
    
      // open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
 //   Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      char   stringa[20] ;
      stringa   = myFile.read();
    }
    // close the file:
    myFile.close();
  } else {
   // if the file didn't open, print an error:
   stringa[]   = "no message";
  }

ovvio che l'errore è qui

char   stringa[20] ;
      stringa   = myFile.read();

ora mi chiedo

siccome la procedura di read è dentro un ciclo di while (ovvero legge un carattere alla volta finchè ce ne sono ) e nello sketch originale che trovante dentro la cartella ESEMPI di arduino subito lo stampa allora mi chiedo come far "accumulare carattere dopo carattere il contenuto dentro la variabile stringa ?

grazie mille

Daniele

Non hai messo la cosa più importante. L'errore! :D char stringa[20] andrebbe messo prima dell' while, qui stai dichiarando la variabile stringa come char e stabilisci che al massimo può contenere 20 caratteri e glielo dici ogni volta che legge un char dal file .... ho capito!! basta 1 volta :) ma poi manca in ogni caso il puntatore E ancora ... non volevi trasferire i char del file in una stringa? char è char, String è String sono 2 cose molto diverse

char c; 
String inString = ""; 
...
...
...
while (myFile.available()) {
 c = myFile.read();   
          inString += c; // questo accumula i char dentro la stringa
          //oppure 
          inString += myFile.read(); 
...
...

siccome la procedura di read è dentro un ciclo di while (ovvero legge un carattere alla volta finchè ce ne sono ) e nello sketch originale che trovante dentro la cartella ESEMPI di arduino subito lo stampa allora mi chiedo come far "accumulare carattere dopo carattere il contenuto dentro la variabile stringa ?

Ci saranno milioni di esempi su google, la procedura vale per qualsiasi cosa arrivi in modo seriale - Da SD card - Da porte seriali 232-485 - Da Wifi - Da Ethernet http - Da SPI - Da I2C

Grazie mille ovviamente FUNZIONA !

Per appronfondire di più cosa avrei dovuto cercare googlando ?

Accumulare caratteri in una stringa ?

Grazie mille

cosa avrei dovuto cercare googlando ? Accumulare caratteri in una stringa ?

esatto aahahahahha

http://www.lmgtfy.com/?q=arduino+accumulare+caratteri+stringa il primo link :) :) « Reply #4 on: November 25, 2012, 01:41:27 pm »

oppure "arduino char to string"

ciao

problemino con dati su sd card…

salvo un file contenente un numero abbastanza grande su sd card…
riapro il file, stampo quel numero sul serial monitor…tutto ok

se volessi usare quel numero per delle operazioni matematiche, posso farlo?

sto usando unsigned long…ma non riesco a farci niente…
ma quando riapro in lettura un file su sd card, arduino come me lo legge?

scusatemi ragazzi se insisto ma le sto provando tutte.......non riesco a trasformare un numero di 10 cifre che scrivo su sd card in un numero da trattare come tale, variabile unsigned long, per fare delle operazioni maematiche....

tutto nasce dal fatto di aver trovato nella libreria del rtc ds 3231 la funzione time_t che mi restituisce in secondi il tempo...... con la pressione di un button ho salvato l'istante in cui premo il button su sd card....

ora lo leggo ma lo devo trasformare in numero reale per sommare altro tempo in secondi....

mi aiutate per favore?

lino

http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib_1gaea44aa48bda8261f794dcb2d1e7ab2b2.html

Inoltre la classe File della libreria SD estende Stream, ma purtroppo questa non include un readUnsignedLong come servirebbe a te :(.

SukkoPera: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib_1gaea44aa48bda8261f794dcb2d1e7ab2b2.html

SukkoPera: mi piace di più come è fatto il sito ufficiale gnu (e non quello di Atmel) della AVR libc ... e mi sembra più leggibile anche la funzione da te indicata ...

Naturalmente ... a mio gusto personale :grin: :grin: :grin:

Guglielmo

ma ho capito bene? ho bisogno della libreria che mi dice Guglielmo, altrimenti nn faccio nulla?

Hai capito male, stiamo parlando di una funzione della libreria C che è già inclusa in ogni programma, per così dire.

grazie.....ci provo!!!

scusatemi ma io sono un pò de coccio...forse un pò assai....preferisco che date voi un'occhiata xchè se no si fà notte!!

void printTime(void) 
{ 
  val=digitalRead(BUTTON);            


                                       
  if(val==HIGH){

char buf[25]; 
snprintf(buf, sizeof(buf), "%02d %02d %04d  %02d:%02d:%02d",day(), month(), year(), hour(), minute(), second()); 
Serial.println(buf); 
lcd.setCursor(0,2);
lcd.print(buf);

time_t myTime;
myTime = RTC.get();
Serial.print(myTime);



    myFile = SD.open("dati.txt", FILE_WRITE);
    if (myFile) {
      myFile.println(myTime);
      myFile.close();
    } else {
      Serial.println("error opening dati.txt");
    }

    if ( digitalRead(BUTTON) == HIGH ) {
        Serial.println(" ");
        Serial.println("Lettura Log Salvato ----------- ");
        Serial.println(" ");
        
        myFile = SD.open("dati.txt");
        if (myFile) {
          while (myFile.available()) {
         Serial.write(myFile.read()); 


           
          }
          myFile.close();        
        }
delay(1000);

       
    }
  }
}

il risultato che ho alla pressione del button è quella di vedere sul mio lcd l'ora che ho scelto e sul serial oltre la data e l'ora anche i secondi salvati su sd card....

a questo punto vorrei dire ad Arduino che quando sono passati 10 giorni(in secondi) devi fare delle operazioni....per questo mi serve la data salvata su sd card in secondi.....

forse sono un pò complicato ma mi viene facile fare dopo dei calcoli semplicissimi di somme e sottrazioni di tempo espresso in secondi.....

datemi voi qualche consiglio

Con quello sketch leggi un carattere alla volta dal file e lo stampi direttamente sulla seriale.

Quel che devi fare è, invece della stampa (o in aggiunta ad essa), raccogliere i caratteri in una stringa, e quando è completa darla in pasto alla funzione che ti abbiamo indicato.

ho visto i post precedenti.....String inString....ci provo!!!

grazie SukkoPera

ci sto provando ma sto sbagliando...nel serial mi vengono fuori numeri strani...

potresti abbozzarmi un esempio o spiegarmi come si usa la funzione!! Te ne sarei veramente grato..

lino

Posta lo sketch attuale.

ok! sono incluse librerie come avrai capito....

int val=0;
char c; 
String inString = "";
unsigned long oggi;
unsigned long Timer;

........

void printTime(void) 
{ 
val=digitalRead(BUTTON);         

                                        
if(val==HIGH){

char buf[25]; 
snprintf(buf, sizeof(buf), "%02d %02d %04d  %02d:%02d:%02d",day(), month(), year(), hour(), minute(), second()); 
Serial.println(buf); 
lcd.setCursor(0,2);
lcd.print(buf);

time_t myTime;
myTime = RTC.get();
Serial.print(myTime);

    myFile = SD.open("dati.txt", FILE_WRITE);
    if (myFile) {
      myFile.println(myTime);
      myFile.close();
    } else {
      Serial.println("error opening dati.txt");
    }

    if ( digitalRead(BUTTON) == HIGH ) {
        Serial.println(" ");
        Serial.println("Lettura Log Salvato ----------- ");
        Serial.println(" ");
        
        myFile = SD.open("dati.txt");
        if (myFile) {
          while (myFile.available()) {
         Serial.write(myFile.read());

                  c = myFile.read();
                  inString += c;
                            
          }
          myFile.close();        
        }
delay(1000); 

      unsigned long strtoul(c);  
      Serial.print(c);
      Timer=myTime+c;
      Serial.println(Timer);
    }
  }
}

ho omesso il setup....se poi serve dimmelo..... grazie

Mamma mia ragazzi, ma perché ho l’impressione che TUTTI qua facciate dei copia&incolla a caso senza avere idea di quel che state facendo? Possibile che nessuno di voi ci tenga a capire quel che fa e a diventare indipendente? Fate davvero perdere la voglia di aiutarvi! :confused:

unsigned long strtoul(c);

Qua vorresti chiamare la funzione strtoul(), ma innazitutto devi passarle TRE parametri! Il primo di questi deve essere la stringa completa, non solo un carattere. E poi dove vai a salvare il valore di ritorno? Lo stai buttando via!

Timer = strtoul(inString.c_str(), NULL, 10);

Questo dovrebbe funzionare.

SukkoPera: Mamma mia ragazzi, ma perché ho l'impressione che TUTTI qua facciate dei copia&incolla a caso senza avere idea di quel che state facendo? Possibile che nessuno di voi ci tenga a capire quel che fa e a diventare indipendente? Fate davvero perdere la voglia di aiutarvi!

Concordo al 110% ... ... è veramente una cosa deprimente !!! Guglielmo