Error recover variables values from SDCARD.

Hi guys, after 2 hard nights of attempts, I would like some light to my mind :o

My code is simples but the quantity of variables wrote in the SD is a some “large” .

For start and explain better my problem, I have 11 variables but 4 are 2d array (6x9) and 4 array 1d. In other words I will write 96 values of variables into sdcard.

go to the code :)…

I write the values(for my test stupid values i+j) in the following lines:

Code brief:

...

Serial.println("===========WRITING=============");
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          Serial.println(i+j);
          myFile.println(i+j);
      }
  }
  Serial.println("==============================");
...

and read in this part:

Code brief:

...

Serial.println("===========READING=============");
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ // BUSCANDO TODOS OS quantidadeDiasEstatio
    Serial.println("SENSOR: ");
    Serial.println(i);
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
        Serial.print("ESTAGIO: ");
        Serial.print(j);
        Serial.print(" : ");
        naoTerminou = true;
        while(naoTerminou){
        arrayChar[count] = myFile.read(); 
        if(arrayChar[count] == 10){
          Serial.print(atoi(arrayChar));
          Serial.print(" | ");
          quantidadeDiasEstatio[i][j] = atoi(arrayChar);
          count = 0;
          arrayChar[0] = '\0'; //ZERANDO O ARRAY PARA RECEBER O PRÓXIMO VALOR
          naoTerminou = false;
        }else{
          count++;  
        }
        }
        Serial.println(quantidadeDiasEstatio[i][j]);
      }
  }
  Serial.println("===============================");

RESULT OF SERIAL.PRINTLN:

===========LEITURA=============
SENSOR:
1
ESTAGIO: 1 : 2 | 2
ESTAGIO: 2 : 3 | 3
ESTAGIO: 3 : 4 | 4
ESTAGIO: 4 : 5 | 5
ESTAGIO: 5 : 6 | 6
ESTAGIO: 6 : 7 | 7
ESTAGIO: 7 : 8 | 8
ESTAGIO: 8 : 9 | 9
ESTAGIO: 9 : 10 | 10
SENSOR:
2
ESTAGIO: 1 : 3 | 3
ESTAGIO: 2 : 4 | 4
ESTAGIO: 3 : 5 | 5
ESTAGIO: 4 : 6 | 6
ESTAGIO: 5 : 7 | 7
ESTAGIO: 6 : 8 | 8
ESTAGIO: 7 : 9 | 9
ESTAGIO: 8 : 10 | 10
ESTAGIO: 9 : 11 | 11
SENSOR:
3
ESTAGIO: 1 : 4 | 4
ESTAGIO: 2 : 5 | 5
ESTAGIO: 3 : 6 | 6
ESTAGIO: 4 : 7 | 7
ESTAGIO: 5 : 8 | 8
ESTAGIO: 6 : 9 | 9
ESTAGIO: 7 : 10 | 10
ESTAGIO: 8 : 11 | 11
ESTAGIO: 9 : 12 | 12
SENSOR:
4
ESTAGIO: 1 : 5 | 5
ESTAGIO: 2 : 6 | 6
ESTAGIO: 3 : 7 | 7
ESTAGIO: 4 : 8 | 8
ESTAGIO: 5 : 9 | 9
ESTAGIO: 6 : 10 | 10
ESTAGIO: 7 : 11 | 11
ESTAGIO: 8 : 12 | 12
ESTAGIO: 9 : 13 | 13
SENSOR:
5
ESTAGIO: 1 : 6 | 6
ESTAGIO: 2 : 7 | 7
ESTAGIO: 3 : 8 | 8
ESTAGIO: 4 : 9 | 9
ESTAGIO: 5 : 10 | 10
ESTAGIO: 6 : 11 | 11
ESTAGIO: 7 : 12 | 12
ESTAGIO: 8 : 13 | 13
ESTAGIO: 9 : 14 | 14
SENSOR:
6
ESTAGIO: 1 : 7 | 7
ESTAGIO: 2 : 8 | 8
ESTAGIO: 3 : 9 | 9
ESTAGIO: 4 : 10 | 10
ESTAGIO: 5 : 11 | 11
ESTAGIO: 6 : 12 | 12
ESTAGIO: 7 : 13 | 13
ESTAGIO: 8 : 14 | 14
ESTAGIO: 9 : 15 | 15

As above, the atoi function and the variable, that receive the value, write and receive the correct values. OK!

BUT, this is my problem:

After call this functions, I call a new test, inserting 2 news recursive functions for confirm ,again, the values:

void loop()
{
  criacaoBackup(); //MAKE BACKUP SDCARD
  restauracaoBackup(); //RESTOR BACKUO OF SDCAR

  
//NEW TEST OF VALUES

  for(int i=1; i<=6; i++){
    Serial.print("SENSOR ");
    Serial.println(i);
      for(int j=1; j<=9; j++){
        Serial.print("ESTAGIO ");
        Serial.print(j);
        Serial.print(" : ");
          Serial.println(quantidadeDiasEstatio[i][j]);
      }
  }
  
  delay(100000);
  
}

