LusoRobótica - Robótica em Português

Robótica => Discussão geral sobre robótica => Tópico iniciado por: Carlcox89 em 24 de Dezembro de 2010, 12:44

Título: Arduino + RFID
Enviado por: Carlcox89 em 24 de Dezembro de 2010, 12:44
Boas, estou a tentar-me iniciar nisto, mas surgiu um problema.
Estou a usar a NewSoftSerial, e o leitor RFID está a funcionar bem, no entanto o que eu queria era que após ele ler uma tag (que esteja enfrente a ele) ele a ignore... ou seja se o utilizador puser uma tag durante 2 segundos enfrente ao leitor, ele apenas lê a tag a primeira vez e faz uma determinada coisa e ignora se ele continuar lá com a tag enfrente ao leitor por mais de 2 segundos.
Neste momento apenas tenho a fazer print do codigo da tag, e não estou a conseguir localizar o sitio para por o Delay(2000);
Citar
if (RFID.available() > 0)
  {
    if (bytesread > 10)
    {
      Serial.println("Weird: buffer overflow");
      bytesread = 0;
    }
    char c = RFID.read();
    if (c == '\r' || c == '\n')
    {
      code[bytesread] = 0;
      if (c == '\r')
      {
      bytesread = 0;
      Serial.print("TAG: ");
      Serial.print(code);
      Serial.println("");
      }
    }
    else
    {
      code[bytesread++] = c;
    }
  }

cumps
Título: Re: Arduino + RFID
Enviado por: senso em 24 de Dezembro de 2010, 13:57
Se calhar era melhor meteres o código todo, mas supostamemte metes o delay ou no inicio ou no fim do loop e deve dar.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 28 de Dezembro de 2010, 17:10
Citar

#include <NewSoftSerial.h>
#include <LCD4Bit.h>

int  val = 0;
char code[11];
int bytesread = 0;
char tag1[11] = "0F01C68668"; // this is size 11 because it is a NULL terminating string
char tag2[11] = "0F0302867B";
int switchPin = 11;      //  digital input pin for a switch
int switchState = 0;    // the state of the switch
int rxPin = 9; // RFID reader SOUT pin connected to Serial RX pin at 2400bps to pin8
int enablePin = 10;
int ledpin = 13;
int RED = 4;
int GREEN = 2;
int BLUE = 3;
int doorPin = 12;
LCD4Bit lcd = LCD4Bit(2);
NewSoftSerial RFID(rxPin, -1);

void setup()
{
  Serial.begin(9600);
  Serial.println("OLA");
  pinMode(ledpin, OUTPUT);
  pinMode(switchPin, INPUT);       // set the switch pin to be an input
  pinMode(doorPin, OUTPUT);
  digitalWrite(doorPin, LOW); // lock door
  RFID.begin(2400);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(enablePin,OUTPUT);       // Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin
  digitalWrite(enablePin, LOW);    // Activate the RFID reader
//  inicialize();
  lcd.init();
  lcd.commandWrite(0x0F);
  lcd.printIn("BEM-VINDO!");
 // delay(3000);
  lcd.clear();
  lcdMessage();

}


void loop()
{
  switchState = digitalRead(switchPin);
   if (switchState == 1) { // if the switch is closed:
     digitalWrite(doorPin, HIGH);
     digitalWrite(ledpin, HIGH);
     delay(9000);
     digitalWrite(ledpin, LOW);
     digitalWrite(doorPin, LOW);
   }
   else { // if the switch is open:
     digitalWrite(doorPin, LOW);
     digitalWrite(ledpin, LOW);
   }

 if (RFID.available() > 0)
  {
    if (bytesread > 10)
    {
      Serial.println("Weird: buffer overflow");
      bytesread = 0;
    }
    char c = RFID.read();
    if (c == '\r' || c == '\n')
    {
      code[bytesread] = 0;
      if (c == '\r')
      {
      bytesread = 0;
      Serial.print("TAG: ");
      Serial.print(code);
      Serial.println("");
      }
    }
    else
    {
      code[bytesread++] = c;
    }
  }

   
}

