Como fazer um Datalogger com Arduino

Como fazer um Datalogger com Arduino

No tutorial de hoje nós vamos mostrar como montar um Datalloger com Arduino usando um Cartão SD. Para fazer este registrador de dados você vai precisar de um Arduino Uno, módulo RTC DS3231 e módulo cartão SD. Esse projeto vai registrar os dados de data, hora e temperatura a cada 1 minuto, gravando-os em um arquivo texto no cartão SD.

Circuito Datalogger

O módulo cartão SD nós já vimos anteriormente no post Como Gravar Dados no Cartão Sd com Arduino. Já o módulo DS3231 é um módulo RTC (Real Time Clock, ou Relógio de Tempo Real), sucessor do DS1307, com cristal oscilador embutido que torna o módulo muito mais preciso em relação aos modelos anteriores. Além disso, esse módulo também já tem embutido um sensor de temperatura.

Modulo RTC DS3231

A comunicação do módulo é feita pela interface I2C, possui alimentação de 3,3 a 5V e trabalha com nível de sinal de 5V, podendo ser ligado diretamente ao microcontrolador. Possui também uma bateria que preserva os dados na memória do DS3231 em caso de falta de energia.

Circuito Datalogger com Arduino

Ligue o DS3231 ao Arduino utilizando os pinos da interface I2C (pinos analógicos A4 (SDA) e A5 (SCL)). Na ligação do módulo cartão SD, que trabalha com nível de sinal de 3.3V, vamos utilizar um conversor de nível lógico 3,3-5V Bidirecional, que vai reduzir a tensão das portas do Arduino (5V) para os 3.3V suportados pelo módulo. Você também pode montar um divisor de tensão com resistores, se preferir.

Circuito Datalogger

No conversor de nível lógico, observe a ligação das tensões de referência (5V para o lado do Arduino, 3.3V para o lado do módulo SD). Sem essa ligação, o conversor não funciona.

Programa Datalogger

Nesse programa vamos utilizar as seguintes bibliotecas, além da SPI, Wire e Sd, já presentes na IDE do Arduino:

Baixe as três bibliotecas e coloque-as dentro da pasta LIBRARIES da IDE do Arduino.

O programa que captura a data e a hora do módulo é baseado no programa de exemplo SetSerial, da própria biblioteca. Adicionamos a função de gravar no cartão SD as informações de data, hora e temperatura à cada 1 minuto.

//Programa: Datalogger com Arduino, modulo RTC DS3231 e cartao SD
//Alteracoes e adaptacoes: FILIPEFLOP

#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>

//Pino CS do modulo cartao SD
int CS_PIN = 4;

File file;

void setup(void)
{
  Serial.begin(9600);
  //Inicializa o cartao SD
  inicia_SD();

  //Sincroniza a biblioteca Time com o RTC a cada 5 minutos
  setSyncProvider(RTC.get);
  Serial << F("Sincronizando com o RTC...");
  if (timeStatus() != timeSet) Serial << F(" Falha!");
  Serial << endl;
}

void loop(void)
{
  static time_t tLast;
  time_t t;
  tmElements_t tm;

  //Verifica se foi setado um novo horario
  //Formato: ano, mês, dia, hora, minuto, segundo
  if (Serial.available() >= 12) {
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000)
      Serial<<F("Erro: Ano deve ter dois ou quatro digitos!") <<endl;
    else {
      if (y >= 1000)
        tm.Year = CalendarYrToTm(y);
      else    //(y < 100)
        tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t);
      setTime(t);
      Serial << F("Horario modificado para: ");
      printDateTime(t);
      Serial << endl;
      while (Serial.available() > 0) Serial.read();
    }
  }

  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    //Grava dados no cartao a cada 1 minuto
    if (second(t) == 0)
    {
      float c = RTC.temperature() / 4.;
      float f = c * 9. / 5. + 32.;
      Serial << F("  ") << c << F(" C  ") << f << F(" F");
      Serial.println("\nGravando dados no cartao SD...");
      grava_SD(t);
    }
    Serial << endl;
  }
}

//Mostra data e hora na serial
void printDateTime(time_t t)
{
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
  Serial << ' ';
  //printTime(t);
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}

//Grava dados no cartao SD
void grava_SD(time_t t)
{
  float c = RTC.temperature() / 4.;
  abre_arquivo_gravacao("data.txt");
  file.print("Data: ");
  file.print(day(t));
  file.print("/");
  if (month(t) < 10)
  {
    file.print("0");
  }
  file.print(month(t));
  file.print("/");
  file.print(year(t));
  file.print(" Hora: ");
  if (hour(t) < 10)
  {
    file.print("0");
  }
  file.print(hour(t));
  file.print(":");
  if (minute(t) < 10)
  {
    file.print("0");
  }
  file.print(minute(t));
  file.print(":");
  if (second(t) < 10)
  {
    file.print("0");
  }
  file.print(second(t));
  file.print(" Temperatura: ");
  file.println(c);
  fecha_arquivo();
}