And the result is:

ENSOR 1
ESTAGIO 1 : -13107
ESTAGIO 2 : 16696
ESTAGIO 3 : -28836
ESTAGIO 4 : 16714
ESTAGIO 5 : 20971
ESTAGIO 6 : 16732
ESTAGIO 7 : 5243
ESTAGIO 8 : 16750
ESTAGIO 9 : -10486
SENSOR 2
ESTAGIO 1 : 16767
ESTAGIO 2 : 4
ESTAGIO 3 : 5
ESTAGIO 4 : 6
ESTAGIO 5 : 7
ESTAGIO 6 : 8
ESTAGIO 7 : 9
ESTAGIO 8 : 10
ESTAGIO 9 : 11
SENSOR 3
ESTAGIO 1 : 4
ESTAGIO 2 : 5
ESTAGIO 3 : 6
ESTAGIO 4 : 7
ESTAGIO 5 : 8
ESTAGIO 6 : 9
ESTAGIO 7 : 10
ESTAGIO 8 : 11
ESTAGIO 9 : 12
SENSOR 4
ESTAGIO 1 : 5
ESTAGIO 2 : 6
ESTAGIO 3 : 7
ESTAGIO 4 : 8
ESTAGIO 5 : 9
ESTAGIO 6 : 10
ESTAGIO 7 : 11
ESTAGIO 8 : 12
ESTAGIO 9 : 13
SENSOR 5
ESTAGIO 1 : 6
ESTAGIO 2 : 7
ESTAGIO 3 : 8
ESTAGIO 4 : 9
ESTAGIO 5 : 10
ESTAGIO 6 : 11
ESTAGIO 7 : 12
ESTAGIO 8 : 13
ESTAGIO 9 : 14
SENSOR 6
ESTAGIO 1 : 7
ESTAGIO 2 : 8
ESTAGIO 3 : 9
ESTAGIO 4 : 10
ESTAGIO 5 : 11
ESTAGIO 6 : 12
ESTAGIO 7 : 13
ESTAGIO 8 : 14
ESTAGIO 9 : 15

As above, I don’t know WHY the same values are not show again.

Does exist some particular way of arduino care this values?

Thanks for any tip, trick , help and etc. :slight_smile:

You'd need to post all of your code, not just snippets, if you really want help.

FYI: The File class inherits from Stream, which has parseInt() and parseFloat() methods to make reading ints and floats from files easier.

Sorry Paul, you are right.

I modified my code using your tip but, the same erro are happen.

following my code:

#include <SD.h>

char arrayChar[40];
boolean naoTerminou = true;
int count = 0;

#define numeroPortaSD 53

#define QUANTIDADE_SENSOR 6
#define QUANTIDADE_MAXIMA_ESTAGIO 9

File myFile;

String nomeArquivo = "asdd.txt";

int quantidadeEstatiosSensor[QUANTIDADE_SENSOR];
int quantidadeDiasMaturacao[QUANTIDADE_SENSOR];
long dataInicioFermentacao[QUANTIDADE_SENSOR];
double temperaturaFinalMaturacao[QUANTIDADE_SENSOR];
double temperaturaInicialMaturacao[QUANTIDADE_SENSOR];
double fatorTemperaturaMaturacao[QUANTIDADE_SENSOR];
double offSetSensor[QUANTIDADE_SENSOR];

int quantidadeDiasEstatio[QUANTIDADE_SENSOR][QUANTIDADE_MAXIMA_ESTAGIO];
double temperaturaInicialEstagio[QUANTIDADE_SENSOR][QUANTIDADE_MAXIMA_ESTAGIO];
double temperaturaFinalEstagio[QUANTIDADE_SENSOR][QUANTIDADE_MAXIMA_ESTAGIO];
double fatorTemperaturaDia[QUANTIDADE_SENSOR][QUANTIDADE_MAXIMA_ESTAGIO];


void setup()
{
  Serial.begin(9600);
  if (!SD.begin(numeroPortaSD)) {
    Serial.println("Erro iniciation SDCARD");
    return;
  }
  Serial.println("Iniciation done.");  
}

void loop()
{
  criacaoBackup();
  restauracaoBackup();

  
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
    Serial.print("SENSOR ");
    Serial.println(i);
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
        Serial.print("ESTAGIO ");
        Serial.print(j);
        Serial.print(" : ");
          Serial.println(quantidadeDiasEstatio[i][j]);
      }
  }
  
  delay(100000);
  
}

void criacaoBackup(){

  if(SD.exists(nomeArquivo)){
    SD.remove(nomeArquivo);
    Serial.println(nomeArquivo);
  }

  myFile = SD.open(nomeArquivo,FILE_WRITE);

  

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      myFile.println(i);
  }
  Serial.println("===========GRAVANDO=============");
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          Serial.println(i+j);
          myFile.println(i+j);
      }
  }
  Serial.println("==============================");
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          myFile.println(i+j*1.11);
      }
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          myFile.println(i+j*1.11);
      }
  }
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          myFile.println(i+j*1.11);
      }
  }
