Boa tarde pessoal,

Estou com montando um projeto com RFID wiegand com o log no SD card, porém estou com um problema na hora de realizar a comparação do ID gravado com o lido.

A programação é uma adaptação do programa criado pelo Daniel da pagemac.

Se alguém tiver uma idéia para ajudar.

/*
* HID RFID Reader Wiegand Interface for Arduino Uno
* Written by Daniel Smith, 2012.01.30
* www.pagemac.com
*
* This program will decode the wiegand data from a HID RFID Reader (or, theoretically,
* any other device that outputs weigand data).
* The Wiegand interface has two data lines, DATA0 and DATA1. These lines are normall held
* high at 5V. When a 0 is sent, DATA0 drops to 0V for a few us. When a 1 is sent, DATA1 drops
* to 0V for a few us. There is usually a few ms between the pulses.
*
* Your reader should have at least 4 connections (some readers have more). Connect the Red wire
* to 5V. Connect the black to ground. Connect the green wire (DATA0) to Digital Pin 2 (INT0).
* Connect the white wire (DATA1) to Digital Pin 3 (INT1). That's it!
*
* Operation is simple - each of the data lines are connected to hardware interrupt lines. When
* one drops low, an interrupt routine is called and some bits are flipped. After some time of
* of not receiving any bits, the Arduino will decode the data. I've only added the 26 bit and
* 35 bit formats, but you can easily add more.

*/
#include <SPI.h>
#include <SD.h>

File myFile;

#define MAX_BITS 100 // max number of bits
#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse.

unsigned char databits[MAX_BITS]; // stores all of the data bits
unsigned char bitCount; // number of bits currently captured
unsigned char flagDone; // goes low when data is currently being captured
unsigned int weigand_counter; // countdown until we assume there are no more bits

unsigned long facilityCode=0; // decoded facility code
unsigned long cardCode=0; // decoded card code


/////////////////////////Setup ////////////////////////////////////
void setup()
{
pinMode(13, OUTPUT); // LED
pinMode(2, INPUT); // DATA0 (INT0)
pinMode(3, INPUT); // DATA1 (INT1)

Serial.begin(9600);
Serial.println("RFID Readers");

// binds the ISR functions to the falling edge of INTO and INT1
attachInterrupt(0, ISR_INT0, FALLING);
attachInterrupt(1, ISR_INT1, FALLING);


weigand_counter = WEIGAND_WAIT_TIME;

Serial.print("Iniciando o SD card...");

if (!SD.begin(4)) {
Serial.println("Falha na inicializacao!");
return;
}
Serial.println("Inicializado.");
}
//////////////////////////Loop principal ////////////////////////////////
void loop()
{
le_id();
}

//////////////////////////////Mostra o ID e o código de checagem lidos///////////////
void printBits()
{
// I really hope you can figure out what this function does
Serial.print("FC = ");
Serial.print(facilityCode);
Serial.print(", CC = ");
Serial.println(cardCode);
}

///////////////////////////////Grava o ID lido no SD card///////////////////////
void grava_sd()
{


myFile = SD.open("data.csv", FILE_WRITE);
if (myFile) {

Serial.print("Writing to data.csv...");
myFile.println(cardCode);
// close the file:
myFile.close();
Serial.println("Gravado");
} else {
// if the file didn't open, print an error:
Serial.println("error opening data.csv");
}
}
///////////////Le todos os ids gravados no SD card /////////////////////////////
void le_sd(){
myFile = SD.open("data.csv");
if (myFile) {
Serial.println("data.csv:");

// read from the file until there's nothing else in it:
while (myFile.available()) {


Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening data.csv");
}
}

/////////////////////////Le ID do receptor ///////////////////////////////
void le_id(){

// This waits to make sure that there have been no more data pulses before processing data
if (!flagDone) {
if (--weigand_counter == 0)
flagDone = 1;
}

// if we have bits and we the weigand counter went out
if (bitCount > 0 && flagDone) {
unsigned char i;

Serial.print("Read ");
Serial.print(bitCount);
Serial.print(" bits. ");

// we will decode the bits differently depending on how many bits we have
// see www.pagemac.com/azure/data_formats.php for mor info

if (bitCount == 26)
{
// standard 26 bit format
// facility code = bits 2 to 9
for (i=1; i<9; i++)
{
facilityCode =1;
facilityCode |= databits[i];
}

// card code = bits 10 to 23
for (i=9; i<25; i++)
{
cardCode =1;
cardCode |= databits[i];
}

printBits();

}
else {
// you can add other formats if you want!
Serial.println("Unable to decode.");
}

// cleanup and get ready for the next card
bitCount = 0;
facilityCode = 0;
cardCode = 0;
for (i=0; i<MAX_BITS; i++)
{
databits[i] = 0;
}
}
}
///////////////////////////////Le a interrupção na porta 2//////////////////
// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0()
{
//Serial.print("0"); // uncomment this line to display raw binary
bitCount++;
flagDone = 0;
weigand_counter = WEIGAND_WAIT_TIME;

}
////////////////////////////Le a interrupção na porta 3/////////////////////
// interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1()
{
//Serial.print("1"); // uncomment this line to display raw binary
databits[bitCount] = 1;
bitCount++;
flagDone = 0;
weigand_counter = WEIGAND_WAIT_TIME;
}

Exibições: 961

Responder esta

Respostas a este tópico

Eu não tenho nada desses equipamentos, mas por curiosidade tentei entender esse seu codigo. Ele tem diversas falhas,  não vou me ater a sintaxe, por exemplo o |= (o que isso faz,  isso existe??).  Vou me focar na logica de funcionamento:

 vi que vc separou as funções le_sd, grava_sd  mas em nenhum momento vc  as invoca. A logica deveria ser ler tag, ler sd, buscar se a tag lida coincide com algum código armazenado no sd, e por fim decidir o que fazer. Se essa não for a sequência dos procedimentos, deveria haver pelo menos algo parecido com isso,  mas não consegui enxergar nem um resquício dessa lógica, so vi funções,  sem muita conexão entre elas. 

Em qual local no código vc construiu a confrontação entre o codigo lido na tag e o código armazenado no sd? 

Opa, Imhug. Tudo bem?

Obrigado por responder, |= existe sim, já ouviu falar de operadores bit a bit?? O programa do jeito que ta realmente não ta fazendo nenhuma lógica, montei as funções e quando necessário irei chama-las no loop, facilita para puxar as funções conforme for preciso, sendo que irei usar elas mais de uma vez.

Estou tentando manipular os dados de leitura dentro do le_sd porém há uma diferença de classes do myFile.read com os dados obtidos pelo cardCode e isso que batendo cabeça.

Eu realmente nunca tinha me deparado com esse |= obrigado pelo esclarecimento. 

Tente ser detalhado no seu problema. Do que se trata essa diferença de classes que vc esta se referindo ? 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço