12 fevereiro 2017

Como usar o Data logger shield com módulo RFID

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, além de 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, deixando 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 data logger e RFID PN532


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, que pode ser feita 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):


  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
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//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, que vai mostrar 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, e você pode posteriormente incluir outras informações como nome do usuário, dados de outros sensores, informações de local, etc.

12 comentários:

  1. Ola bom dia.
    com esse data logger eu consigo receber informações de corrente e tensão na saida de uma mquina de solda?

    ResponderExcluir
    Respostas
    1. Oi Rafael,

      Consegue sim. Você terá que instalar os sensores adequados para que eles se comuniquem com o microcontrolador.

      Abraço!

      Adilson

      Excluir
  2. Olá, boa noite! Sou novo nesse mundo da programação para Arduíno, bom, preciso exatamente desse projeto, porém ao invés de mostra o código das tags, eu quero que apareça o nome do usuário cadastrado.

    ResponderExcluir
    Respostas
    1. Oi Rogério,

      Você pode associar uma string à uma TAG, não é muito complicado. Se precisar de ajudar ou desenvolver esse projeto, entre em contato utilizando o formulário no lado direito da página.

      Abraço!

      Adilson

      Excluir
  3. Olá, boa tarde...

    Qual a máxima taxa de amostragem que é possível com esse datalogger?

    Preciso de algo em torno de 1000 HZ (1khz)

    ResponderExcluir
  4. boa noite sera que consigo enviar dados do arquivo LOG.TXT para o tag?

    ResponderExcluir
    Respostas
    1. Oi Ericka,

      É possível sim, mas vc teria que usar um outro módulo RFID, o MFRC522, que faz tanto a leitura como a gravação de tags. Procure por RFID aqui no blog e você encontrará posts sobre o MFRC522.

      Abraço!

      Adilson

      Excluir
  5. Bom dia, teria como postar um tutorial onde eu consiga ler as informações gravadas no cartão via rede wireless. Desde já agrdeço!

    ResponderExcluir
  6. olá,
    boa noite!
    O RTC não mantém o horário correto mesmo com bateria nova!!!
    Alguém já teve este tipo de comportamento neste shield?
    Abç,
    José Roberto

    ResponderExcluir
    Respostas
    1. sim, tive o mesmo problema
      ele mantem um horário com 2 horas e meia a frente de programado, ainda não sei o porque, mas estou reprogramando com essa defasagem para corrigir

      Excluir
  7. Gostaria de saber como usar o CD (Card Detect). Precisa de resistor? Qual? Obrigado.

    ResponderExcluir