void lcdMessage(){
  lcd.printIn("   Apresente   ");
  lcd.cursorTo(2, 0);
  lcd.printIn("      ID!      ");
}

boolean findGoodTag(){
  if (checkTag(tag1)){ return true;}
  else if (checkTag(tag2)){ return true;}
  else{
    //serial.print("Bad tag: ");
    //serial.println(code);
    return false;
  }

}

boolean checkTag(char *tag){

  for (int x=0;x<10;x++){
    if( tag
  • != code
  • ){

      return false;
    }
  }
  return true;
}

// Flashes Red LED if failed login
void failed()
{
  digitalWrite(doorPin, LOW);
  digitalWrite(GREEN, LOW);   // Make sure green LED is off
  digitalWrite(BLUE, LOW);  // Make sure blue LED is off
  // Blink red fail LED 3 times to indicate failed key
  for(int i=0; i<5; i++) {
    digitalWrite(RED, HIGH);  // Turn on red LED
    delay(500);
    digitalWrite(RED, LOW);   // Turn off red LED
    delay(500);
  }
}

void sucess()
{     
      digitalWrite(doorPin, HIGH);
      digitalWrite(RED, LOW);
      digitalWrite(BLUE, LOW);
      digitalWrite(GREEN, HIGH);
      delay(9000);
      digitalWrite(GREEN, LOW);
      digitalWrite(doorPin, LOW);
}

void inicialize() {
  for(int i=0; i<8; i++)
  {
  digitalWrite(BLUE, HIGH);
  delay(100);
  digitalWrite(BLUE, LOW);
  delay(150);
  }
  digitalWrite(BLUE, HIGH);
}


Está aí o código todo, está a funcionar "bem", só preciso mesmo de por um delay para que se uma tag estiver a' frente do leitor ele leia e depois ignore, ou seja não ler mais que uma vez durante x segundos. E já experimentei por delay(3000) em vários sitios e ele le a 1ª vez e volta a dar o output para a serial passados 3 segundos...e isto praí 3 ou 4 vezes.
Título: Re: Arduino + RFID
Enviado por: metRo_ em 28 de Dezembro de 2010, 17:15
Não olhei para o teu código, mas o que tu queres é tipo, passas a tag, reconheces a tag, e nos proximos 2 segundos se essa pessoa voltar a passar a tag nao queres que seja reconhecida, ou mesmo que a pessoa coloque a tag la durante 2 segundos que so seja reconhecida uma vez, certo?!
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 28 de Dezembro de 2010, 19:00
Não olhei para o teu código, mas o que tu queres é tipo, passas a tag, reconheces a tag, e nos proximos 2 segundos se essa pessoa voltar a passar a tag nao queres que seja reconhecida, ou mesmo que a pessoa coloque a tag la durante 2 segundos que so seja reconhecida uma vez, certo?!

Certíssimo metro_ !
Eu tenho isso a funcionar com o SoftwareSerial, mas ao adaptar para o NewSoftSerial já nao consegui introduzir esse delay (em qq lado que o ponha o que acontece é q o utilizador deixa o cartão enfrente ao RFID reader durante tipo 2 segundos e aquilo faz output pra Serial do code da tag 3 ou 4 vezes :S )

