Olá pessoal,
Estou tentando construir um leitor de Tags RFID que leia o ID e o guarde, junto com data e hora em um cartão de memória, porém quando coloco o comando para abrir o arquivo "variável = SD.open ("arquivo.txt", FILEWRITE);" o programa não consegue detectar mais de uma tag. Ele detecta a tag que entra no campo, guarda o valor mas não faz um loop, identificando após o tempo de delay. Gostaria de saber se alguem ja passou por isso e como solucionou. Não achei muita coisa online a respeito, pelo menos nada que desse resultado.
Tags:
Olá,
Antes que nada sugiro ler este link e postar da maneira adequada, creio que será melhor para que os colegas lhe ajudem.
http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
Você esta usando o codigo do link abaixo?:
http://www.arduinoecia.com.br/2016/10/modulo-pn532-nfc-rfid-arduino...
Eu tenho um tutorial de envio da TAG mas usando o RFID Milfare e um site de IoT link abaixo no meu canal, e na descrição do vídeo link do projeto completo.
https://www.youtube.com/watch?v=a9HOjz0DkN8&t=3s
Abs.
CK
Olá,
Esse código foi adaptado seguindo o exemplo "Read all memory blocks" que vem juntamente da biblioteca PN532, ou seja, este:
//This example reads all MIFARE memory block from 0x00 to 0x63.
//It is tested with a new MIFARE 1K cards. Uses default keys for authenication.
//Contributed by Seeed Technology Inc (www.seeedstudio.com)
#include <PN532.h>
#include <SPI.h>
/*Chip select pin can be connected to D10 or D9 which is hareware optional*/
/*if you the version of NFC Shield from SeeedStudio is v2.0.*/
#define PN532_CS 10
PN532 nfc(PN532_CS);
#define NFC_DEMO_DEBUG 1
void setup(void) {
#ifdef NFC_DEMO_DEBUG
Serial.begin(9600);
Serial.println("Hello!");
#endif
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
Serial.print("Didn't find PN53x board");
#endif
while (1); // halt
}
#ifdef NFC_DEMO_DEBUG
// Got ok data, print it out!
Serial.print("Found chip PN5");
Serial.println((versiondata>>24) & 0xFF, HEX);
Serial.print("Firmware ver. ");
Serial.print((versiondata>>16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata>>8) & 0xFF, DEC);
Serial.print("Supports ");
Serial.println(versiondata & 0xFF, HEX);
#endif
// configure board to read RFID tags and cards
nfc.SAMConfig();
}
void loop(void) {
uint32_t id;
// look for MiFare type cards
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0)
{
#ifdef NFC_DEMO_DEBUG
Serial.print("Read card #");
Serial.println(id);
Serial.println();
#endif
/* uint8_t keys[]= { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };// default key of a fresh card
for(uint8_t blockn=0;blockn<64;blockn++)
{
if(nfc.authenticateBlock(1, id ,blockn,KEY_A,keys)) //authenticate block blockn
{
//if authentication successful
uint8_t block[16];
//read memory block blockn
if(nfc.readMemoryBlock(1,blockn,block))
{
#ifdef NFC_DEMO_DEBUG
//if read operation is successful
for(uint8_t i=0;i<16;i++)
{
//print memory block
Serial.print(block[i],HEX);
if(block[i] <= 0xF) //Data arrangement / beautify
{
Serial.print(" ");
}
else
{
Serial.print(" ");
}
}
Serial.print("| Block ");
if(blockn <= 9) //Data arrangement / beautify
{
Serial.print(" ");
}
Serial.print(blockn,DEC);
Serial.print(" | ");
if(blockn == 0)
{
Serial.println("Manufacturer Block");
}
else
{
if(((blockn + 1) % 4) == 0)
{
Serial.println("Sector Trailer");
}
else
{
Serial.println("Data Block");
}
}
#endif
}
}
} */
}
delay(1000);
}
Estou usando um shield da Elecrow (https://www.elecrow.com/wiki/index.php?title=NFC_Shield) que utiliza a biblioteca PN532.
Quando não coloco o Cartão SD, a saída fica conforme a imagem:
Agora, quando eu coloco a instrução pra abrir, escrever e fechar o arquivo, ele se comporta da seguinte forma:
talvez você deva mudar o esquema, abra o arquivo no setup e use a função SD.flush(), esse comando força a biblioteca a gravar os dados fisicamente, o tempo de abrir/gravar/ fechar, vai deixar de existir
Acredito que esteja usando a sintaxe do flush() errado, pois ele não conseguiu abrir o arquivo:
//Placa PN532 NFC
#include <PN532.h>
#include <SPI.h>
#define PN532_CS 10
PN532 nfc(PN532_CS);
#define NFC_DEMO_DEBUG 1
//RTC
#include <Time.h>
#include <DS1307.h>
DS1307 rtc (A4, A5);
//CARTAO SD
#include <SPI.h>
#include <SD.h>
Sd2Card card;
const int chipSelect = 8;
File CatracaLog;
void setup(void) {
SD.begin (8);
CatracaLog.flush();
#ifdef NFC_DEMO_DEBUG
Serial.begin(9600);
Serial.println("Olá");
#endif
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
tone(5,262,200); //DO
delay(200);
tone(5,262,200); //DO
delay(200);
Serial.print("Didn't find PN53x board");
#endif
while (1); // halt
}
#ifdef NFC_DEMO_DEBUG
// Got ok data, print it out!
Serial.print("Found chip PN5");
Serial.println((versiondata>>24) & 0xFF, HEX);
Serial.print("Firmware ver. ");
Serial.print((versiondata>>16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata>>8) & 0xFF, DEC);
Serial.print("Supports ");
Serial.println(versiondata & 0xFF, HEX);
#endif
// configure board to read RFID tags and cards
nfc.SAMConfig();
rtc.halt(false);
//As linhas abaixo setam a data e hora do modulo
//e podem ser comentada apos a primeira utilizacao
//rtc.setDOW(SATURDAY); //Define o dia da semana
//rtc.setTime(03, 01, 0); //Define o horario
//rtc.setDate(04, 11, 2017); //Define o dia, mes e ano
//Definicoes do pino SQW/Out
rtc.setSQWRate(SQW_RATE_1);
rtc.enableSQW(true);
//Mostra as informações no Serial Monitor
Serial.print("Hora atual : ");
Serial.print(rtc.getTimeStr());
Serial.print(" ");
Serial.print("Data atual: ");
Serial.print(rtc.getDateStr(FORMAT_SHORT));
Serial.print(" ");
Serial.println(rtc.getDOWStr(FORMAT_SHORT));
}
void loop(void) {
uint32_t id;
// look for MiFare type cards
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0){
Serial.print("Read card #");
Serial.println(id);
Serial.println();
//CatracaLog = SD.open("log.txt", FILE_WRITE);
if (CatracaLog) {
Serial.println("Hora: ");
Serial.println(rtc.getTimeStr());
Serial.println("Data:");
Serial.println(rtc.getDateStr(FORMAT_SHORT));
Serial.print("ID: #");
Serial.println(id);
Serial.println();
CatracaLog.print("ID do cartão lido: #");
CatracaLog.print(id);
CatracaLog.print(" ");
CatracaLog.print("Hora : ");
CatracaLog.print(rtc.getTimeStr());
CatracaLog.print(" ");
CatracaLog.print("Data : ");
CatracaLog.print(rtc.getDateStr(FORMAT_SHORT));
CatracaLog.println(" ");
// Fechando o arquivo:
CatracaLog.close();
tone(5,262,200); //DO
delay(200);
} else {
tone(5,262,800); //DO
delay(1000);
tone(5,262,800); //DO
delay(1000);
// if the file didn't open, print an error:
Serial.println("Erro ao tentar abrir o arquivo log.txt para escrita");
//return;
}
}
// if the file didn't open, print an error:
//Serial.println("Erro ao tentar abrir o arquivo log.txt para escrita");
//return;
delay (3000);
}
Ta certo?
Boa tarde APA.
Recomendações:
1. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
2. Remova seu sketch da área de texto do seu tópico;
3. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
com o seu sketch.
RV
Boa tarde!
Sim concordo com o Mineirin.
Postando muito código na área do post fica difícil de analisar pois, além de ficar desalinhado, mistura código com texto, dificultando as buscas.
Porque você usou
SD.begin (8);
No Arduino UNO, normalmente é
SD.begin (10) ou SD.begin ();
Por conta do Shield do NFC mudei o conector dele. Acha que isso pode estar interferindo?
MISO -- 12
MOSI -- 11
SCK -- 13
CS -- 8
Obs: 3.3 v não conectado, nem o eu GND.
Alex, Você já fez testes separados de cada dispositivo? Funcionou?
Pode ser que o NFC esteja entrando em conflito com o SD, devido ao pino SS.
O NFC por padrão é o pino 10
Veja se este post te ajuda;
Sim. As funcionalidades foram testadas de forma distinta e não houve problemas, mesmo com esse padrão alterado. Vale destacar que a funcionalidade de gravar no SD não deixa de acontecer, ela só não entra em loop como deveria.
Isso acontece quando a instrução " SD.open("log.txt", FILE_WRITE);" é chamada no código, mesmo com pinos diferentes, tendo sua conclusão de escrita, pois o dado aparece no cartão. Após esse comando de escrita, o dispositivo não volta no início do "void loop (void){...}"
O shield de NFC que eu estou usando tem padrão 9 e 10 como pinos para o SS, conforme a imagem abaixo fornecida pelo fabricante:
Sobre o tutorial, irei tentar mais tarde e posto aqui a resposta.
Agradeço pela ajuda.
Alex, bom dia!
Se o cartão gravou uma vez, então a configuração deve estar certa.
O problema pode ser nesse IF abaixo:
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0){ ....
Imprima o valor da variável id na serial para ver se ela está sendo obtida corretamente todas as vezes.
Boa noite,
Sim. Está sendo obtida corretamente. O Cartão parece interromper o processo todo.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por