Lector nfc y entrada de consola

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