o unico problema com o codigo que tinha para o SoftwareSerial é que queria usar também um butão e ler o seu estado (isto para abrir a porta do lado de dentro) e pelos vistos a parte de ler o estado do butao nao funciona com o SoftwareSerial, já com o Newsoftserial funciona bem, exatamente o mesmo codigo de ler o butão.
Então mudei tudo para NewSoftSerial, no entanto agora o unico problema é mesmo por esse delay para que a tag nao esteja semrpe a ser lida (ou seja haja um intervalo de espera).
Código antigo:
Citar
void loop()
{
   switchState = digitalRead(switchPin);
   if (switchState==1) { // if the switch is closed:
     digitalWrite(doorPin, HIGH);
     digitalWrite(ledpin, HIGH);
     delay(9000);
     digitalWrite(ledpin, LOW);
     digitalWrite(doorPin, LOW);
   }

if((val = RFID.read()) == 10)
  {   // check for header
    bytesread = 0;
    while(bytesread<10)
    {  // read 10 digit code
      val = RFID.read();
      if((val == 10)||(val == 13))
      {  // if header or stop bytes before the 10 digit reading
        break;                       // stop reading
      }
      code[bytesread] = val;         // add the digit           
      bytesread++;                   // ready to read next digit 
    }
    if (bytesread == 10){
        if (findGoodTag()) {
          Serial.println("VALIDO");
          lcd.clear();
          lcd.printIn("       ID       ");
          lcd.cursorTo(2, 0);
          lcd.printIn("     VALIDA!     ");
          sucess();
          lcd.clear();
          lcdMessage();
        } else {
          Serial.println("INVALIDO");
          lcd.clear();
          lcd.printIn("       ID       ");
          lcd.cursorTo(2, 0);
          lcd.printIn("    INVALIDA!    ");
          failed();
          lcd.clear();
          lcdMessage();
        }
    }

    bytesread = 0;
    digitalWrite(GREEN, LOW);
    digitalWrite(RED, LOW);
    digitalWrite(BLUE, HIGH);
    delay(5500); 
  }

}
Título: Re: Arduino + RFID
Enviado por: metRo_ em 30 de Dezembro de 2010, 21:06
Dizes que o delay a seguir ao digitalWrite dos leds não funciona!?
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 31 de Dezembro de 2010, 01:19
Dizes que o delay a seguir ao digitalWrite dos leds não funciona!?

o código que citei por ultimo usa SoftwareSerial e funciona bem excepto a parte de ler o butão (digitalRead(switchPin)) isso nunca chega a funcionar.
Se conseguisse por isso a funcionar, excusava de usar a NewSoftSerial...
também nao me acredito que seja o único que nao consigo por o SoftwareSerial a funcionar com o RFID e mais um digitalRead a ler um switch (ON/OFF) :|
Título: Re: Arduino + RFID
Enviado por: senso em 31 de Dezembro de 2010, 01:40
Mas supostamemte o NewSoftwareSerial é melhor que o antigo Software Serial, dai o New no nome..
Isso são problemas meio estranhos, mas é provavel que tenha algo a ver com o facto de o delay e o NewSoftSerial dependerem ambos de interrupções de timers.
Título: Re: Arduino + RFID
Enviado por: metRo_ em 31 de Dezembro de 2010, 02:47
Mas supostamemte o NewSoftwareSerial é melhor que o antigo Software Serial, dai o New no nome..
Isso são problemas meio estranhos, mas é provavel que tenha algo a ver com o facto de o delay e o NewSoftSerial dependerem ambos de interrupções de timers.

Mas o delay usa timers?! É provavel mas normalmente este delay é feito com for's e nop!
Título: Re: Arduino + RFID
Enviado por: senso em 31 de Dezembro de 2010, 02:53
Directamente não, mas o millis do arduino é criado usando o overflow de um timer, e a função de delay do arduino usa a millis, logo indirectamenta o delay depende de interrupções para funcionar, mas as bibliotecas bit-banged serial tambem dependem de outras interrupções ou do milis, não sei porque nunca vi o source para funcionarem sincronizadas e para conseguirem manter o baud-rate, o resultado disso é uma molhada de interrupts a disparar por todo o lado, o Arduino é basicamente uma confusão de código cada vez mais desorganizada..
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 31 de Dezembro de 2010, 12:40
Resumindo para eu que estou a iniciar.
Há outra maneira de fazer isto com ambas as partes a funcionar ? Não me importa se é NewSoftSerial ou a antiga SoftwareSerial.
Obrigado
Título: Re: Arduino + RFID
Enviado por: metRo_ em 31 de Dezembro de 2010, 14:43
Resumindo para eu que estou a iniciar.
Há outra maneira de fazer isto com ambas as partes a funcionar ? Não me importa se é NewSoftSerial ou a antiga SoftwareSerial.
Obrigado

