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
-
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);
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
-
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.
-
#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
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.
-
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?!
-
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:
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);
}
}
-
Dizes que o delay a seguir ao digitalWrite dos leds não funciona!?
-
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) :|
-
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 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!
-
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..
-
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
-
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)
-
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
-
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.
-
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:
if((milis() - lastMilis) > 2000){
ler_cartao();
lastMilis=milis();
}
-
Provavelmente tb funciona.
-
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?
-
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.
-
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..
-
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.
-
Será que isto ajuda http://blog.formatlos.de/2008/12/08/arduino-id-12/ (http://blog.formatlos.de/2008/12/08/arduino-id-12/) ?
-
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.
-
Mais uma vez eu digo: não era mais fácil ligar o botão a um pin analógico ???
-
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.
-
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.
-
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
-
Ainda não percebi porque estás a utilizar as libs do serial ...
Eu não utilizo e funciona td mt bem.
-
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
-
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.
-
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.
-
O debounce é feito com delays, dai não funcionar bem, usa uma entrada analógica como já te disseram então.
-
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
-
Isso é o que te aconselho
-
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.
#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;
}
-
Pesquisa por interrupts
-
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..
-
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.
-
Ninguem pode dar umas luzes ? :(
A função que está a 'bloquear' à espera de ler uma tag é esta:
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?
-
A linha de código:
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...
-
FIzeste mesmo o código ou é copy-paste?
-
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.