RFID & Bluetooth

É possível utilizar essas duas tecnologias juntas em um arduino UNO??

Tenho um Bluetooth Mate e um RFID Starter Kit e preciso utiliza-las ao mesmo tempo em um projeto. Me disseram que sim, tentei montar um circuito e ficou assim:

A mesma pessoa que disse que funcionaria, disse que este circuito está correto. Mas na hora de fazer o código eu fiquei meio confuso e tive alguns problemas. Fiz um código, me apresentaram alguns erros e os corrigi, mas os erros continuam, pois os códigos RFID aparecem como bluetooth e os que envio via bluetooth não aparecem (Diferencio eles exibindo R: ou B:). Código:

#include <SoftwareSerial.h>
SoftwareSerial rfid(2, 3);
char r; // RFID
char b; // bluetooth
char cr[12]; // Concatenação do RFID
char cb[13]; // Concatenação do bluetooth
int i = 0; // contagem para RFID
int j = 0; // contagem para bluetooth
void setup()
{ 
Serial.begin(115200);
Serial.print("$");
Serial.print("$");
Serial.print("$");
delay(100);
Serial.println("U,9600,N");
Serial.begin(9600);
rfid.begin(9600);
}
void loop()
{ 
if(rfid.available()){
r = rfid.read();
for(i = 0; i <= 12; i++)
{
if ((r >= 48) && (r <= 57) || (r >= 65) && (r <= 90) || (r >= 97) && (r <= 122))
cr[i] = r;
}
rfid.print("R:");
rfid.println(cr);
}

if(Serial.available()){
b = Serial.read();
for(j = 0; j <= 12; j++)
{
if ((b >= 48) && (b <= 57) || (b >= 65) && (b <= 90) || (b >= 97) && (b <= 122))
cb[j] = b;
}
Serial.print("B:");
Serial.print(cb);
}
}

O que mais tem de errado nele?? Eu conseguir fazer os dois dispositivos funcionarem separadamente com certa facilidade, mas ao tentar junta-los não deu certo. Eu não entendo muito sobre o arduino, e com oque sei diria que o erro está na identificação do que é do bluetooth e do que é do RFID, mas não sei como arrumar.

Alguém saberia como me ajudar??

Importas-te de explicar melhor o que queres dizer por erros? Que erros é que corrigiste no código?

bubulindo:
Importas-te de explicar melhor o que queres dizer por erros? Que erros é que corrigiste no código?

Os erros que tinha era que eu criava 2 softwareserial, um para o bluetooth e um para o RFID, mas me explicaram que só precisava de um para o RFID, pois o bluetooth usa o próprio Serial para receber os dados.

Atualmente os erros é que quando passo um RFID ele é tratado dentro de IF que está esperando um dado do bluetooth, e quando envio um dado do bluetooth ele nem chega a aparecer.

if(rfid.available()){
r = rfid.read();
for(i = 0; i <= 12; i++)
{
if ((r >= 48) && (r <= 57) || (r >= 65) && (r <= 90) || (r >= 97) && (r <= 122))
cr = r;
}
rfid.print("R:");
rfid.println(cr);
}[/quote]
Aqui verificas se tem algo para ler do rfid,se tiveres um byte para ler este ira para dentro do char r e depois corres um ciclo for 13 vezes para armazenar o MESMO valor em cr nas posições definidas por i.Quantos bytes estas a pensar receber pelo rfid?
Pensares que o rfid.available() vai receber um byte de cada vez e a seguir ler em r e armazenar na posiçao definida por i esta errado!
Isto porque com esse código apenas vais ler o primeiro byte e escreve-lo em todas as posiçoes de cr no for.
A comunicaçao serial e muito lenta em relaçao ao clock do cpu e assim a velocidade que a loop e corrida e muito mais rapida que os bytes a entrarem na serial.Conclusão tu detectas o primeiro byte no rfid.available() e o proximo byte so chega passado muitos ciclos do loop
O resultante disto é nao os estas a apanhar.
Segundo para que esse if dentro for?
Porque queres testar se r esta dentro desses valores?
O que fazes se não estiver compreendido entre eles?
> if ((r >= 48) && (r <= 57) || (r >= 65) && (r <= 90) || (r >= 97) && (r <= 122))
Isto esconde um potencial problema de precedência de operadores.Se de facto quiseres usar este if deves assegurar com parentises a ordem das operações.O operador && tem mais precedência que o operador ||.Isto quer dizer que as operaçoes com && irao ser tratadas primeiro e depois as operações de ||.
Vê esta tabela de precedências dos operadores C
C Language Operator Precedence Chart
> rfid.println(cr);
Também aqui para poderes imprimir cr na serial tens de terminar primeiro o vector com o caracter '\0' para poder ser tratado como um string.
Uma forma de conseguires ler seria algo assim:
* *while(rfidReader.available() <=12){};//Fica aqui ate receber 12 bytes -ajusta mediante o numero de bytes que o teu cartao tem /*Ja temos os 12 bytes no buffer, entao vamos le-los um a um para dentro de cada posiçao e no final termiar o array com o caracter nulo*/  for(uint8_t i = 0; i<= 11;i++)//Isto corre 12 vezes, o 0 tambem conta  {    cr[i] = rfidReader.read();//Le e armazena em cr na posiçao de i  } cardNumber[11] = '\0';//Aqui terminamos o vetor e fica convertido num string.E Serial.print("O meu cartao tem numero :"); Serial.print(cr);* *
Este codigo baseia-se na certeza que vai receber 12 bytes sempre.Se isto nao for verdade o codigo ira ficar parado aqui o que pode ser potencialmente perigoso
while(rfidReader.available() <=12){}
É possível fazer isto melhor sem que o código pare aqui mas isso será a tua investigação :grin:
Parte da tua resposta a isto encontra-se aqui:
Gammon Forum : Electronics : Microprocessors : How to process incoming serial data without blocking