Tenta saber que timers essas bibliotecas usam! Cria um post no arduino.cc ou perguntam directamente a quem fez a newsoftserial, normalmente esse pessoal responde rápido :) Depois de se saber isso tenta-se arranjar um solução.

O ideal no entanto era fazeres uma maquina de estados do que queres fazer para que nos consigamos perceber também o que realmente queres fazer. Faz num papel e digitalizas ou utilizando algum software.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Ft2.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSMEgA6EXU17bqzaAJb2niQvdtqhN_-EzNk-4-e6yt7Hrd9kVyHgQ&hash=e49466004730e39d184e3b8c5cd332fc599f124f)
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 07 de Janeiro de 2011, 20:51
Citar

Tenta saber que timers essas bibliotecas usam! Cria um post no arduino.cc ou perguntam directamente a quem fez a newsoftserial, normalmente esse pessoal responde rápido :) Depois de se saber isso tenta-se arranjar um solução.

O ideal no entanto era fazeres uma maquina de estados do que queres fazer para que nos consigamos perceber também o que realmente queres fazer. Faz num papel e digitalizas ou utilizando algum software.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Ft2.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSMEgA6EXU17bqzaAJb2niQvdtqhN_-EzNk-4-e6yt7Hrd9kVyHgQ&hash=e49466004730e39d184e3b8c5cd332fc599f124f)

O problema é que já pus um topico lá e também ninguem me conseguiu ajudar por completo.
No entanto o que pretendo acho que é "simples" pelo menos na minha maneira de pensar.
Estado inicial: PORTA FECHADA
Tendo duas maneiras de abrir a porta: RFID READER (lado fora) + Pushbutton switch (lado dentro)

Ao passar o cartão a porta abre durante 9 segundos, fecha-se após isso.
Ao carregar no butão a porta abre durante 9 segundos e fecha-se após isso.

O grande problema está em conjugar as duas coisas, o código com NewSoftSerial está a funcionar, só não consigo encontrar sítio para lhe por o delay de 3 ou 4 segundos para que caso alguem esteja com um cartão à frente do RFID reader durante tipo 2 segundos ele ignore, ou seja lê o cartão (é rapido a ler <1 segundo, ja testei) e abre a porta e ignora que o utilizador ainda lá esteja com o cartão. Claro que depois da porta fechar, volta ao inicio do loop, volta a ler cartão e abre a porta. O código basicamente está todo feito, tudo funciona, só nao sei mesmo onde pôr o delay.

Se alguem entendido na matéria olhar para o código que pus feito com o SoftwareSerial (esse está totalmente funcional com delay) e conseguir adaptar só o delay para o novo código... agradeço imenso. É que no arduino.cc ninguem me conseguiu ajudar :/ . E  só me falta mesmo isto para concluir o projecto
Título: Re: Arduino + RFID
Enviado por: kast em 07 de Janeiro de 2011, 22:43
Não percebi bem porque estás a utilizar essas bibliotecas.
Já fiz um projecto com rfid, tb precisava de um delay e não utilizava nenhuma dessas bibliotecas.
O unico problema é ter de desligar o módulo rfid quando quer fazer upload de algum sketch.

Assim de repente e sem ver o código que escreveste vejo 2 soluções:

1- Porque não ligar o botão a um pin analógico do arduino ... será que resolve ??? (provavelmente sim)
2- (provavelmente a solução menos elegante) Pões o arduino a contar que ele não se cansa :), se necessário utiliza mais que um for

