Em diversas situações é importante ter o registro de certos dados que estamos medindo. Porém, é difícil pensar em como fazer isso, pois normalmente medimos e tratamos os dados instantâneos nos projetos. Então, vamos aprender a salvar informações de sensores ligados ao Arduino em um arquivo de texto.
Recomendo a leitura dos posts:
- Como mexer com o monitor serial do Arduino, para entender o básico
- Como funciona a comunicação serial assíncrona, para entender o princípio de funcionamento do que será ensinado
Informações básicas
Para exemplificar, pretendo criar um circuito simples com um LDR e fazer a medição da intensidade luminosa do ambiente a cada 1 minuto. Com isso, pretendo gravar os dados da luminosidade para consultar depois e descobrir como a luminosidade decai a medida que o dia chega perto das 18h.
Não vou entrar nos detalhes do LDR, então veja o post que aborda o assunto.
Para gravar os dados lidos, vamos mandar eles pelo serial do Arduino e utilizar o software Processing (já comentei sobre ele no post sobre reconhecimento de voz) para salvá-los. Repetindo: Esse software se assemelha muita à IDE do Arduino e serve para muitas aplicações interessantes, em especial coisas gráficas. Usaremos ele para receber os dados que o Arduino envia pela serial e armazená-los em um arquivo de texto.
Circuito
O circuito abaixo é o mesmo mostrado no post que ensina a usar o LDR.

Basicamente, é só ligar o 5v em um lado do LDR e do outro um resistor (470Ω) e um fio conectado ao pino analógico A0. A ponta que sobrou do resistor deve ser conectada ao GND.
Com isso, você tem um circuito capaz de informar a intensidade luminosa do ambiente por meio de valores que podem variar de 0 a 1023.
Programação
Primeiro, você deve fazer o upload do código do Arduino e depois executar o código do Processing. Quando quiser finalizar a medição, é só apertar qualquer tecla na janela do Processing para salvar os dados adequadamente e encerrar o programa.
Arduino
A parte do Arduino é bem simples. O código abaixo apenas lê o valor em A0 e envia ele por meio da comunicação serial.
1 2 3 4 5 6 7 8 9 10 11 | int sensor = A0; //Neste caso é o LDR void setup() { pinMode(sensor, INPUT); Serial.begin(9600); } void loop() { int valor = analogRead(sensor); Serial.println(valor); delay(60000); //Delay de 1 min - opcional para atrasar mediçoes } |
Detalhes do Processing
Antes de sair rodando o código, é importante configurar a porta de comunicação do programa. Faça isso alterando o número entre “[ ]” da linha:
String portName = Serial.list()[0]; //configura a porta serial
Para saber qual número colocar, fui na lista de portas da IDE do Arduino e vi em qual ordem estava a porta que eu estava usando. No caso, estava em segundo lugar da lista, portanto coloquei 1 entre os “[ ]” (a numeração começa em 0). Você pode também ir testando até dar certo: 0,1,2,3…
Uma recomendação importante: diminua a duração do delay do código do Arduino e faça testes para ver se está tudo rodando conforme sua necessidade.
Código do Processing
O código abaixo verifica se existe algum dado recebido na porta serial, e caso exista, ele grava no arquivo as horas, os minutos e o dado lido pelo serial. Resolvi escrever as horas e os minutos justamente para acompanhar a luminosidade do quarto a medida que as horas aproximam de 18h.
Leia os comentários para entender o programa, pois são comandos bem diretos e tranquilos de entender.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import processing.serial.*; //Biblioteca importante para essa aplicação Serial mySerial; //Funcionalidade serial PrintWriter output; //Funcionalidade de escrita em arquivos void setup() { String portName = Serial.list()[0]; //configura a porta serial mySerial = new Serial(this, portName, 9600); //Configura a porta serial output = createWriter( "data.txt" ); //Cria o objeto arquivo para gravar os dados } void draw() { //Mesma coisa que a funçao loop do Arduino if (mySerial.available() > 0 ) { //Se receber um valor na porta serial String value = mySerial.readStringUntil('\n'); //Le o valor recebido if ( value != null ) { // Se o valor nao for nulo output.print(hour()); //Escreve no arquivo as horas e os minutos atuais seguido do valor lido pelo sensor output.print(":"); output.print(minute()); output.print("->"); output.println(value); //value é o valor recebido pela porta serial (valor que o LDR enviou) output.flush(); // Termina de escrever os dados pro arquivo } } } void keyPressed() { //Se alguma tecla for pressionada output.flush(); // Termina de escrever os dados pro arquivo output.close(); // Fecha o arquivo exit(); // Para o programa } |
Resultados
Comecei minhas medições 16:47, perto de 18h acendi a luz, esperei um tempo e encerrei o programa. Obtive o seguinte resultado:
16:47->36
16:48->37
16:49->36
E assim em diante. Quis criar um gráfico para facilitar a visualização dos dados. Portanto, para não separar as horas e os valores do sensor manualmente, criei um programa em c++ para separá-los em dois arquivos distintos (não vou entrar em explicações sobre):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <stdio.h> #include <string.h> main(){ FILE *dados; FILE *horas; FILE *medidas; char line[256]; char valor[6]; dados = fopen("data.txt", "r"); horas = fopen("horas.txt", "w"); medidas = fopen("medidas.txt", "w"); while (!feof(dados)) { memset(valor,0,sizeof(valor)); fgets(line, sizeof(line), dados); if (strspn(line, " \t\r\n") == strlen(line)) { continue; } //Horas for(int i=0;i<5;i++){ valor[i] = line[i]; } fprintf(horas, valor); fprintf(horas, "\n"); //Medidas memset(valor,0,sizeof(valor)); for(int i=7;i<=strlen(line)-1;i++){ valor[i-7] = line[i]; } fprintf(medidas, valor); } fclose(dados); fclose(horas); fclose(medidas); } |
Era mais fácil ter separado antes através do processing, mas é isso que dá não pensar antes de fazer as coisas…
Agora, bastou jogar tudo no Excel e criar o gráfico abaixo:

