Pagina 1 di 3

Lettore tag rfid rc522

MessaggioInviato: 10 apr 2023, 1:32
da teletommy
Salve a tutti. Sono a chiedere il vostro aiuto dopo numerosissimi tentativi andati a vuoto dal momento che la mia conoscenza di programmazione arriva fino ad un certo punto. Ho acquistato un lettore tag rfid rc522 che mi è arrivato assieme a due tag. Girovagando in rete ho trovato un programma di controllo accessi che ho installato e caricato nella mia scheda arduino, che funziona regolarmente e che allego a seguire:
Codice: Seleziona tutto
#include <MFRC522.h>
#define GREEN_LED_PIN 3
#define RED_LED_PIN 2
MFRC522 rfid(10, 9);
String users[] = {"232f1892","d34a22ac"};
int usersSize = sizeof(users)/sizeof(String);
void setup(){
  SPI.begin();
  rfid.PCD_Init();
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(RED_LED_PIN, OUTPUT);
}
void loop(){
  if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
    String uid = getUID();   
    if(checkUID(uid)){
      blinkLed(GREEN_LED_PIN, 2000, 1);
    }else{
      blinkLed(RED_LED_PIN, 400, 2);
    }
  }
  delay(10);
}
String getUID(){
  String uid = "";
  for(int i = 0; i < rfid.uid.size; i++){
    uid += rfid.uid.uidByte[i] < 0x10 ? "0" : "";
    uid += String(rfid.uid.uidByte[i], HEX);
  }
  rfid.PICC_HaltA();
  return uid;
}
bool checkUID(String uid){
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return true;
    }
  }
  return false;
}
void blinkLed(int led, int duration, int repeat){
  for(int i = 0; i < repeat; i++){
    digitalWrite(led, HIGH);
    delay(1000/2);
    digitalWrite(led, LOW);
    delay(1000/2);
  }
}

Il programma in questione controlla gli id dei due tag nella stringa:String users[] = (letti con un altro software solo per la lettura del codice) e fa accendere un led verde se il tag è riconosciuto nella stringa e un rosso se non lo è.
Il mio problema è quello di riuscire a far accendere un secondo led verde passando il secondo tag corretto.
Cerco di spiegarmi meglio: nella stringa di riconoscimento non vorrei mettere i tag tutti assieme ma ognuno in una stringa che mi fa accendere un led separato relativamente ad ogni tag letto correttamente. Ovviamente il led rosso dovrebbe rimanere sempre solo uno per l'allarme di tag non riconosciuto come è già adesso.
Credo che dovremmo avere un uid per ogni tag letto; ho provato in tutti i modi ma senza risultato. Se qualcuno riuscisse a darmi una base di lavoro potrei provare ad arrivarci da solo. Grazie infinite a chi vorrà darmi un aiuto.

Re: Lettore tag rfid rc522

