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.

Data Logger Shield Arduino com RFID PN532

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:

Detalhes 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.

Data logger Shield e Arduino Uno

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:

Circuito Data Logger Shield e módulo leitor RFID PN532

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:

Serial Monitor

Após passar a tag algumas vezes, retire o cartão SD do slot e abra o arquivo LOG.TXT no computador:

Arquivo texto do data logger

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!

5/5 - (1 vote)