Datalogger - Gravação MicroSD - Gravar arquivos de tempos em tempos

Estou trabalhando em um sistema de aquisição de dados e necessito salvar um arquivo .txt a cada minuto da aquisição que eu fiz, até o momento não consegui salvar mais de um arquivo com mesmo nome, ele sempre escreve dentro do mesmo arquivo.
No void loop está desta formaa parte do datalogger:

arquivo = SD.open("Dados.txt",FILE_WRITE);
if(arquivo){
arquivo.println(nome);
arquivo.flush();
arquivo.close();
}

Caso seja uma duvida recorrente me reporte o link no fórum.
Desde já gradeço.
Bruno Junior

Bom dia bruno !!

sou schadrac

Eu tenho o mesmo problema

Não sei mas acredito que ele sempre vai salvar no aquivo que nomeou Dados, mas não sei se tem um jeito de fazer para salvar por exemplo Dados 1... e depois quando quiser salvar ele salva no Dados 2 e até que terminar mas nesse caso com seu datalogger ele vai salvar no mesmo nome Dados. ou você muda depois ele salvar nome de arquivo Dados por qualquer nome. ou pega outro cartão SD.
no meu caso Eu mudo o nome e ele criar outro arquivo pra escrever nele. se não, ele vai sempre escrever no mesmo arquivo. esse é a solução que encontrei pra salvar dados

brunofjjr:
Estou trabalhando em um sistema de aquisição de dados e necessito salvar um arquivo .txt a cada minuto da aquisição que eu fiz, até o momento não consegui salvar mais de um arquivo com mesmo nome, ele sempre escreve dentro do mesmo arquivo.

Bruno Junior

Será que entendi direto?
Você quer salvar dados diferentes em arquivos com o mesmo nome? Ou seja, o SD teria vários arquivos com o mesmo nome?

Até existem sistemas de arquivos (Versioning file system) que permitem arquivos com o mesmo nome, mas serão tratados como sendo diferentes versões (edição) do arquivo.
Não e o caso do FAT16 (ou outro sistema de arquivos comumente usados), permite a existência de somente um arquivo com o mesmo nome (por diretório).

E qual o problema de gravar os dados em um mesmo arquivo?

Mas, como a pergunta e como salvar os dados em arquivos diferentes.
Nesse caso terá que renomear o arquivo a cada interação. Por exemplo, colocando um numero incremental a cada interação.

...
int numA=1;

void loop() {
...
   if (...) {
     arq=SD.open("dados"+String(numA)+".txt", FILE_WRITE);
     if (arq) {
         arq.println(dados);
         arq.close();
         numA++;
     };
   };
...

}

Eu tinha pensado isso tbm, mas fazendo o seguinte arquivo desta forma ele reporta o seguinte erro:

"invalid operands of types 'const char*' and 'const char [5]' to binary 'operator+'"

brunofjjr:
Eu tinha pensado isso tbm, mas fazendo o seguinte arquivo desta forma ele reporta o seguinte erro:

"invalid operands of types 'const char*' and 'const char [5]' to binary 'operator+'"

Me desculpe, não havia testado o código, só fui seguido o manual de referencia.
Acho que assim deve dar certo (postagem anterior corrigido).

arq=SD.open("dados"+String(numA)+".txt", FILE_WRITE);

Ou, fazendo o uso de uma variável para o nome do arquivo.

...
int numA=1;
String NomeArquivo;

void loop() {
...
   if (...) {
     NomeArquivo="dados"+String(numA)+".txt";
     arq=SD.open(NomeArquivo), FILE_WRITE);
     if (arq) {
         arq.println(dados);
         arq.close();
         numA++;
     };
   };
...

}

Obrigado, encontrei a solução aqui:

String numA = "_coleta.txt";
String nomearq = " ";
int inc = 1;

void loop(){
nomearq = inc + numA ;
arquivo = SD.open(nomearq.c_str(), FILE_WRITE);
if(arquivo){
arquivo.println("Deu certo!");
arquivo.flush();
arquivo.close();
delay(1000);
inc++;
}
}
delay(10);
}

Só uma observação, quando o arduino reiniciar por algum motivo, o seu arquivo voltaria a ser o 1_coleta.txt e se houver outro ele escreverá dentro dele! não seria interessante colocar um verificado no setup do program, tipo:

...
String numA = "_coleta.txt";
String nomearq = " ";
int inc = 1;

...

setup(){

...
 nomearq = inc + numA ; 
 arquivo = SD.open(nomearq.c_str(), FILE_WRITE);

while(!arquivo){                   
    
     arquivo = SD.open(nomearq.c_str(), FILE_WRITE);
     inc++;

}   /*** Aqui ele procura qual é o maior arquivo criado até achar um que não exista ****/
     /*** Por exemplo, ele criou até o arquivo 4_coleta.txt  e logo depois ele reiniciou ****/
     /*** quando voltar ao setup ele vai rodar o while até inc = 5 e o próximo arquivo será o 5_coleta.txt***/

....

Dá uma olhada e vê se ajuda!!!

tecdiego:
Só uma observação, quando o arduino reiniciar por algum motivo, o seu arquivo voltaria a ser o 1_coleta.txt e se houver outro ele escreverá dentro dele! não seria interessante colocar um verificado no setup do program, tipo:

...

String numA = "_coleta.txt";
String nomearq = " ";
int inc = 1;

...

setup(){

...
nomearq = inc + numA ;
arquivo = SD.open(nomearq.c_str(), FILE_WRITE);

while(!arquivo){                 
   
    arquivo = SD.open(nomearq.c_str(), FILE_WRITE);
    inc++;

}  /*** Aqui ele procura qual é o maior arquivo criado até achar um que não exista /
    /
Por exemplo, ele criou até o arquivo 4_coleta.txt  e logo depois ele reiniciou /
    /
quando voltar ao setup ele vai rodar o while até inc = 5 e o próximo arquivo será o 5_coleta.txt
*/

....




Dá uma olhada e vê se ajuda!!!

Obrigado
Ajudou muito, mas só estou conseguindo criar 9 aquivos no máximo, não sei por qual motivo.

brunofjjr:
Obrigado
Ajudou muito, mas só estou conseguindo criar 9 aquivos no máximo, não sei por qual motivo.

Ola,
O motivo de só consegui criar "9" arquivos esta na limitação do FAT. Que permite nome de arquivo com 12 caracteres, um deles sendo o ., restando 11 para uso no nome. Sendo 8 para o nome em si e mais três para a extensão. Esse sistema de nome e conhecido como 8.3.
Além de outras limitações, como só poder criar 65.460 arquivos.

pksato:
Ola,
O motivo de só consegui criar "9" arquivos esta na limitação do FAT. Que permite nome de arquivo com 12 caracteres, um deles sendo o ., restando 11 para uso no nome. Sendo 8 para o nome em si e mais três para a extensão. Esse sistema de nome e conhecido como 8.3.
Além de outras limitações, como só poder criar 65.460 arquivos.

Enetndi, resolvi aqui, Muito Obrigado!