MessaggioInviato: 10 apr 2023, 8:08
da GioArca67
Alle righe
Codice: Seleziona tutto
if(checkUID(uid)){
      blinkLed(GREEN_LED_PIN, 2000, 1);

potresti mettere
Codice: Seleziona tutto
numPin=checkUID(uid);
if(numPin>=0)
    blinkLed(greenLedPins[numPin], 2000, 1);

Ovviamente devi dichiarare le variabili nuove usate (numPin, che può essere un int, e l'array greenLedPins[]).

Nella checkUID() fai tornare l'indice i invece del true, così sai quale Tag aveva trovato.
Mentre al posto di false che devi mettere?
Visto che non ritorniamo più un booleano devi cambiare anche un'altra cosa: cosa?

Prova da solo, poi metti il codice e lo conrolliamo.

Re: Lettore tag rfid rc522

MessaggioInviato: 10 apr 2023, 8:34
da teletommy
Grazie infinite. Cerco di capire meglio la tua risposta (come ho scritto non sono ad un livello molto alto) e provo a mettere giù qualcosa di sensato. Grazie ancora

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 0:39
da teletommy
Allora come ti ho detto le mie conoscenze di arduino non arrivano a livelli alti pertanto ho cercato di analizzare il programma e di provare una soluzione "secondo me" dal momento che (mi dispiace) la tua risposta non riuscivo a capirla. Pensavo che questo potesse avvicinarsi alla soluzione ma il debug purtroppo mi sbarra la strada e non capisco cosa mi vuole suggerire. Ti metto il codice "mio" se pensi possa avvicinarsi. Ce la sto mettendo davvero tutta. Il sistema deve servire per i miei genitori entrambi non vedenti per comandare dei messaggi vocali (liveli che si alzano che io sto simulando con dei led) passando tag differenti relativi a degli oggetti di loro utilizzo quotidiano. Vorrei cercare di aiutarli con qualcosa del genere se riesco. Per loro e per me sarebbe davvero importante. Grazie infinite per il tempo che stai perdendo con me. questo il codice ipotizzzando 4 tag e 4 led:
Codice: Seleziona tutto
#include <MFRC522.h>
#define GREEN0_LED_PIN 3
#define GREEN1_LED_PIN 4
#define GREEN2_LED_PIN 5
#define GREEN3_LED_PIN 6
#define RED_LED_PIN 2
MFRC522 rfid(10, 9);
String users[] = {"232f1892","d34a22ac",“michele1”,“michele2”};
int usersSize = sizeof(users)/sizeof(String);
void setup(){
  SPI.begin();
  rfid.PCD_Init();
  pinMode(GREEN0_LED_PIN, OUTPUT);
  pinMode(GREEN1_LED_PIN, OUTPUT);
  pinMode(GREEN2_LED_PIN, OUTPUT);
  pinMode(GREEN3_LED_PIN, OUTPUT); 
  pinMode(RED_LED_PIN, OUTPUT);
}
void loop(){
  if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
    String uid = getUID();   
    if(checkUID(uid)){
   if(users[0] == (uid)){ blinkLed(GREEN0_LED_PIN, 2000, 1);}
   if(users[1] == (uid)){ blinkLed(GREEN1_LED_PIN, 2000, 1);}
   if(users[2] == (uid)){ blinkLed(GREEN2_LED_PIN, 2000, 1);}
   if(users[3] == (uid)){ blinkLed(GREEN3_LED_PIN, 2000, 1);}
    }else{
      blinkLed(RED_LED_PIN, 400, 2);
    }
  }
  delay(10);
}
String getUID(){
  String uid = "";
  for(int i = 0; i < rfid.uid.size; i++){
    uid += rfid.uid.uidByte[i] < 0x10 ? "0" : "";
    uid += String(rfid.uid.uidByte[i], HEX);
  }
  rfid.PICC_HaltA();
  return uid;
}
bool checkUID(String uid){
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return true;
    }
  }
  return false;
}
void blinkLed(int led, int duration, int repeat){
  for(int i = 0; i < repeat; i++){
    digitalWrite(led, HIGH);
    delay(1000/2);
    digitalWrite(led, LOW);
    delay(1000/2);
  }
}
grazie ancora!

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 8:50
da GioArca67
Che dice il debug??

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 10:00
da IlGuru
Il confronto fra stringhe in c non si fa con l'operatore ==
Così confronti gli indirizzi di memoria dei due operandi.

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 10:32
da teletommy
Ho provato a cambiare i simboli == con = come gentilmente consigliato da "ilGuru" il Nuovo codice è il seguente:
Codice: Seleziona tutto
#include <MFRC522.h>
#define GREEN0_LED_PIN 3
#define GREEN1_LED_PIN 4
#define GREEN2_LED_PIN 5
#define GREEN3_LED_PIN 6
#define RED_LED_PIN 2

MFRC522 rfid(10, 9);
String users[] = {"232f1892","d34a22ac", "Michele1", "Michele2"};
int usersSize = sizeof(users)/sizeof(String);

void setup(){
  SPI.begin();
  rfid.PCD_Init();
  pinMode(GREEN0_LED_PIN, OUTPUT);
  pinMode(GREEN1_LED_PIN, OUTPUT);
  pinMode(GREEN2_LED_PIN, OUTPUT);
  pinMode(GREEN3_LED_PIN, OUTPUT); 
  pinMode(RED_LED_PIN, OUTPUT);
}

void loop(){
  if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
    String uid = getUID();   
    if(checkUID(uid)){
   if(users[0] = uid){ blinkLed(GREEN0_LED_PIN, 2000, 1);};
   if(users[1] = uid){ blinkLed(GREEN1_LED_PIN, 2000, 1);};
  if(users[2] = uid){ blinkLed(GREEN2_LED_PIN, 2000, 1);};
   if(users[3] = uid){ blinkLed(GREEN3_LED_PIN, 2000, 1);};
    }else{
      blinkLed(RED_LED_PIN, 400, 2);
    }
  }
  delay(10);
}

String getUID(){
  String uid = "";
  for(int i = 0; i < rfid.uid.size; i++){
    uid += rfid.uid.uidByte[i] < 0x10 ? "0" : "";
    uid += String(rfid.uid.uidByte[i], HEX);
  }
  rfid.PICC_HaltA();
  return uid;
}

bool checkUID(String uid){
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return true;
    }
  }
  return false;
}
void blinkLed(int led, int duration, int repeat){
  for(int i = 0; i < repeat; i++){
    digitalWrite(led, HIGH);
    delay(1000/2);
    digitalWrite(led, LOW);
    delay(1000/2);
  }
}

Aggiungendo delle parentesi dove suggerito dal debug pare che adesso non dia più errori. Adesso provo a programmare e faccio sapere. Grazie infinite per l'aiuto

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 10:51
da EcoTan
teletommy ha scritto:cambiare i simboli == con = come gentilmente consigliato

Non mi pare che abbia detto questo. (Seguo un po' la discussione ma non conosco il problema né Arduino),

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 10:55
da teletommy
Grazie ecotan. Come detto all'inizio non sono un esperto di arduino. Vado un pochino (parecchio) "d'imbracciatura" ma sto cercando disperatamente di risolvere un problema a mio padre. Grazie a te

Re: Lettore tag rfid rc522

MessaggioInviato: 11 apr 2023, 13:43
da IlGuru
Guarda qui: stringhe-in-c
In particolare dove parla di strcmp