Espero ter ajudado, se mesmo assim não conseguires diz que analiso o teu problema mais a fundo.
Título: Re: Arduino + RFID
Enviado por: senso em 07 de Janeiro de 2011, 23:05
Não estou é a perceber o problema de alguem ter o cartão á frente do leitor 2 segundos.
A contar não é bem assim, o gcc se vir um loop que não faz nada optimiza esse mesmo loop para fora do código.

Mas se realmente queres essa funcionalidade, faz isto:
Estuda um bocadinho do código do blinky sem delay.
E fazes algo assim:
Código: [Seleccione]
if((milis() - lastMilis) > 2000){
 ler_cartao();
 lastMilis=milis();
}
Título: Re: Arduino + RFID
Enviado por: kast em 07 de Janeiro de 2011, 23:09
Provavelmente tb funciona.
Título: Re: Arduino + RFID
Enviado por: senso em 07 de Janeiro de 2011, 23:11
Mete lá isso no código e ve se não funciona, se bem que não percebe mesmo qual é o problema de o cartão ser lido duas vezes, abre a porta por 9 segundos?
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 08 de Janeiro de 2011, 03:14
Mete lá isso no código e ve se não funciona, se bem que não percebe mesmo qual é o problema de o cartão ser lido duas vezes, abre a porta por 9 segundos?

ja experimentei ligar aos pins 0 e 1, e de vez em quando o butao deuxa de funcionar.
O problema é que eu tenho tambem um lc do lado de fora para mostrar que o cartao é valido/nao, e se o utilizador ficar com o cartao sempre a frente do rfid aquilo ta sempre a mandar a mensagem para o lcd.
Vou testar entao da maneira que disseram.
Obrigado e mal teste digo logo se funcionou ou nao.
Título: Re: Arduino + RFID
Enviado por: senso em 08 de Janeiro de 2011, 04:08
Estás a fazer o deboucing do botão certo?
Então, se tem um lcd, metes lá a dizer, cartão válido e depois remova cartão, simples..
Título: Re: Arduino + RFID
Enviado por: microbyte em 08 de Janeiro de 2011, 13:22
Não vi o código, mas tens isso com máquina de estados, ou não?
É que se tiveres, podes adicionar um estado intermédio antes do wait, em que lês uma vez do RFID o cartão e se lá estiver o mesmo cartão que abriu da última vez a porta, então não passas passa o estado Wait.

As alterações são basicamente guardares o "ID" do último cartão que abriu a porta e comparares com o que estiver nesse estado intermédio, caso esteja lá algum.

Se tens o código sequencial é mais while() que tens de acrescentar antes de voltares ao loop.
Título: Re: Arduino + RFID
Enviado por: delphi em 09 de Janeiro de 2011, 19:32
Será que isto ajuda http://blog.formatlos.de/2008/12/08/arduino-id-12/ (http://blog.formatlos.de/2008/12/08/arduino-id-12/) ?
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Janeiro de 2011, 00:37
Estás a fazer o deboucing do botão certo?
Então, se tem um lcd, metes lá a dizer, cartão válido e depois remova cartão, simples..
Já agora, como é que se faz o deboucing do botão ?
É que eu tenho ligado só assim: (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Farduino.cc%2Fen%2Fuploads%2FTutorial%2Fbutton.png&hash=ddb8f99df61a56e5622d116f7373ac776fda786f)
e por acaso agora que me lembro que uma vez abri a Serial e estive a ver os valores do switch e aquilo estava constantemente a mandar um valor. Pode ser daí um dos problemas.
Título: Re: Arduino + RFID
Enviado por: kast em 11 de Janeiro de 2011, 00:50
Mais uma vez eu digo: não era mais fácil ligar o botão a um pin analógico ???
Título: Re: Arduino + RFID
Enviado por: amando96 em 11 de Janeiro de 2011, 01:04
Porquê pino analógico? 

