Go Down

Topic: [RISOLTO] savare/leggere valore variabili su SD (Read 249 times) previous topic - next topic

cepics

Dec 25, 2018, 05:05 pm Last Edit: Dec 26, 2018, 11:09 am by cepics
buongiorno a tutti

sto cercando di salvare lo stato di due booleane e il valore di una int su una sd in modo da poterle avere disponibili dopo il riavvio

non mi interessa fare un log

in passato le salvavo nella EEPROM ma i cicli di scrittura mi si consumano nel giro di un paio di mesi.

sto cercando di utilizzare una sd per salvare, in modo da "bruciare" la sd e non arduino

riesco a scrivere in un file sull'sd il valore della variabile ma quando lo vado a leggere il valore non corrisponde a quello che avevo salvato.. credo sia un problema di conversione tra binario e decimale ma non ne sono sicuro..

questo è il codice che salva il dato:

Code: [Select]
int cal = 12345;

 File file = SD.open("/cal.txt", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if (file.print(cal)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }


e questo è quello che lo legge:

Code: [Select]
File file = SD.open("/cal.txt");
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while (file.available()) {
    int ch = file.read();
    Serial.write(ch);
   int y = (ch + 2);
  }
  Serial.println();
  Serial.print(y);



nel monitor seriale il dato esce bene ma se provo a fare dei calcoli con la variabile "ch", questi sono sballati
questo l'output del monitor seriale:


Code: [Select]
Read from file: 12345
55


qualcuno ha una soluzione, adatta al mio livello, per poter tirare fuori dall'sd la stessa cifra che ci avevo messo dentro e poterci fare dei calcoli ?

grazie

buone feste

nid69ita

#1
Dec 25, 2018, 05:27 pm Last Edit: Dec 25, 2018, 05:45 pm by nid69ita
Occhio. La print lavora su file testo. Il tuo 12345 viene convertito in testo ed ogni lettera (in questo caso cifra) viene scritta dentro al file.
Quando lo leggi con read() leggi un (solo 1) carattere alla volta. Quindi leggerai '1' poi '2' etc. 
Nella tabella ascii  '1' = 49   '2'=50

Ulteriore errore: la int y se la dichiari e la valorizzi tutta in quella riga, dentro alle graffe del while... ha vita SOLO nel ciclo. Forse hai una y globale. Che non è la stessa variabile  Ovviamente mettete sempre TUTTO il codice, il secondo pezzo è incompleto.
Code: [Select]
while (file.available())
{
  ..
  int y = (ch + 2);   // nasce e muore alla graffa chiusa
}
Serial.println();
Serial.print(y);   // questa non è la stessa y

E poi perchè ch+ 2 ??        Il calcolo sarebbe   cifra*10^posizione         
Code: [Select]
pot=1;
int y=0;
while (file.available())
{ int ch = file.read();
   Serial.write(ch);
   y = y + (ch-48)*pot;    // (49-48)*1 poi (50-48)*10  poi (51-48)*100
   pot=pot*10;                // al primo 1, poi 10, poi 100 etc.
  }
  Serial.println();
  Serial.print(y);


La classe per leggere da file è ereditata dalla classe Stream (come la Serial) quindi dovrebbe accettare anche parseInt() e readStringUntil(); con la prima ottieni già la cifra.
https://forum.arduino.cc/index.php?topic=148257.0
my name is IGOR, not AIGOR

cepics

grazie mille file.parseint() funziona !!!!

ci tiro fuori pure le due bool di cui avevo bisogno grazie ancora!!!

Go Up