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:


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.

LDR com Arduino

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
}

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 “[ ]”, isso porque 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

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
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)
    }
  }
}

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… Isso que dá não pensar antes de fazer as coisas.

Agora, bastou jogar tudo no Excel e criar o gráfico abaixo:

Dados luminosidade LDR

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