Podes fazer debounce por software, o IDE tem um exemplo, eu cheguei a usar só condensadores, mas foi-me dito que nem sempre se pode confiar.
Título: Re: Arduino + RFID
Enviado por: kast em 11 de Janeiro de 2011, 01:14
Sempre pensei que os botões se deviam ligar nos analógicos. Porque permitem que com resistências se liguem muito mais que um botão a apenas 1 pin. E provavelmente deixam de ser necessárias as libs de serial que ele anda a utilizar desnecessariamente (a meu ver).
Tudo isto porque tenho um leitor de rfid semelhante e foi assim que fiz :D
E porque normalmente é assim que costumo ver.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Janeiro de 2011, 01:23
Mais uma vez eu digo: não era mais fácil ligar o botão a um pin analógico ???
Ja experimentei ligar a um analogico e deu o mesmo resultado.
Eu neste momento estou em fase de exames, mas assim que acabar vou testar como disseram.

Mas podes arranjar o codigo e o esquema das ligações ?
Tens RFID e um butão a funcionar ao mesmo tempo?
thanks
Título: Re: Arduino + RFID
Enviado por: kast em 11 de Janeiro de 2011, 01:24
Ainda não percebi porque estás a utilizar as libs do serial ...
Eu não utilizo e funciona td mt bem.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Janeiro de 2011, 01:43
Ainda não percebi porque estás a utilizar as libs do serial ...
Eu não utilizo e funciona td mt bem.
Tens ligado o pin RX (arduino) ao RFID (Sout) ?
E o botão a um pin analógico certo ?
E depois no código nao usas NewSoftSerial nem SoftwareSerial, ligas apenas com o Serial.begin(2400);
Mas que leitor RFID tens ? Parallax ?
Podes-me mostrar então o código sketch ? sff
Título: Re: Arduino + RFID
Enviado por: senso em 11 de Janeiro de 2011, 01:44
O botão não tem nada a ver com serial..
Até existe uma biblioteca para fazer o debounce do botão por código.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Janeiro de 2011, 02:16
O botão não tem nada a ver com serial..
Até existe uma biblioteca para fazer o debounce do botão por código.
Pois acredito, mas a biblioteca está de algum modo a interferir na leitura do botão.
Título: Re: Arduino + RFID
Enviado por: senso em 11 de Janeiro de 2011, 02:17
O debounce é feito com delays, dai não funcionar bem, usa uma entrada analógica como já te disseram então.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Janeiro de 2011, 02:27
O debounce é feito com delays, dai não funcionar bem, usa uma entrada analógica como já te disseram então.
E ligo então usando também a Serial do arduino ? Em vez de usar libraries tipo a NewSoftSerial e Softwareserial
Título: Re: Arduino + RFID
Enviado por: kast em 12 de Janeiro de 2011, 09:55
Isso é o que te aconselho
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 05 de Fevereiro de 2011, 20:41
Pronto, já fiz umas alterações, tenho ligado por hardware serial... o que surge agora é que o butão é lido ao inicio... depois fica a espera q seja apresentada uma tag e dps é q volta a ler o butão.
Como é que faço para ele fazer as duas coisas "ao mesmo tempo" ?

Muito agradecido.

Código: [Seleccione]
#include <LCD4Bit.h>
/**
 * author Benjamin Eckel
 * date 10-17-2009
 *
 */
#define RFID_ENABLE 10   //to RFID ENABLE
#define CODE_LEN 10      //Max length of RFID tag
#define VALIDATE_TAG 1  //should we validate tag?
#define VALIDATE_LENGTH  200 //maximum reads b/w tag read and validate
#define ITERATION_LENGTH 2000 //time, in ms, given to the user to move hand away
#define START_BYTE 0x0A
#define STOP_BYTE 0x0D
char tag[CODE_LEN]; 
char validos[11] = "0F0302867B";
char validos2[11] = "0415D95D69";