Observações importantes:
- Possivelmente eu comecei as medições com nuvens tampando o sol, portanto quando o sol apareceu, a intensidade luminosa aumentou e isso causou a elevação no gráfico perto das 17:03.
- As 18h é possível perceber o momento que acendo a lâmpada e a intensidade aumenta para a faixa de 20-30.
Agora você já pode criar seu próprio registro dos dados automatizado sem ter que ficar monitorando.
Arduino – Salvar dados da memória EEPROM em txt ou CSV
Quantos dados de leitura da pra colocar em um só arquivo de TXT? Ou melhor, qual o tamanho máximo que esse arquivo pode ter?
Acredito que não há um limite, pois a documentação do comando ‘createWriter()’ do Processing (comando de criar um arquivo) não fala nada a respeito. Então, neste caso, seria até a memória do computador acabar. Ou pode ser que o programa fique lento para gravar dados em arquivos grandes. Não dá para afirmar com total certeza sem testar.
olá gostaria de renomear esse documento toda vez que ele rodar o void draw a renomeaçao pode ser data1, data2 … cada vez que ele roda o draw aumenta um no nome do arquivo. vc pode me ajudar?
Olá. Posso ajudar sim. Para fazer isto, basta trocar a função setup pela função abaixo:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String portName = Serial.list()[0]; //configura a porta serial
mySerial = new Serial(this, portName, 9600); //Configura a porta serial
// Cria o nome do arquivo
String nome_arquivo = "data1.txt";
// Troca o nome até o próximo nome disponível
for (int i = 2; ; i++){
File f = new File(sketchPath() + "/" + nome_arquivo);
// Sai do for se o arquivo não existir
if(!f.isFile()){
break;
}
nome_arquivo = "data" + str(i) + ".txt";
}
output = createWriter(nome_arquivo); //Cria o objeto arquivo para gravar os dados
}
Olá, Fábio!
Quando substituo esse “setup”, o Processing informa “Found a { that’s missing a matching }”. Não consegui identificar quais chaves estão sobrando ou faltando.
Att.,
Luan
Olá, Luan. Desculpa a demora a responder. Seu comentário acabou indo pro spam por algum motivo bizarro. Enfim, o problema é que uma linha do código estava errada, e não tinha relação com as chaves apesar do aviso. O problema era com a linha que cria o arquivo, pois era pra ter duas barras invertidas seguidas (“\\”), mas o plugin do site que transforma o código nesse formato bonito acabou sumindo com uma delas. Corrigi o problema substituindo por uma barra normal (“/”). Copie o código novamente e veja se funciona agora.
Muito obrigado, Fábio! Era isso mesmo.
Abraço.
Tranquilo, meu amigo! Abraço.
Ola, não entendi onde entre a segunda parte do código onde separa os dados recebidos da hora.
Olá. Este código para separar as horas e os dados é, de certa forma, desnecessário. Pois criei ele apenas para ter as medições separadas das horas para colocar ambos em colunas separadas de uma planilha do Excel. Com isto, desenhar um gráfico da intensidade luminosa pelo tempo. Se seu objetivo é apenas de monitoramento dos dados, não tem necessidade fazer esta separação. Na realidade, da para fazer esta separação no próprio Processing.
Oi Fábio! Bom dia!
Pow dá hora seu artigo viu. Ótimo mesmo.
Tenho uma duvida amigo, com relação ao arquivo TXT se o arduino for reiniciado ele continua com os dados os serão todos perdidos?
Desde já te agradeço pela atenção.
Bom dia, Helio!
Muito obrigado, fico feliz em saber que gostou do post.
Respondendo a sua dúvida, se você reiniciar o Arduino, a gravação não é afetada. Pois, ao fazer isto, apenas o código do Arduino volta para o começo. O código de gravação, que é o do Processing, continua rodando normalmente aguardando os dados serem enviados pelo Arduino. O único problema é você reiniciar o código da gravação, pois ai você corre o risco de sobrescrever os dados que estavam sendo gravados anteriormente.
Oi Fábio, obrigado pelo pronto atendimento da resposta, foi rapido.
Deixa eu refazer a pergunta: Se o Arduino for desenergizado? Se remover a fonte de energia dele? Os dados ainda vão estar lá? Se sim, como é possível?
Obrigado
Olá Helio. Por nada, sempre tento responder a medida que tenho disponibilidade!
Os dados ainda estarão lá sim. Isso acontece porque os dados estão sendo gravados no computador com a ajuda do Processing. Isto é, o Arduino faz uma medição e envia a informação pro computador, que reconhece este dado e grava ele no arquivo txt. Se o Arduino for desligado da energia, o que ocorre é que os dados param de chegar no computador. Com isto, o computador continua aguardando dados chegarem sem ter seu funcionamento alterado, pois o código do Processing fica apenas aguardando algum dado chegar para gravar no arquivo. Portanto, os dois códigos funcionam de forma independente. Se o Arduino for energizado novamente, ele volta a enviar dados ao computador e o computador recebe o dado e continua a gravar.
O que não pode acontecer é você desligar o computador repentinamente, pois aí a gravação dos dados é interrompida. E pode acontecer também de você perder os dados gravados, pois aí o Processing não tem oportunidade de “fechar” o arquivo antes do computador ser desenergizado. O que pode não salvar os dados ou corromper o arquivo. Estou falando que PODE ser um problema, pois não cheguei a testar para ter certeza.
Enfim, a explicação ficou mais clara?
Gostaria de tirar uma duvida, como eu posso efetuar esse processo como uma rotina no caso a cada dado especifico ou período de tempo, reiniciar o serviço de gravar novamente escrevendo em um novo arquivo, sem precisar usar o teclado ?
O processo para fazer isso pode parecer um pouco complicado, mas necessita de atenção. É necessário alterar apenas o código do Processing, da seguinte forma:
Para monitorar o tempo percorrido, você poderia utilizar a função millis() que informa o tempo em ms desde que o programa foi iniciado. Com isto, a cada 10 segundos (por exemplo), basta você alterar a instância do arquivo (variável output) para outro arquivo. Para exemplificar melhor, fiz um código que faz isto. Utilizando o mesmo código do post, é necessário adicionar as três variáveis abaixo no início do programa (fora das funções):
int tempo = 20000; // Serve para monitorar o tempo que passou
int indice = 0; // Serve para indexar o vetor abaixo
String nomes[] = {“nome1”, “nome2″,”nome3”}; // Vetor com os nomes dos arquivos
Além disto, é preciso remover a linha que ontem “output = …” no void setup. E substituir a função void draw() pela função abaixo:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (abs(millis() - tempo) > 10000){ // Se passou o tempo mínimo (10 segundos)
// Altera o nome do arquivo para o próximo nome da lista
output = createWriter(nomes[indice] + ".txt" );
// Reseta o tempo de contagem
tempo = second();
// Soma +1 à variável indice
if(indice < 3) // Tamanho máximo do vetor
indice += 1;
}
if (mySerial.available() > 0 ) { //Se receber um valor na porta serial
String value = mySerial.readStringUntil('\n'); //Le o valor recebido
if ( value != null ) { // Se o valor nao for nulo
output.print(hour()); //Escreve no arquivo as horas e os minutos atuais seguido do valor lido pelo sensor
output.print(":");
output.print(minute());
output.print("->");
output.println(value); //value é o valor recebido pela porta serial (valor que o LDR enviou)
}
}
}
Para adaptar o código à sua necessidade, basta mudar o tempo mínimo de mudar o nome do arquivo e mudar também o conteúdo do vetor dos nomes dos arquivos. E não esquecer do if indice < 3 (no lugar do 3 colocar o tamanho do vetor indice. Enfim, não cheguei a testar o código acima, mas acredito que funcionaria. Qualquer coisa retorne o contato.
Obrigado, dessa forma é interessante mas fiz de outra aqui que esta me respondendo bem, estou sub-escrevendo no mesmo arquivo até que o programa feche, ai se caso fechar inicia-se outro arquivo, minha duvida agora parte para como debugar e colocar para executar como um serviço no win, isso é possível ?
Beleza então! Se está atendendo sua necessidade, tá valendo. Essa sua dúvida aí é beeem complicadinha viu. Não sei se é isto que você deseja, mas dê uma olhada neste link aqui que talvez ele possa te ajudar.
Ajudou muito obrigado, e para eu transformar o Sketch em um executável ? é possível ?
Achei aqui o exportar, muito obrigado, vc é Show cara parabéns e que suas ideias e ajudem mais pessoas curiosas como eu obrigado.
Ok, espero que dê tudo certo. E eu é que agradeço pelo feedback! Espero mesmo que os posts possam continuar ajudando pessoas interessadas como você. Abraço.
Olá Fabio estou com uma duvida sobre o “Processing” alem dessa funcionalidade(PrintWriter) de escrever em arquivo ele possui alguma que efetua leitura de um arquivo? Desculpe incomodar tanto com tantas perguntas abraços e desde já obrigado por tudo.
Olá, Rodrigo. Fica tranquilo, pois perguntar não incomoda.
O Processing possui sim, existem duas pelo que conheço. A função equivalente ao comando “createWriter” para leitura seria a “BufferedReader“. Mas existe outra que talvez seja mais fácil de utilizar que é a “loadStrings“. Abra os links para ver como funciona cada uma.
Obrigado, outra duvida que tenho é se consigo enviar este valor que leu do segundo arquivo para a serial do Arduino, isso é possivel ?
Por nada! Dá pra fazer também, é só utilizar a função de escrita serial do Processing. Ela funciona de forma parecida com a do Arduino. Dê uma olhada aqui.
Olá, tira uma duvida minha, ao escrever o meu código me deparei com problemas para executar algumas condições ( if / while / else ) etc, as mesmas só dão gatilho a função programada quando adicionado ( ; )
exemplo:
if ( var < =2) ;
{ (codigo aqui) }
Se eu removo o ( ; ) a função para e não responde oque será ? No Sketch do Arduino não me ocorre isso desde já agradeço a atenção.
Olá, Rodrigo. Quando você coloca o ; imediatamente na frente de um if/while/else, você está “fechando” o if/while/else naquele ponto. Portanto, é como se o seu if não servisse para nada, pois se a condição é verdadeira não há nada dentro dele para ser executado. O certo seria fazer sem o ; da seguinte forma:
2
3
// Comandos
}
Repare que os símbolos <= têm que ficar juntos. Agora, se o seu problema estiver além disto, mande o seu código completo por email: mundoprojetado@gmail.com que assim posso te ajudar de forma melhor.
Olá! Como faço pra escrever os dados de dois sensores no arquivo de texto? Tenho dois sensores ultrassônicos conectados no Arduino e gostaria de ter um arquivo de texto com uma coluna com os dados de um sensor e outra coluna com os dados do outro sensor. Poderia me ajudar?
Excelente publicação! Abs!
Olá, Felipe. Obrigado pelo retorno!
Para fazer o que você falou, basta modificar o arquivo do Arduino enviando os dados dos dois sensores pelo serial. Repare que os dados do post são separados por um pulador de linha (‘\n’). Portanto, basta enviar os seus dados utilizando o comando Serial.print() e o último dado utilizar o comando Serial.println(). Isto porque o println envia o caractere ‘\n’ no fim da linha. Além disto, recomendo separar os dados dos sensores com o caractere ‘\t’ que é um caractere de tabulação (espaço) e ele é extremamente útil caso você queira copiar os dados direto para o Excel. Considerando isto, você pode modificar seu programa da seguinte forma:
2
3
Serial.print("\t"); // Tabulação para separar os dados
Serial.println(valor_sensor2); // Envia o dado e o pulador de linha
E o arquivo de texto possuirá dois dados em cada linha, sendo um dado de cada sensor ultrassônico.
Abs!
Como adiciono ess biblioteca import processing.serial.*; ?
Essa biblioteca é natural do próprio Processing, então não exige download e nem nada além do próprio código. Lembrando que o código onde este ‘import’ aparece é o código para ser inserido no software Processing.
Onde fica a saida do txt ? onde eu localizo meu txt depois de compiçar o processing?
Depois de rodar o código no Processing o arquivo é gerado no mesmo diretório em que você salvou o código do Processing.
Como faço para salvar esse txt no meu computador? Preciso ler um sensor de luminosidade e gravar os valores do sensor no arquivo txt em meu computador.
Olá, Marcos. O post ensina a fazer exatamente o que você está querendo, basta ler o tutorial e replicar.
Em que local ele irá salvar o data.txt?
Por padrão será na mesma pasta onde você criar o arquivo do Processing.
Parabéns. Artigo muito bom.
Por favor, como mudo o caminho de arquivamento do txt para a minha pasta de pesquisa.
Grato
Olá, Fernando. Muito obrigado pelo seu retorno positivo!
Então, para mudar o caminho onde o arquivo será salvo, basta escrevê-lo no comando createWriter de acordo com o seguinte exemplo que salva o arquivo na minha área de trabalho dentro de uma pasta chamada “Dados”:
output = createWriter(“C:/Users/fabio/Área de Trabalho/Dados/nome_do_arquivo.txt”);
Espero ter ajudado! Qualquer coisa pode retornar o contato.
Boa noite, Fábio, estou tentando rodar o código para efetuar a separação dos dados obtidos em txt só que o seguinte erro está aparecendo: Not expecting symbol ‘i’, which is LATIN SMALL LETTER I.
Boa noite, Samuel. Qual programa você está utilizando para rodar o código, pois aqui eu utilizei o DevC++ e rodou sem este problema. Aproveitando sua pergunta, acabei olhando o código e fiz algumas correções.
estou utilizando a plataforma arduino para fazer um programa de leitura de umidade do solo e dei uma olhada no seu programa para salvar as leituras em txt, porem a plataforma não compila, aparece esse erro: ‘import’ does not name a type; did you mean ‘qsort’?
o que fazer??
Olá, Bianca. Por acaso você tentou compilar o código do Processing na IDE do Arduino? Senão, qual versão do Processing você está utilizando? Este erro ocorre, pois o programa não reconheceu o comando “import”, que é um comando que não existe na IDE do Arduino, mas sim no Processing.
Como faço para que o programa continue funcionando sem o computador?? quero que continue lendo os dados sem que precise de um computador conectado ao arduino, é possivel??
Olá, Bianca. É possível sim, mas depende da sua necessidade. A princípio, o código do Arduino ficará rodando continuamente independente se ele está conectado ao computador ou não. Mas, por não estar conectado ao computador, os dados lidos não serão gravados em lugar nenhum. Caso você deseje que os dados continuem sendo gravados você pode seguir dois caminhos: um é utilizar uma memória externa ao Arduino (no momento não tenho nenhum post a respeito) e outro caminho é utilizar a memória EEPROM interna do Arduino (tem um post aqui explicando: https://mundoprojetado.com.br/arduino-salvar-dados-da-memoria-eeprom-em-txt-ou-csv/).
Seu post mostrar exatamente o que desejo fazer mas o código mostra um erro.
Imagino que falta alguma biblioteca que não está indicada.
Veja o código de erro.
Arduino: 1.8.10 (Windows 10), Placa:”Arduino/Genuino Uno”
gravaarquivo:1:1: error: ‘import’ does not name a type; did you mean ‘qsort’?
import processing.serial.*; //Biblioteca importante para essa aplicação
^~~~~~
qsort
gravaarquivo:3:1: error: ‘PrintWriter’ does not name a type; did you mean ‘bitWrite’?
PrintWriter output; //Funcionalidade de escrita em arquivos
^~~~~~~~~~~
bitWrite
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino: In function ‘void setup()’:
gravaarquivo:6:28: error: ‘class HardwareSerial’ has no member named ‘list’
String portName = Serial.list()[0]; //configura a porta serial
^~~~
gravaarquivo:7:3: error: ‘mySerial’ was not declared in this scope
mySerial = new Serial(this, portName, 9600); //Configura a porta serial
^~~~~~~~
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino:7:3: note: suggested alternative: ‘Serial’
mySerial = new Serial(this, portName, 9600); //Configura a porta serial
^~~~~~~~
Serial
gravaarquivo:7:18: error: expected type-specifier before ‘Serial’
mySerial = new Serial(this, portName, 9600); //Configura a porta serial
^~~~~~
gravaarquivo:8:3: error: ‘output’ was not declared in this scope
output = createWriter( “data.txt” ); //Cria o objeto arquivo para gravar os dados
^~~~~~
gravaarquivo:8:12: error: ‘createWriter’ was not declared in this scope
output = createWriter( “data.txt” ); //Cria o objeto arquivo para gravar os dados
^~~~~~~~~~~~
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino:8:12: note: suggested alternative: ‘clearerr’
output = createWriter( “data.txt” ); //Cria o objeto arquivo para gravar os dados
^~~~~~~~~~~~
clearerr
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino: In function ‘void draw()’:
gravaarquivo:12:7: error: ‘mySerial’ was not declared in this scope
if (mySerial.available() > 0 ) { //Se receber um valor na porta serial
^~~~~~~~
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino:12:7: note: suggested alternative: ‘Serial’
if (mySerial.available() > 0 ) { //Se receber um valor na porta serial
^~~~~~~~
Serial
gravaarquivo:14:19: error: ‘null’ was not declared in this scope
if ( value != null ) { // Se o valor nao for nulo
^~~~
gravaarquivo:15:7: error: ‘output’ was not declared in this scope
output.print(hour()); //Escreve no arquivo as horas e os minutos atuais seguido do valor lido pelo sensor
^~~~~~
gravaarquivo:15:20: error: ‘hour’ was not declared in this scope
output.print(hour()); //Escreve no arquivo as horas e os minutos atuais seguido do valor lido pelo sensor
^~~~
gravaarquivo:17:20: error: ‘minute’ was not declared in this scope
output.print(minute());
^~~~~~
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino:17:20: note: suggested alternative: ‘init’
output.print(minute());
^~~~~~
init
C:\Users\joaor\Documents\Arduino\gravaarquivo\gravaarquivo.ino: In function ‘void keyPressed()’:
gravaarquivo:25:3: error: ‘output’ was not declared in this scope
output.flush(); // Termina de escrever os dados pro arquivo
^~~~~~
gravaarquivo:27:8: error: too few arguments to function ‘void exit(int)’
exit(); // Para o programa
^
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:23:0,
from sketch\gravaarquivo.ino.cpp:1:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdlib.h:288:13: note: declared here
extern void exit(int __status) __ATTR_NORETURN__;
^~~~
exit status 1
‘import’ does not name a type; did you mean ‘qsort’?
Este relatório teria mais informações com
“Mostrar a saida detalhada durante a compilação”
opção pode ser ativada em “Arquivo -> Preferências”
Obrigado
Olá, João. A partir da mensagem de erro, percebi que você tentou compilar o código na IDE do Arduino. Entretanto, este código é para ser compilado no Processing que é um OUTRO software que você deve baixar. Por isto aparece este tanto de erro, já que os dois são coisas diferentes. O código da IDE do Arduino é o que vem logo antes deste. Espero ter ajudado.
Ola Fábio. Sei que já faz um tempo que vc colocou isto aqui, porém esbarrei neste post devido minha busca por solução. Juntei, um módulo GPS, um sensor de temperatura e um SD Card em um Arduino. Após as leituras, crio um arquivo que leva o nome de acordo com a data e hora que tiro do GPS, então tudo esta funcionando, gravando as informações corretamente e mudando o arquivo após última leitura ultrapassar 24:59. Porém para minimizar o volume de dados, eu gostaria de que a cada vez que o arquivo fosse criado, a primeira linha já viria com as informações de latitude e longitude do GPS. O fato é que no loop as medidas variam, é isso mesmo que quero gravar, mas a latitude e longitude serão sempre as mesmas, então queria escrever isso apenas na primeira linha, logo na criação do arquivo e não a cada volta do laço. Teria algum forma de criar o aqruivo e escrever na primeira linha? Obrigado. César
Olá, Carlos. Acredito que exista uma forma sim. Mas fiquei sem entender um ponto. Você está criando o arquivo no seu cartão SD ou está utilizando o Processing para armazenar os dados?
Fábio, parabéns pelo trabalho realizado, com certeza você está ajudando muitas pessoas.
Pretendo realizar um contador de produção, apresentando os dados realizados através da contagem de objetos que passaram na linha de produção.
Olá, Márcio. Muito obrigado pelo comentário, é compensador ler esse tipo de retorno! Seu projeto parece bem interessante, te desejo sorte!
Olá, eu estou com dúvida, preciso salvar dados de distância (usando o sensor ultrassônico) em txt ou csv, porém ele indica que a biblioteca não existe.
Olá, Guilherme. Em qual software que está acontecendo este problema da biblioteca, na IDE do Arduino ou no Processing?
Olá Fábio, meus parabéns a explicação foi cirúrgica e fez com que não ouve-se dúvidas, porém por curiosidade minha vc sabe se é possível fazer o mesmo com o valor de um sensor de umidade? Para compilação do código vc utilizou C++?
Olá, Mateus. Muito bom saber que gostou do post! Obrigado pelo feedback.
Sobre sua dúvida, o valor do sensor de umidade é do tipo float? Se sim, o caminho é o mesmo mostrado no post, o que muda é o código de separação dos dados (o que fiz em c++). Exemplo do código do Arduino:
float umidade = ….;
Serial.println(umidade);
E pro código em C++ eu usei o programa DevCpp.
Boas, estou a pretender usar um arduino e um max6675, para medir altas temperaturas e guardar em ficheiro separados os dados, a entrada dos pins e o codigo no arduino tem que ser alterado, mas nao esta a resultar, podes-me ajudar?
Olá, Marcos. Posso ajudar sim. Qual é o problema exatamente? Se quiser, pode me mandar uma mensagem por e-mail: mundoprojetado@gmail.com
Olá, Fábio! Muito obrigado pela postagem, me ajudou muito.
Gostaria de saber se é possível ter acesso aos dados já gravados sem parar a gravação. Eu notei que é possível sim, mas tem vezes em que o arquivo .txt fica o tempo todo vazio e os dados só aparecem quando paro a gravação.
Olá, Luan. Por nada, fico feliz que tenha gostado!
Acredito que é possível sim, mas não tenho certeza quanto à forma de se fazer isso. Tente chamar o comando output.flush() logo após a gravação, dentro do if (value != null). Isso deve forçar o programa a escrever os dados no arquivo toda vez. Veja abaixo:
if ( value != null )
{
output.print(hour());
…
output.flush();
}
Obrigado pela atenção, Fábio. Funcionou!
Abç.
Show de bola então, Luan! Abraço.
Olá!
Não aparece o arquivo .txt na pasta. Oque poderia ser?
Olá, Paulo. Hmm, boa pergunta. Dependendo, acho que o arquivo só aparece quando você finaliza a gravação (apertando alguma tecla na tela do processing). Se esse for o caso, veja nos comentários minha resposta ao Luan sobre como contornar esse problema.
Olá Fabio, tudo bem?
Achei seu código para salvar os dados da leitura do arduino, muito bom e muito bem explicado, contudo, estou com um problema. Não estou conseguindo gerar o arquivo com os dados e o Processing não acusa nenhum erro. Consegue me ajudar?
Olá, Rodrigo. Estou bem e você?
Obrigado! Veja se o seu problema tem relação com o comentário do Paulo Henrique. Se este for o caso, eu atualizei o código para corrigir o problema. Então copie ele e teste novamente para ver se funciona dessa vez.
Boa tarde Fábio,
Eu estou a medir os dados obtidos através de um sensor de temperatura ligado ao Arduino Uno.
Pretendo guardar esses dados em um ficheiro txt.
Para o Processing estou o software processing-3.5.4.
Eu utilizei o o código do teu post, mas estou com um erro no software processing, que é o seguinte:
RuntimeException: Error opening serial port COM3: Port Busy
Por acaso a COM3 é onde está ligado o Arduino.
Consegues me ajudar?
Boa tarde, Pedro.
Esse erro acontece quando a porta serial já está sendo utilizada por outro programa. Isso quer dizer que você não pode abrir o monitor serial do Arduino enquanto utiliza o Processing para gravar os dados. Se for o caso, feche o monitor serial ou veja se algum programa está utilizando a COM3 e tente novamente.
Boa tarde!
Estou tentando fazer a utilização do seu código, o primeiro, sem separação de horário, mas o arquivo txt não é criado, e a porta COM6 que meu arduino esta conectado não esta sendo reconhecida pelo processing ?poderia me dar um Help
Boa noite, Victor! Provavelmente não está criando o arquivo por causa do problema de não reconhecer a porta. Lembre-se de fechar o monitor serial do Arduino antes de rodar o código do Processing. Se você não fizer isso, o Arduino bloqueia a leitura da porta COM6 e o Processing não consegue acessar ela. Se este não for o problema, você lembrou de alterar a linha 6 do código do Processing para ficar de acordo com a sua porta COM? Se você estiver lembrado das duas coisas, me diga qual é mensagem do erro que aparece no Processing para eu poder te ajudar melhor.
Bom dia, seria possível mandar esse arquivo txt para um raspberry pi que depois então jogaria para um hd externo (conectado ao raspberry pi) ?
Olá, Clayton. É possível sim. Acho que a forma mais fácil é conectar o Arduino diretamente ao USB do Raspberry e rodar o código nele. Assim, é só mudar o comando abaixo pra conter um diretório dentro do HD:
output = createWriter( “/dev/nome_do_hd/diretorio_desejado/data.txt” );
Ou então você roda o código direto no HD dentro do diretório que você quer salvar o arquivo.
Boa tarde Fábio, tudo bem?
Venho aqui depois de alguns anos desde o post, e estou com uma duvida, em meu projeto eu estou utilizando esse txt em uma interface grafica para fazer o grafico, eu gostaria de saber se os dados so serão coletados quando eu rodar o processing? não ha um jeito de automatizar?
sobre meu projeto, estou utilizando um sensor de bomba dagua,e sua saida é sempre 0/1, a intenção do grafico é medir quantas vezes no intervalo de tempo predefinido o nivel da agua subiu
Boa noite, Edward. Estou bem e vc?
O Arduino envia os dados via Serial constantemente, porém eles só serão salvos no arquivo txt se você rodar o Processing. Não sei qual sistema operacional você está usando, mas é bem provável que tenha como iniciar o programa automaticamente e automatizá-lo de alguma forma. Porém, eu recomendaria você seguir um caminho diferente do Processing e criar um código em Python para captar os dados via USB e já desenhá-los em um gráfico. Mesmo se você não souber Python, é só pedir o Chat GPT pra criar o código pra você, pois será bem simples. Basicamente dá pra usar a biblioteca PySerial pra obter os dados do Arduino e a biblioteca matplotlib para desenhar o gráfico.
Obrigado pela ajuda, ja me deu uma grande luz hahahaha, a interface e o grafico estão sendo feitos pelo python mesmo, irei testar a biblioteca PySerial
Por nada. Show de bola então!
quando realizo um salvamento seguinte, os dados salvos aparecem no arquivo txt, mas os salvos anteriormente somem, como resolver isso?
obrigado
Você vai precisar criar uma forma de mudar o nome do arquivo toda vez que iniciar a gravação. Um exemplo seria fazer o nome do arquivo ser igual a data e hora. O chat-gpt consegue criar isso pra você sem problemas.