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!