int switchPin = 14;      //  digital input pin for a switch
int ledpin = 13;
int RED = 4;
int GREEN = 2;
int BLUE = 3;
int doorPin = 12;
LCD4Bit lcd = LCD4Bit(2);
int switchState = 0;    // the state of the switch

void setup() {
  Serial.begin(2400);
  pinMode(RFID_ENABLE,OUTPUT);   
  pinMode(ledpin, OUTPUT);
  pinMode(switchPin, INPUT);       // set the switch pin to be an input
  pinMode(doorPin, OUTPUT);
  digitalWrite(doorPin, LOW); // lock door
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  inicialize();
  lcd.init();
  lcd.commandWrite(0x0F);
  lcd.printIn("BEM-VINDO!");
  delay(3000);
  lcd.clear();
  lcdMessage();
}
 
void loop() {
  interrupts();
  lerSwitch();
  enableRFID();
  getRFIDTag();
  if(isCodeValid()) {
    disableRFID();
    sendCode();
    eValido();
    delay(ITERATION_LENGTH);
  } else {
    disableRFID();
    Serial.println("Got some noise"); 
  }
  Serial.flush();
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
  digitalWrite(BLUE, HIGH);
  clearCode();
}

void lcdMessage(){
  lcd.printIn("   Apresente   ");
  lcd.cursorTo(2, 0);
  lcd.printIn("      ID!      ");
}

void lerSwitch() {
  switchState = digitalRead(switchPin);
  Serial.println("switch:");
  Serial.println(switchState);
  if (switchState==1) { // if the switch is closed
    digitalWrite(doorPin, HIGH);
    digitalWrite(ledpin, HIGH);
    delay(9000);
    digitalWrite(ledpin, LOW);
    digitalWrite(doorPin, LOW);
  }
}

void eValido() {
  if (checkTag(validos) || checkTag(validos2)) {
    lcd.clear();
    lcd.printIn("       ID       ");
    lcd.cursorTo(2, 0);
    lcd.printIn("     VALIDA!     ");
    sucess();
    lcd.clear();
    lcdMessage();
  } else {
    lcd.clear();
    lcd.printIn("       ID       ");
    lcd.cursorTo(2, 0);
    lcd.printIn("    INVALIDA!    ");
    failed();
    lcd.clear();
    lcdMessage();
  }
}

boolean checkTag(char *validos){
  for (int x=0;x<10;x++){
    if( validos[x] != tag[x]){
      return false;
    }
  }
  return true;
}

void failed()
{
  digitalWrite(doorPin, LOW);
  digitalWrite(GREEN, LOW);   // Make sure green LED is off
  digitalWrite(BLUE, LOW);  // Make sure blue LED is off
  // Blink red fail LED 3 times to indicate failed key
  for(int i=0; i<5; i++) {
    digitalWrite(RED, HIGH);  // Turn on red LED
    delay(500);
    digitalWrite(RED, LOW);   // Turn off red LED
    delay(500);
  }
}

void sucess()
{     
  digitalWrite(doorPin, HIGH);
  digitalWrite(RED, LOW);
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  delay(9000);
  digitalWrite(GREEN, LOW);
  digitalWrite(doorPin, LOW);
}

void inicialize() {
  for(int i=0; i<8; i++)
  {
    digitalWrite(BLUE, HIGH);
    delay(100);
    digitalWrite(BLUE, LOW);
    delay(150);
  }
  digitalWrite(BLUE, HIGH);
}

/**
 * Clears out the memory space for the tag to 0s.
 */
void clearCode() {
  for(int i=0; i<CODE_LEN; i++) {
    tag[i] = 0;
  }
}
 
/**
 * Sends the tag to the computer.
 */
void sendCode() {
    Serial.print("TAG:"); 
    //Serial.println(tag);
    for(int i=0; i<CODE_LEN; i++) {
      Serial.print(tag[i]);
    }
}
 
