Neste post vamos montar um sistema de coleta e armazenamento de dados, ou data logger, para gravar informações em um cartão SD usando o Data logger shield Arduino com o módulo RFID PN532, que já vimos anteriormente aqui no blog.

Com o datalogger, você pode gravar também outras informações como por exemplo temperatura, umidade, pressão e outros dados de sensores, gravando isso em um cartão SD e posteriormente alimentando uma planilha ou um banco de dados.
O Data Logger Shield
O Data Logger Shield é uma placa relativamente simples, com um slot para cartão SD, um botão de reset, leds indicadores e um suporte para bateria. Conta também com uma conveniente área de prototipagem para você montar o seu circuito diretamente no shield:
A bateria serve para alimentar o CI DS1307, que é um RTC (Real Time Clock ou Relógio de Tempo Real). Esse relógio incorporado na placa facilita a tarefa de armazenar no cartão SD a hora exata em que um evento ocorreu, sem depender de um hardware externo para isso.
Para utilizar o módulo, simplemente encaixe-o no Arduino conforme a imagem acima.
Data logger shield com módulo RFID
O nosso circuito de testes usa o data logger shield com um módulo RFID NFC PN532, comunicando-se com um Arduino Uno através da interface I2C nos pinos analógicos A4 (SDA) e A5 (SCL).
Siga o esquema de ligação abaixo, lembrando que se preferir você pode soldar o módulo RFID na área de prototipagem do data logger shield. Isso vai deixar o circuito muito mais compacto:
Fizemos a conexão do PN532 diretamente nos pinos do Arduino, mas talvez seja necessário usar resistores pull up nesse barramento se você estiver enfrentando problemas de comunicação entre o RFID e a placa.
Programa coleta de dados RFID
Antes de carregar o programa, faça o download da biblioteca do PN532 neste link. Essa biblioteca foi alterada para uso com a conexão I2C, e é diferente daquela utilizada no post Comunicação sem fio com módulo PN532 NFC RFID onde utilizamos a interface serial (HSU).
Faça também o download da biblioteca RTClib, que vai fornecer as informações de data e hora para o data logger.
Entre as linhas 40 e 45 do código você encontra as instruções para acertar a hora do RTC. Isso pode ser feito de forma manual, ou com a data e hora em que foi feita a compilação do programa.
O programa cria no cartão SD um arquivo chamado LOG.TXT, e armazena nesse arquivo a data, a hora e a identificação do cartão (UID):
//Programa: Data logger com modulo RFID PN532
//Autor: Arduino e Cia
#include "nfc.h"
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>
//Pino CS do cartao SD
int Pino_CS = 10;
RTC_DS1307 rtc;
NFC_Module nfc;
File file;
void setup()
{
Serial.begin(115200);
Serial.println("Data logger com modulo PN532");
Serial.println();
//Inicia o cartao SD
Serial.println("Iniciando cartao SD...");
if (!SD.begin(Pino_CS))
{
Serial.println("Falha na inicializacao do SD!");
return;
}
Serial.println("Cartao SD iniciado. OK");
Serial.println();
//Verifica as condicoes do RTC
if (! rtc.begin())
{
Serial.println("RTC nao encontrado!");
while (1);
}
if (! rtc.isrunning())
{
Serial.println("RTC nao operante!");
//A linha abaixo ajusta o RTC com a data e hora do momento da compilacao
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//A linha abaixo permite ajustar manualmente a data e hora do RTC
//Formato: DateTime(ano, mes, dia, hora, minuto, segundo)
//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//Inicia modulo PN532
nfc.begin();
uint32_t versiondata = nfc.get_version();
if (! versiondata)
{
Serial.print("Modulo PN53x nao encontrado!");
while (1); //Para o programa
}
//Mostra informacoes do modulo PN532
Serial.print("Encontrado modulo PN5");
Serial.print((versiondata >> 24) & 0xFF, HEX);
Serial.print(" Firmware ver. ");
Serial.print((versiondata >> 16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata >> 8) & 0xFF, DEC);
nfc.SAMConfiguration();
Serial.println("Aguardando leitura...");
}
void loop(void)
{
String uid_string = "";
//Verifica a presenca de um cartao RFID
u8 buf[32], sta;
sta = nfc.InListPassiveTarget(buf);
//Cartao detectado, verifica as informacoes e
//mostra no Serial Monitor
if (sta && buf[0] == 4)
{
Serial.print("Tamanho UID:");
Serial.println(buf[0], DEC);
for (int i = 1; i <= 4; i++)
{
uid_string.concat(String(buf[i] < 10 ? "0" : ""));
uid_string.concat(String(buf[i], HEX));
uid_string.concat(" ");
}
uid_string.toUpperCase();
Serial.print("UID cartao: ");
Serial.println(uid_string.substring(0));
Serial.println("Gravando dados no SD...");
grava_cartao_SD(uid_string);
delay(2000);
Serial.println();
Serial.println("Aguardando nova leitura...");
}
}
void grava_cartao_SD(String uid_card)
{
//Abre arquivo no SD para gravacao
file = SD.open("log.txt", FILE_WRITE);
//Le as informacoes de data e hora
DateTime now = rtc.now();
//Grava os dados no cartao SD
file.print("Data/hora: ");
Serial.print(now.day() < 10 ? "0" : "");
file.print(now.day(), DEC);
file.print('/');
file.print(now.month() < 10 ? "0" : "");
file.print(now.month(), DEC);
file.print('/');
file.print(now.year(), DEC);
file.print(' ');
file.print(now.hour() < 10 ? "0" : "");
file.print(now.hour(), DEC);
file.print(':');
file.print(now.minute() < 10 ? "0" : "");
file.print(now.minute(), DEC);
file.print(':');
file.print(now.second() < 10 ? "0" : "");
file.print(now.second(), DEC);
file.print(' ');
file.print("- UID Cartao: ");
file.println(uid_card);
//Fecha arquivo
file.close();
}
Para testar, aproxime uma tag do leitor RFID. Serão mostradas no serial monitor as informações de hardware do módulo e também a UID da tag:
Após passar a tag algumas vezes, retire o cartão SD do slot e abra o arquivo LOG.TXT no computador:
O arquivo armazena as informações de data e hora em que o cartão foi colocado sobre o leitor. Você pode posteriormente incluir outras informações como nome do usuário, dados de outros sensores, informações de local, etc.
Quer importar as informações armazenadas no cartão SD em uma planilha e realizar cálculos, gerar gráficos e outras funções? Confira o post Importando os Dados do Data Logger em uma planilha, aqui mesmo no Arduino e Cia!