Buenas!!
Estoy realizando un proyecto personal con un arduino uno y un shell pn532 breakout de adafruit, logre hacer que lea los id de las tarjetas nfc pero estoy teniendo un problema para el siguiente paso que quiero dar, mas abajo pondré el código pero básicamente la función lectura lee la tarjeta nfc, la he añadido al loop y me lee constantemente el id de la tarjeta luego he querido que si yo adiciono una letra a o b el arduino apague o prenda el led
lo que no consigo es que una vez que termine la función el programa espera que introduzca la letra y luego ejecute el código... tal como esta el codigo debo ingresar primero la letra lee el código y luego ejecuta lo que sigue... también en ambos casos independientemente de que introduzca o no algo continua leyendo la tarjeta...
en conclusión, sin liarme mas lo que me gustaría hacer es que lea tarjeta, me pregunte si la tarjeta tiene saldo, introducir a o b y que el led se apague o prenda y que el ciclo vuelva al inicio.. para mas adelante hacerlo con un led rgb y un parlante...
me encantaría que me ayuden muchas gracias de antemano!!!
casi olvido el codigo!!!
#include <SPI.h> //Libreria para el uso de SPI
#include <Wire.h> //Libreria para el uso de I2C
#include <Adafruit_PN532.h> //Libreria para el uso del shield
//Parámetros por default
#define PN532_IRQ (2)
#define PN532_RESET (3)
int option;
int led = 13;
Adafruit_PN532 nfc(2, PN532_RESET); //Instancia de la libreria del PN532
void setup() {
//Se inicia comunicacion serial
Serial.begin(115200);
//Se inicia el objeto NFC
nfc.begin();
//Se verifica si el shield esta conectado
if (! nfc.getFirmwareVersion()) {
Serial.print("No se ha encontrado un PN53X conectado al Arduino");
}
nfc.setPassiveActivationRetries(0xFF);
nfc.SAMConfig();
pinMode(led, OUTPUT);
}
void loop() {
lectura();
while (Serial.available()>0){
Serial.println("Tiene Saldo Suficiente?");
option=Serial.read();
if(option=='a') {
digitalWrite(led, LOW);
Serial.println("OFF");
}
if(option=='b') {
digitalWrite(led, HIGH);
Serial.println("ON");
}
}
}
void lectura(){
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
//Se hace la lectura del tag
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
//Si se consigue una lectura, se hace la impresion primero colectando los caracteres en un buffer
if (success) {
String code = "";
for (int i = 0; i < uidLength; i++)
{
//Se concatenan los bytes dentro de un buffer
code += String(uid[i], HEX);
}
//Los caracteres se pasan a letras mayúsculas
code.toUpperCase();
//Se imprime el código
Serial.println(code);
//Pausa de un segundo
delay(1000);
}
else
{
Serial.println("No se ha podido leer la tarjeta");
}
}
Te envié privado, por favor edita tu post y lee las normas.
Prueba con esta versión, (asi debes postear un código, usando </>)
#include <SPI.h> //Libreria para el uso de SPI
#include <Wire.h> //Libreria para el uso de I2C
#include <Adafruit_PN532.h> //Libreria para el uso del shield
//Parámetros por default
#define PN532_IRQ (2)
#define PN532_RESET (3)
int option;
int led = 13;
bool esperoTeclado = false;
Adafruit_PN532 nfc(2, PN532_RESET); //Instancia de la libreria del PN532
void setup() {
//Se inicia comunicacion serial
Serial.begin(115200);
//Se inicia el objeto NFC
nfc.begin();
//Se verifica si el shield esta conectado
if (! nfc.getFirmwareVersion()) {
Serial.print("No se ha encontrado un PN53X conectado al Arduino");
}
nfc.setPassiveActivationRetries(0xFF);
nfc.SAMConfig();
pinMode(led, OUTPUT);
}
void loop() {
if (lectura())
esperoTeclado = true;
while (Serial.available()>0 && esperoTeclado){
Serial.println("Tiene Saldo Suficiente?");
option = Serial.read();
if (option == 'a') {
digitalWrite(led, LOW);
Serial.println("OFF");
esperoTeclado = false;
}
if (option == 'b') {
digitalWrite(led, HIGH);
Serial.println("ON");
esperoTeclado = false;
}
}
}
bool lectura(){
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
//Se hace la lectura del tag
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
//Si se consigue una lectura, se hace la impresion primero colectando los caracteres en un buffer
if (success) {
String code = "";
for (int i = 0; i < uidLength; i++) {
//Se concatenan los bytes dentro de un buffer
code += String(uid, HEX);
}
//Los caracteres se pasan a letras mayúsculas
code.toUpperCase();
//Se imprime el código
Serial.println(code);
//Pausa de un segundo
delay(1000);
}
else {
Serial.println("No se ha podido leer la tarjeta");
}
return success;
}
Gracias surbyte lo he modificado tal como me pediste...
voy a probar lo que me pasaste...
muchas gracias!!
Vuelvo con novedades después de hacer varias pruebas no he logrado mi cometido inclusive usando el código que surbyte me dio, el resultado es el mismo debo introducir y después de leer de nuevo la tarjeta responde
A27A45F2
A27A45F2
A27A45F2
A27A45F2
A27A45F2
Tiene Saldo Suficiente?
OFF
Algo así...
la idea era lo que esta en las ultimas lineas
A27A45F2 <--- id de la tarjeta
Tiene Saldo Suficiente? <--- pregunta no tan obligatoria
OFF <----para saber que el led se apago
sigo probando como hacerlo y leo sugerencias muchas gracias!!!
Yo pense que querias que esperara a que presionaras a o b.
Que es lo que quieres que haga entonces?
Que la lea una sola vez?
y que se quede esperando, esa supuse que era la idea.. no entiendo porque sigue mostrando a ver..
Modifacala asi
void loop() {
if (lectura() && !esperoTeclado)
esperoTeclado = true;
while (Serial.available()>0 && esperoTeclado){
Serial.println("Tiene Saldo Suficiente?");
option = Serial.read();
if (option == 'a') {
digitalWrite(led, LOW);
Serial.println("OFF");
esperoTeclado = false;
}
if (option == 'b') {
digitalWrite(led, HIGH);
Serial.println("ON");
esperoTeclado = false;
}
}
}
bool lectura(){
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
//Se hace la lectura del tag
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
//Si se consigue una lectura, se hace la impresion primero colectando los caracteres en un buffer
if (success) {
String code = "";
for (int i = 0; i < uidLength; i++) {
//Se concatenan los bytes dentro de un buffer
code += String(uid, HEX);
}
//Los caracteres se pasan a letras mayúsculas
code.toUpperCase();
//Se imprime el código
Serial.println(code);
//Pausa de un segundo
delay(1000);
}
else {
Serial.println("No se ha podido leer la tarjeta");
}
return success;
}
Perdona si no me di a entender bien... es mi culpa...
si quiero que la lea una vez y haga la pregunta y que yo tenga que pulsar a o b y luego apague o prenda el led dependiendo de lo que haya pulsado
Veo que esta linea
//Se imprime el código
Serial.println(code);
es la que complica todo asi que modifiquemos su uso.
void loop() {
lectura();
while (Serial.available()>0 && esperoTeclado){
Serial.println("Tiene Saldo Suficiente?");
option = Serial.read();
if (option == 'a') {
digitalWrite(led, LOW);
Serial.println("OFF");
esperoTeclado = false;
}
if (option == 'b') {
digitalWrite(led, HIGH);
Serial.println("ON");
esperoTeclado = false;
}
}
}
void lectura(){
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
//Se hace la lectura del tag
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
//Si se consigue una lectura, se hace la impresion primero colectando los caracteres en un buffer
if (success) {
String code = "";
for (int i = 0; i < uidLength; i++) {
//Se concatenan los bytes dentro de un buffer
code += String(uid, HEX);
}
//Los caracteres se pasan a letras mayúsculas
code.toUpperCase();
//Se imprime el código
if (!esperoTeclado) {
Serial.println(code);
//Pausa de un segundo
esperoTeclado = true;
}
delay(1000);
}
else {
Serial.println("No se ha podido leer la tarjeta");
}
}
Surbyte, te agradezco enteramente... debo destacar que lo encontré en otro foro pero en ingles
Y de hecho la solución es muy sencilla
todo se remonta a es este función setPassiveActivationRetries que establece un tiempo x de espera después que el dispositivo haya leído la tarjeta, el hecho es que yo la tenia con el valor 0xff y eso hacia que si o si debía terminar de leer la tarjeta para habilitar otro comando como es la escritura en puerto serial por ello no podía continuar con los demás comandos que había en el programa, bueno lo cambie a 0xdc y funciona de maravilla con el ultimo codigo que me paso Surbyte...
Muy agradecido, ahora podre extender mas el proyecto...
Que significa que le pongas 0xdc en vez de 0xFF?? en donde encontraste esa info? podrías pasarnos el link. Salu2