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.

28 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. Boa noite,

      Consigo fazer a ligação desse data logge com o modulo RC522 também?

      Excluir
    3. Oi Rafael,

      Creio que consiga sim, sem problemas. Eu usei o PN532 por causa da interface I2C, o circuito ficou mais simplificado, mas usar o RC522 também é uma boa opção.

      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
    2. Olá, Boa tarde.
      Estou precisando fazer isso também e não entendendo muito dos códigos, teria como me ajudar?

      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
  8. olá como posso fazer um datalogger de um acionamento de botão?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Dê uma olhada neste post, por favor:

      https://www.arduinoecia.com.br/2014/11/gravando-dados-arduino-cartao-sd.html

      Abraço!

      Adilson

      Excluir
  9. Bom dia, como posso fazer com que mostre um registro ou informação armazenada no rótulo

    ResponderExcluir
  10. Olá, boa noite!

    Existe algum software que associe estes dados coletados das etiquetas a um banco de dados ?

    ResponderExcluir
  11. Bom dia
    montei um sistema de acesso com esses modulos e me deparei com dois problemas
    em um o horário fica adiantado em 3 horas no outro fica atrasado em 6 dias.
    Mesmo tentando fazer a compensação no ajuste manual, o erro de data e horario continuam... sabem algum motivo pra isso, e como resolver?
    Outro problema é que as vezes o sistema para de ler as TAGs e o reset não resolve. As vezes desconectando o NFC volta as vezes só desligando tudo, não faço nem ideia do que possa ser

    ResponderExcluir
    Respostas
    1. Boa noite,

      O DS1307 é relativamente instável, mas pelo que você está relatando, a diferença é bem grande... Pode ser um defeito no shield mesmo, mas só testando pra ter certeza.

      Pode ser algum problema de alimentação do circuito? Você está alimentando o Arduino pela porta USB do computador?

      Abraço!

      Adilson

      Excluir
  12. Olá, para usar esse shield no arduino mega 2560 tem alguma configuração específica?

    Obrigado...

    ResponderExcluir
  13. Boa noite...
    tentei usar o shield data logger com o arduino mega 2560 e não obtive sucesso...
    existe alguma configuração específica?

    ResponderExcluir
  14. Bom dia. Tenho exatamente esse shield, utilizei esse mesmo sketch, mas não consigo gravar nada no cartão SD. Na verdade não consigo nem inicializar o cartão SD. Alguma ajuda?

    Obrigado.

    ResponderExcluir
    Respostas
    1. Oi Bruno,

      Desculpe a demora. Conseguiu?

      Abraço!

      Adilson

      Excluir
  15. Tenho um cartao sd sandisk 32G, nao quer funcionar de jeito nenhum, poderia me dar alguma dica?

    ResponderExcluir
    Respostas
    1. Oi Henrique,

      Tenho dúvidas se ele vai funcionar com cartões dessa capacidade.. vc tentou outros cartões?

      Abraço!

      Adilson

      Excluir
  16. Olá, não consigo iniciar o SD Card, dá sempre a seguinte mensagem: "Falha na inicializacao do SD!"

    Sabe o que devo verificar?

    ResponderExcluir