myFile.close();
}

void restauracaoBackup(){

  myFile = SD.open(nomeArquivo);

if (myFile.available()) {
  
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        quantidadeEstatiosSensor[i] = myFile.parseInt();
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        quantidadeDiasMaturacao[i] = myFile.parseInt();
      
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        dataInicioFermentacao[i] = myFile.parseInt();
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        temperaturaFinalMaturacao[i] = myFile.parseFloat();
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        temperaturaInicialMaturacao[i] = myFile.parseFloat();
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
        fatorTemperaturaMaturacao[i] = myFile.parseFloat();
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
        offSetSensor[i] = myFile.parseFloat();
  }
  
  Serial.println("===========LEITURA=============");
  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
    Serial.print("SENSOR: ");
    Serial.println(i);
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
        Serial.print("ESTAGIO: ");
        Serial.print(j);
        Serial.print(" ==> ");
         quantidadeDiasEstatio[i][j] = myFile.parseInt(); 
        Serial.println(quantidadeDiasEstatio[i][j]);
      }
  }
  Serial.println("===============================");

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          temperaturaInicialEstagio[i][j] = myFile.parseFloat();
      }
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          temperaturaFinalEstagio[i][j] = myFile.parseFloat();
        
      }
  }

  for(int i=1; i<=QUANTIDADE_SENSOR; i++){ 
      for(int j=1; j<=QUANTIDADE_MAXIMA_ESTAGIO; j++){
          fatorTemperaturaDia[i][j] = myFile.parseFloat();
        
  }
}
myFile.close();
}
}

Result after reading:

SENSOR 1
ESTAGIO 1 : -13106
ESTAGIO 2 : 16696
ESTAGIO 3 : -28835
ESTAGIO 4 : 16714
ESTAGIO 5 : 20973
ESTAGIO 6 : 16732
ESTAGIO 7 : 5244
ESTAGIO 8 : 16750
ESTAGIO 9 : -10485
SENSOR 2
ESTAGIO 1 : 16767
ESTAGIO 2 : 4
ESTAGIO 3 : 5
ESTAGIO 4 : 6
ESTAGIO 5 : 7
ESTAGIO 6 : 8
ESTAGIO 7 : 9
ESTAGIO 8 : 10
ESTAGIO 9 : 11
SENSOR 3
ESTAGIO 1 : 4
ESTAGIO 2 : 5
ESTAGIO 3 : 6
ESTAGIO 4 : 7
ESTAGIO 5 : 8
ESTAGIO 6 : 9
ESTAGIO 7 : 10
ESTAGIO 8 : 11
ESTAGIO 9 : 12
SENSOR 4
ESTAGIO 1 : 5
ESTAGIO 2 : 6
ESTAGIO 3 : 7
ESTAGIO 4 : 8
ESTAGIO 5 : 9
ESTAGIO 6 : 10
ESTAGIO 7 : 11
ESTAGIO 8 : 12
ESTAGIO 9 : 13
SENSOR 5
ESTAGIO 1 : 6
ESTAGIO 2 : 7
ESTAGIO 3 : 8
ESTAGIO 4 : 9
ESTAGIO 5 : 10
ESTAGIO 6 : 11
ESTAGIO 7 : 12
ESTAGIO 8 : 13
ESTAGIO 9 : 14
SENSOR 6
ESTAGIO 1 : 7
ESTAGIO 2 : 8
ESTAGIO 3 : 9
ESTAGIO 4 : 10
ESTAGIO 5 : 11
ESTAGIO 6 : 12
ESTAGIO 7 : 13
ESTAGIO 8 : 14
ESTAGIO 9 : 15

I think you need to take a look at the file that criacaoBackup() is creating. I really can't see the purpose of writing 1 to 6 on new records to the file 7 times.

But, then you read 10 characters at a time from the file, including carriage returns and line feeds, and store then in a char array. Then, you pass the char array, which is NOT a string (no NULL terminator) to a function that expects a string. You can't expect defined behavior from doing that.

You do this many times, so who knows where the heck you are in the file before you get around to trying to read any useful data.

PaulS:
I think you need to take a look at the file that criacaoBackup() is creating. I really can't see the purpose of writing 1 to 6 on new records to the file 7 times.

But, then you read 10 characters at a time from the file, including carriage returns and line feeds, and store then in a char array. Then, you pass the char array, which is NOT a string (no NULL terminator) to a function that expects a string. You can't expect defined behavior from doing that.

You do this many times, so who knows where the heck you are in the file before you get around to trying to read any useful data.

Eureka PaulS.

It worked!!

To me, when a declared the size of my array, for exemple 6, i know the your real size is 7 position but, one time I not using the position 0 (zero) nothing will happens wrong. For this reason I begin my count with 1, not 0! Therefore my array contains 6 positions (1,2,3,4,5,6).

Now, knowing the correct way, I will change my code to works fine.

Thanks so much for your tip.

To me, when a declared the size of my array, for exemple 6, i know the your real size is 7 position

That is NOT true. When you use [n], there are n elements in the array. The indices run from 0 to n-1.