/**************************************************************/
/********************   RFID Functions  ***********************/
/**************************************************************/
 
void enableRFID() {
   digitalWrite(RFID_ENABLE, LOW);   
}
 
void disableRFID() {
   digitalWrite(RFID_ENABLE, HIGH); 
}
 
/**
 * Blocking function, waits for and gets the RFID tag.
 */
void getRFIDTag() {
  byte next_byte;
  while(Serial.available() <= 0) {}
  if((next_byte = Serial.read()) == START_BYTE) {     
    byte bytesread = 0;
    while(bytesread < CODE_LEN) {
      if(Serial.available() > 0) { //wait for the next byte
          if((next_byte = Serial.read()) == STOP_BYTE) break;       
          tag[bytesread++] = next_byte;                   
      }
    }               
  }   
}
 
/**
 * Waits for the next incoming tag to see if it matches
 * the current tag.
 */
boolean isCodeValid() {
  byte next_byte;
  int count = 0;
  while (Serial.available() < 2) {  //there is already a STOP_BYTE in buffer
    delay(1); //probably not a very pure millisecond
    if(count++ > VALIDATE_LENGTH) return false;
  }
  Serial.read(); //throw away extra STOP_BYTE
  if ((next_byte = Serial.read()) == START_BYTE) { 
    byte bytes_read = 0;
    while (bytes_read < CODE_LEN) {
      if (Serial.available() > 0) { //wait for the next byte     
          if ((next_byte = Serial.read()) == STOP_BYTE) break;
          if (tag[bytes_read++] != next_byte) return false;                     
      }
    }               
  }
  return true;   
}
Título: Re: Arduino + RFID
Enviado por: kast em 06 de Fevereiro de 2011, 02:08
Pesquisa por interrupts
Título: Re: Arduino + RFID
Enviado por: senso em 06 de Fevereiro de 2011, 23:35
Usa o milis e mete um time-out, se não tem tag para ler depois de meio segundo ou um segundo volta a ler o botão..
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 08 de Fevereiro de 2011, 22:23
Usa o milis e mete um time-out, se não tem tag para ler depois de meio segundo ou um segundo volta a ler o botão..
Podes dar um exemplo em concreto?

Obrigado.
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Fevereiro de 2011, 20:56
Ninguem pode dar umas luzes ? :(
A função que está a 'bloquear' à espera de ler uma tag é esta:
Código: [Seleccione]
void getRFIDTag() {
  byte next_byte;
  while(Serial.available() <= 0) {}
  if((next_byte = Serial.read()) == START_BYTE) {     
    byte bytesread = 0;
    while(bytesread < CODE_LEN) {
      if(Serial.available() > 0) { //wait for the next byte
          if((next_byte = Serial.read()) == STOP_BYTE) break;       
          tag[bytesread++] = next_byte;                   
      }
    }               
  }   
}

o que é que lhe posso alterar para, se não ler uma tag, passado 1 segundo voltar a ler o switch button?
Título: Re: Arduino + RFID
Enviado por: microbyte em 11 de Fevereiro de 2011, 21:16
A linha de código:
Código: [Seleccione]
while(Serial.available() <= 0) {}está a bloquear a execução enquanto não tens nada para ler.

Usa a função millis() para controlares o tempo que passa...
Título: Re: Arduino + RFID
Enviado por: senso em 11 de Fevereiro de 2011, 21:18
FIzeste mesmo o código ou é copy-paste?
Título: Re: Arduino + RFID
Enviado por: Carlcox89 em 11 de Fevereiro de 2011, 21:32
Ok, obrigado a todos, pproblema resolvido.
Usei esse mesmo pedaço de código para enquanto nao houver nada na serial, ele ler o switch, está a funcionar as mil maravilhas.
Quanto ao código, são partes adaptadas ao que necessito.