Manual

do

Maker

.

com

Data logger shield com Arduino

Data logger shield com Arduino

Data logger ou 'registrador de dados' é um periférico que, no caso do Arduino, é  utilizado para armazenar dados de transações ou parâmetros de configuração. Dá pra utilizar a EEPROM interna ou uma externa para tal, mas a manipulação desses dados não é tão simples quanto utilizar um data logger shield, onde os dados serão armazenados em um cartão SD.

Características do data logger shield

Não há grandes complexibilidades no hardware em sí. Basicamente, ele possui uma área de prototipagem, botão de reset, slot para o cartão SD e o mais legal; um RTC DS1307 (veja esse artigo a respeito). RTC é o acrônimo de "Real Time Clock", caso você não saiba. E é fundamental para o armazenamento de logs, uma vez que o tempo é a chave primária de eventos. Por fim, não poderia faltar o slot para a bateria do RTC, afinal, o data logger precisa ter a habilidade de gerencia corretamente esse tempo e não é nada interessante tomar uma base de tempo externa no momento em que a alimentação do Arduino for retomada.

Configurando o data logger shield

A configuração tem duas etapas; o RTC e o data logger em sí. Nesse caso, precisaremos de duas bibliotecas, cada qual para seu respectivo periférico.

Configurar o RTC do data logger shield

Para configurar o RTC, será necessário instalar a biblioteca RTClib da Adafruit (tem pelo menos mais uma, mas vamos utilizar essa). Para isso, acesse o menu sketch > Include library > Manage libraries e procure por RTClib.

Nos sketches de exemplovocê encontrará tudo o que precisa para dominar esse RTC. Alguma linhas de código da configuração referente ao RTC foram tiradas de lá.

Configurar o SD

Esse também, nenhum segredo. No menu de exemplos tem diversos exemplos de sua utilização, por isso, não tem o que inventar, sua utilização é simples e sua configuração é rápida!

Código para o data logger shield

Vou comentar no código e em seguida faço minhas observações.

#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

RTC_DS1307 rtc;
File file;

byte cs_pin    = 10;

int start_time = 0;
int timeout    = 0;

void setup()
{
  start_time = millis();
  Serial.begin(115200);

  //No sketch de exemplo mostra a boa prática para gerenciar a inicialização
  Serial.println("Starting SD card...");
  if (!SD.begin(Pino_CS)){
    Serial.println("Failed!");
    return;
  }

  Serial.println("SD card started.");
  Serial.println();

  //valida a inicialização
  if (!rtc.begin()){
    Serial.println("RTC not found!");
    while (1); //fica aqui pra sempre
  }
  if (!rtc.isrunning()){
    Serial.println("RTC is not working!");

    rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //Ajuste de data e hora na compilação, pela substituição das macros
    
    //rtc.adjust(DateTime(2018, 1, 1, 0, 0, 0));    //ajuste manual: DateTime(year, month, day, hour, minute, second)
  }
}

void loop(void)
{
  timeout = millis() - start_time;
  if (timeout > 10000){
    log("gravando dados...\n");
    start_time = millis();
  }
}

void log(char *msg){
  Serial.println("Loggin..");
  file = SD.open("data.log", FILE_WRITE);

  DateTime now = rtc.now();

  file.print(now.day(), DEC);
  file.print('/');
  file.print(now.month(), DEC);
  file.print('/');
  file.print(now.year(), DEC);
  file.print(' ');
  file.print(now.hour(), DEC);
  file.print(':');
  file.print(now.minute(), DEC);
  file.print(':');
  file.print(now.second(), DEC);
  file.print(' ');
  file.print(msg);
  file.close();
  delay(2000);
  Serial.println("Done.");
}

Como pode-se ver, é bastante simples a configuração desse data logger shield, bastando implementar;

  • setup do RTC
  • setup do SD
  • função de escrita em arquivo

E a partir de então, você pode gerar arquivos de log no SD card e ler no seu sistema operacional preferido posteriormente!

Mais sobre o SD card

A SD lib foi construida sobre a sdfatlib e ela suporta escrita em sistemas de arquivos FAT16 e FAT32, porém só suporta o formato de nome de arquivos curto, no formato 8x3 (12345678.123). Desse modo, atente-se ao nome de arquivo pretendido.

A biblioteca tem suporte a nível de diretório, mas para arquivos na raíz não é necessário passar '/'. Desde a versão 1.0, pode-se abrir múltiplos arquivos.

A comunicaçao com o SD card é feita através do protocolo SPI, que faz uso dos pinos digital 11, 12 e 13 na maioria dos Arduino e pinos 50, 51 e 52 no Arduino Mega. Um pino adicional deve ser configurado para a seleção do SD card, por isso selecionamos o pino 10 como CS (que é o pino SS na maioria das boards Arduino). Outra vez, no Mega, o pino SS é o 53.

Tendo em conta que esses pinos estarão em uso pelo SD, reserve-os em seu projeto, pois esses pinos não poderão ser utilizados simultaneamente por outros recursos o seu Arduino.

Mais sobre a biblioteca SD, você pode ver nesse link.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.