//Correcao para imprimir "00" ao inves de "0" caso
//o valor seja menor do que 10
void printI00(int val, char delim)
{
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}

void inicia_SD()
{
  pinMode(CS_PIN, OUTPUT);

  if (SD.begin())
  {
  } else
  {
    return;
  }
}

int abre_arquivo_gravacao(char filename[])
{
  file = SD.open(filename, FILE_WRITE);

  if (file)
  {
    return 1;
  } else
  {
    return 0;
  }
}

void fecha_arquivo()
{
  if (file)
  {
    file.close();
  }
}

Para setar a data e hora do módulo, entre no serial monitor e digite as informações no formato abaixo:

ano, mês, dia, hora, minuto, segundo

Serial Monitor - Horario

Para verificar as informações registradas, retire o cartão SD do módulo e abra o arquivo data.txt no seu computador utilizando o notepad ou outro editor de textos de sua preferência:

Serial Monitor - Dados

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP !

10
Como fazer um Datalogger com Arduino
46 votos, 4.92 classificação média (98% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

56 Comentários

  1. Luiz Fernando - 16 de junho de 2017

    Caro Adilson, boa noite.

    Estou tendo problemas com a montagem acima, me empenhei ao máximo para não cometer erros na montagem mas o fato é que não está gravando nada no cartão. Não dá erro e nada é gravado.

    Você pode me dar alguma orientação ?

    Atenciosamente.

  2. Wagner - 10 de abril de 2017

    Boa tarde, estou tentando compilar esse código e esta dando um erro no IDE 1.8.2, tentei compilar no IDE 1.6.6, porém as bibliotecas disponíveis no link não são reconhecidas, o que eu posso fazer?

  3. Rafael Wandekoken - 17 de março de 2017

    filipe bom dia. achei ótima sua ideia. Com esse projeto consigo gravar informações de tensão e corrente na saída de uma maquina de soldar?

  4. Eder Oliveira - 17 de março de 2017

    Olá,

    Tenho um Sensor Shield V5.0, pelas informações, ele já tem as conexões para o Cartão SD, utilizando-as, eu ainda assim necessito do conversor de nível lógico 5-3,3V ? Ou posso realizar a ligação diretamente?
    Haveria algum tutorial sobre isso?

  5. stevam - 26 de fevereiro de 2017

    Olá, galera!

    Eu tenho uma dúvida. Eu consigo mandar algum arquivo para um cartão SD conectado no arduino, sem que ele esteja conectado diretamente no PC… sei lá usando um módulo Bluetooth ou coisa parecida. Eu simplesmente conectaria (parearia) meu PC com o módulo, e enviaria dados para o cartão SD.
    Se a resposta for sim, como eu faria isso??

    Obs: Não sei se o que perguntei foi algo absurdo, mas não custa nada tentar.

  6. FÁBIO - 6 de janeiro de 2017

    Estou querendo gravar no cartão de memória outras variáveis além da data, hora e temperatura. Como faço para ficar tudo numa mesma linha ?? Digo isso por que as variáveis que acrescentei estão sendo gravadas sempre abaixo da linhas (data, hora e temperatura) do arquivo txt.

  7. Carol - 28 de dezembro de 2016

    Boa tarde, estou tendo o seguinte erro na compilação do código, o que está impedindo da gravação ser feita no cartão SD. Grata desde já com qualquer ajuda. :)

    C:\Users\carol\Documents\Arduino\DataLogguer__FP_166\DataLogguer__FP_166.ino: In function ‘void grava_SD(time_t)':

    C:\Users\carol\Documents\Arduino\DataLogguer__FP_166\DataLogguer__FP_166.ino:91:35: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

    abre_arquivo_gravacao(“data.txt”);

    ^

  8. John Lenon - 28 de dezembro de 2016

    Boa tarde amigos,
    Eu utilizo duas versões da IDE do Arduino a 1.0.4 e a 1.6.4, após baixar as bibliotecas e verificar o programa, nas duas versões aparecem o mesmo erro, gostaria de saber se com algum de vocês ocorreu este erro e se poderia me ajudar. Obrigado.

    Descrição do erro:

    Datalogger_com_RTC_3231.cpp.o: In function `printDateTime(unsigned long)':
    C:\Users\John Lenon\Documents\Programas para projetos\Arduino\arduino-1.0.4-windows\arduino-1.0.4/Datalogger_com_RTC_3231.ino:85: undefined reference to `monthShortStr(unsigned char)’

  9. Tayane - 11 de novembro de 2016

    Boa Tarde!
    Será que vocês poderiam me ajudar ?

    Criei um circuito com arduino e ldr, e gostaria de salvar o tempo que o led acende e printar na tela.

    Como faço a programação ?

    Estou usando essa programação

    //Sensor de luz

    int ledPin = 7; //Led no pino 7
    int ldrPin = 0; //LDR no pino analígico 8
    int ldrValor = 0; //Valor lido do LDR

    void setup() {
    pinMode(ledPin,OUTPUT); //define a porta 7 como saída
    Serial.begin(9600); //Inicia a comunicação serial
    }

    void loop() {
    ///ler o valor do LDR
    ldrValor = analogRead(ldrPin); //O valor lido será entre 0 e 1023

    //se o valor lido for maior que 500, liga o led
    if (ldrValor>= 800) digitalWrite(ledPin,HIGH);
    // senão, apaga o led
    else digitalWrite(ledPin,LOW);

    //imprime o valor lido do LDR no monitor serial
    Serial.println(ldrValor);
    delay(100);
    }

  10. Vitor Santana - 27 de outubro de 2016

    Filipe,
    Estou gostando muito do material do seu site, no caso o arquivo foi salvo em um txt no micro SD, conseguiria acessar o SD do arduino como um servidor FTP e buscar o arquivo? Como eu faria para mudar o clock do meu datalogger via PC? No caso criaria uma variável do inteira e escreveria nela via tcp/IP.

  11. Wilson Nogueira - 9 de outubro de 2016

    Bom dia Adilson e galera!
    Uma dúvida básica de um iniciante: estou desenvolvendo um programa parecido com este do datalogger só que meu tempo de espera entre leituras é de 30 minutos e estou usando a função delay ( ) para contagem deste tempo. Como faço para o sistema economizar energia durante este longo tempo de espera? Existe algo mais eficiente, em termos de gasto de energia da fonte, que a função delay ( )?
    Obrigado,
    Wilson

  12. JOSÉ ADENILSON PESSOA - 21 de setembro de 2016

    No meu apareceu um erro no código setSyncProvider(RTC.get)..
    Você saberia me dizer como coloco a data, hora e temperatura em um módulo matriz de led, para que possa aparecer no led letreiro esses dados?

  13. Alex - 12 de setembro de 2016

    Boa noite, gostaria de saber a possibilidade de pegar os dados do display ou seja a temperatura e a umidade e jogar para um arquivo no computador em formato de texto.

  14. Jonathan Machado De Souza - 11 de setembro de 2016

    Eu consigo criar um arquivo do tipo tabela de excel para jogar os dados no excel e etc?

  15. helton - 1 de setembro de 2016

    é possivel usando lcd visualizar os dados armazenados no cartao sd?

  16. alexandre - 31 de julho de 2016

    Estava utilizando esse tutorial, estava tudo funcionando até poucos dias agora da este erro :

    exit status 1
    ‘setSyncProvider’ was not declared in this scope

    por favor preciso de ajuda, se possível responder

    • Adilson Thomsen - 1 de agosto de 2016

      Boa tarde Alexandre,

      Qual versão da IDE você está usando ? Aqui com a 1.6.10 dá o mesmo erro. Utilizando uma IDE anterior (1.6.6, por exemplo), compila normalmente.

      Tente compilar usando uma versão mais antiga da IDE, por favor. Vou tentar descobrir se há algum conflito de bibliotecas com a IDE mais nova.

      Abraço!

      Adilson – Equipe FILIPEFLOP

  17. Paulo Henrique Ribeiro Pivoto - 16 de maio de 2016

    Estou com dificuldades para visualizar o circuito com o divisor de tensão com resistores. Vocês poderiam me mandar uma imagem de como ficaria o circuito?

  18. Felipe Pegoraro Doll - 14 de abril de 2016

    preciso ligar um anemômetro com datalogger, tem alguma dica de como posso fazer ??

  19. Gustavo Jean Menegazzo - 22 de março de 2016

    Boa noite gostaria de saber se tem algum tutorial deste para o Arduino mega 2560, pois estou com dificuldades para utilizar este módulo nesta placa.

  20. Vanderlei - 16 de março de 2016

    Boa noite,
    Nunca usei Arduino e nunca trabalhei com cartão SD e então eu gostaria de saber se posso gravar dados (total de 12 bytes) a cada 5ms no cartão SD.
    Minha intenção é usar o MEGA 2560.
    obrigado,

  21. Lucas Machado - 10 de março de 2016

    Gostaria de saber se há alguma forma de ler os dados do arquivo através do Arduino, depois de salvo no cartão SD.

  22. rael - 20 de fevereiro de 2016

    Ola! no meu projeto estou o pino 12 e 13 ( não tem como alterar), neste caso tem como alterar para outros pino tipo o pino 7 e 6 que também é digital ? se sim como faço essa alteração?

  23. Jaidis - 29 de janeiro de 2016

    Preciso de um projeto desse pra registrar data e hora no cartão SD quando aperta em um botao gostaria do código e esquema se possivel

  24. Jaidis - 29 de janeiro de 2016

    Cara preciso de um código pra está função quando aperta um botao ele registrar a data e hora e salvar no cartão SD

  25. francisco - 25 de dezembro de 2015

    Bom dia, alguém poderia me explicar como funciona a biblioteca Streaming?

  26. Fernando - 18 de dezembro de 2015

    Olá. Gostaria de uma sugestão : Como posso fazer para implementar um higrometro e um ldr, onde deverei alterar para fazer a gravação dos dados do mesmo.

  27. Felipe - 18 de novembro de 2015

    Boa tarde,

    eu consigo colocar mais dois circuitos como este em apenas um Arduino? Estou precisando fazer a medição de 3 pontos distintos ao mesmo tempo e adquirir 3 placas Arduino ficaria muito custoso.

    Obrigado

  28. Estevão Cover De Santi - 17 de novembro de 2015

    Olá Adilson, seu artigo me ajudou muito. Eu quero agora colocar mais dados de sensores analogicos e digitais, na porta do arduino. Aonde eu insiro o código para ler as portas e gravar no arquivo txt?

  29. Fernando Eira - 2 de novembro de 2015

    Boa tarde,

    Poderia me informar se essa programação é compatível com o RTC DS1307 ? Seria necessário muitas modificações no programa ?

  30. Bruno Aguiar - 5 de outubro de 2015

    Boa noite,

    Qual programa você utiliza para fazer o desenho dos circuitos?

  31. Daniel Fernandes - 29 de setembro de 2015

    Ok Adilson! Excelente!! Gosto muito e sempre acompanho o blog de vcs,
    Muito obrigado pelo esclarecimento

  32. Daniel - 28 de setembro de 2015

    Por curiosidade, no que e, como seria aplicado esse circuito/projeto, por gentileza?
    Obrigado

    • FILIPEFLOP - 29 de setembro de 2015

      Bom dia Daniel,

      Geralmente em algum circuito do qual você precise guardar os dados para gerar algum relatório posterior. No nosso post, por exemplo, você pode jogar os dados no Excel e analisar como foi a variação de temperatura em um determinado período de tempo, determinar máximas, mínimas, médias, etc. Você também pode gravar no SD os dados de um alarme, saber quando foi aberta ou fechada uma porta, acionado um sensor, apenas citando algumas aplicações mais simples.

      Abraço!

      Adilson – Equipe FILIPEFLOP

  33. BRENDO - 22 de setembro de 2015

    Ele executa de 1 em 1 segundo, certo?
    Se eu quiser que execute de 2 em 2 segundo é só colocar um delay de 2 segundos no final do Loop?

  34. Bruno - 21 de setembro de 2015

    Boa tarde,

    Gostaria de alterar o tempo de gravação, para um valor abaixo de 1 minuto, porém não tenho certeza se entendi o código, ele pega a variável de segundos e toda vez que ela é igual a zero grava os dados no cartão? Gostaria de alterar para gravar a cada 20 seg por exemplo.

    • FILIPEFLOP - 22 de setembro de 2015

      Bom dia Bruno,

      Isso mesmo. Cada vez que o valor de segundos chega a 0, ele grava os dados no cartão. Para fazer isso a cada 20 segundos, você pode implementar um contador no programa e fazer o mesmo teste da linha 66.

      Abraço

      Adilson – Equipe FILIPEFLOP

      • Marlon Callegari - 8 de julho de 2017

        Boa tarde.

        Existe a possibilidade de se gravar no cartão o tempo de sessão de uso projeto. Isto é ao invés de registrar os dados de segundo em segundo, ser registrado o tempo de quando o projeto/arduino foi ligado e quando ele foi desligado. Registrando assim as sessões uso?

        Obrigado

  35. Amaral - 14 de setembro de 2015

    Adilson,
    tentei comprar o DS3231 mas esta esgotado, tem previsão de quando chega?
    abraço!

  36. Anonimo - 5 de setembro de 2015

    Estou tendo dificuldades para calcular um divisor de tensão de 5 para 3.3v . O maior valor que consegui foi 2.5V com dois resistores de 1k. Pode me dar uma ajuda?

  37. Brendo - 4 de setembro de 2015

    Estou pensando em adicionar nesse projeto um lcd 16×2 mas ambos utilizam a interface I2C. Como posso ligar os dois em uma placa arduino UNO?

  38. Bruno - 1 de setembro de 2015

    Quais os valores dos resistores para o divisor de tensão?

Deixe uma resposta