Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Lettore tag rfid rc522

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[11] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 11 apr 2023, 15:22

IlGuru ha scritto:Guarda qui: stringhe-in-c
In particolare dove parla di strcmp

Lui usa l'oggetto String e non un array di char.
Quindi == va bene essendo equivalente a .equals()
Reference https://docs.arduino.cc/built-in-examples/strings/StringComparisonOperators.

Se l'OP vuole risolvere brevemente basta tornare all'inizio e seguire le indicazioni che avevo dato.
In particolare la funzione sua originaria (facente parte un esempio funzionante che aveva trovato) checkUID(uid) cerca il Tag nell'elenco e ritorna True o false (trovato o non trovato)
A noi serve invece che torni un'informazione aggiuntiva e cioè quale Tag ha trovato, oppure ad es. - 1 se non lo trova.

Occorre cambiare il tipo della funzione poiché non usiamo più booleani, ma interi.
Pazienta un pochino e avremo il programmino funzionante come ti serve.
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[12] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteIlGuru » 11 apr 2023, 15:49

Hai ragione. Si può modificare checkUID così:
Codice: Seleziona tutto
int checkUID(String uid){
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return i;
    }
  }
  return usersSize;
}


Poi nel loop, al posto della if:

Codice: Seleziona tutto
    switch checkUID(uid) {
      case 0:
         blinkLed(GREEN0_LED_PIN, 2000, 1);
         break;
      case 1:
         blinkLed(GREEN1_LED_PIN, 2000, 1);
         break;
...
      default:
        blinkLed(RED_LED_PIN, 400, 2);
         break;
    }
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[13] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 11 apr 2023, 17:34

Anche se mettere un mare di case...

proverei così:

Codice: Seleziona tutto
#include <MFRC522.h>
#define RED_LED_PIN 2

MFRC522 rfid(10, 9);

String users[] = {"232f1892","d34a22ac","user3","user4"}; //aggiungi qui i vari UID
int greenLedPins[] = {3,4,5,6}; //metti i pin dove collegare i led, devono essere dello stesso numero di users
int usersSize = sizeof(users)/sizeof(String);
int numPin = 0;

void setup(){
  SPI.begin();
  rfid.PCD_Init();
  for(int i = 0; i<usersSize; i++){
     pinMode(greenLedPins[numPin], OUTPUT);
  }
  pinMode(RED_LED_PIN, OUTPUT);
}

void loop(){
  if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
    String uid = getUID();   
    numPin = checkUID(uid);
    if(numPin >= 0){
      blinkLed(greenLedPins[numPin], 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;
}

int checkUID(String uid){   //ora il risultato è un intero e non più un boolean
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return i;   //ritorniamo l'indice dell'UID trovato
    }
  }
  return -1;  // non abbiamo trovato nulla, torniamo -1 per segnalarlo e non confonderlo con un indice valido
}

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);
  }
}


Non l'ho compilato, magari ci sono errori. Vedi cosa dice il compilatore.
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[14] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 11 apr 2023, 17:43

teletommy ha scritto:Pensavo che questo potesse avvicinarsi alla soluzione ma il debug purtroppo mi sbarra la strada e non capisco cosa mi vuole suggerire.
Codice: Seleziona tutto
....
String users[] = {"232f1892","d34a22ac",“michele1”,“michele2”};
....



Il codice va bene, ma che editor usi?
Nella riga evidenziata ci sono caratteri strani che hai aggiunto a delimitare le stringhe che forse il compilatore non riconosce come delimitatori di stringa.
Prova un editor di testo semplice (notepad, notepad++).
Altrimenti copia una delle stringhe del programma originale (es. "232f1892", comprese le virgolette) e incollala a seguire, poi modifica il contenuto.
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[15] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 11 apr 2023, 18:37

Allora intanto vi ringrazio davvero tantissimo per il tempo che state perdendo con me. Ho caricato il codice che mi avete fornito ma purtroppo non funziona completamente.
Ho collegato due led verdi sui pin 3 e 4 e il led rosso l'ho lasciato sul 2. Gli indirizzi dei due tag sono corretti ma se passo i tag il verde si accende solo per il tag relativo al primo indirizzo dentro l'istruzione:
String users[] = {"d34a22ac","232f1892"};
Il tag relativo al secondo indirizzo non fa accendere il secondo led verde. Se cambio un carattere dell'indirizzo del secondo tag facendolo diventare un indirizzo sbagliato (ho messo "232f1893"), mi segnala il led rosso. quindi il problema è che non sente il secondo tag con condizione esatta.
Allego il codice che mi da questo funzionamento
Codice: Seleziona tutto
#include <MFRC522.h>
#define RED_LED_PIN 2
MFRC522 rfid(10, 9);
String users[] = {"d34a22ac","232f1892"}; //aggiungi qui i vari UID
int greenLedPins[] = {3,4,}; //metti i pin dove collegare i led, devono essere dello stesso numero di users
int usersSize = sizeof(users)/sizeof(String);
int numPin = 0;
void setup(){
  SPI.begin();
  rfid.PCD_Init();
  for(int i = 0; i<usersSize; i++){
     pinMode(greenLedPins[numPin], OUTPUT);
  }
  pinMode(RED_LED_PIN, OUTPUT);
}
void loop(){
  if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
    String uid = getUID();   
    numPin = checkUID(uid);
    if(numPin >= 0){
      blinkLed(greenLedPins[numPin], 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;
}
int checkUID(String uid){   //ora il risultato è un intero e non più un boolean
  for(int i = 0; i < usersSize; i++){
    if(users[i] == uid){
      return i;   //ritorniamo l'indice dell'UID trovato
    }
  }
  return -1;  // non abbiamo trovato nulla, torniamo -1 per segnalarlo e non confonderlo con un indice valido
}
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
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[16] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 11 apr 2023, 19:10

Sono riuscito :D con il primo codice che avevo un po' modificato e "rattoppato" anche secondo i vostri consigli.
Allego qui il codice funzoionante (con due tag..speriamo funzioni anche con 7 tag). Adesso però vorrei capire e far funzionare anche l'ultimo codice che mi avete gentilmente scritto perché è sicuramente più performante e scritto in modo più corretto. Grazie di cuore per l'aiuto, anche a nome di mio papà. Siete delle belle persone
Codice: Seleziona tutto
#include <MFRC522.h>
#define GREEN0_LED_PIN 3
#define GREEN1_LED_PIN 4
#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(GREEN0_LED_PIN, OUTPUT);
  pinMode(GREEN1_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);};
    }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);
  }}
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[17] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 11 apr 2023, 20:33

Nella riga
Codice: Seleziona tutto
int greenLedPins[] = {3,4,}; //metti i pin dove

c'è una virgola di troppo dopo il 4,
prova senza.
quando lo usavi e metti vicino al sensore il primo tag ("232f1892") si accende il led collegato al pin 3 o cosa?
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[18] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 15 apr 2023, 11:20

Questo il mio listato che funziona con mia immensa soddisfazione. Intanto metto questo servisse a qualcuno. L'altro programma non riesco ancora, ho tolto la virgola ma neanche adesso riesce a leggermi più di un tag sia se questo sia corretto o errato mentre se aggiungo l'indirizzo relativo ad un secondo tag mi fa accendere solo il rosso se appunto il secondo indirizzo è errato ma non mi fa accendere il secondo led se il secondo indirizzo è corretto. Questo il mio programma "alla buona". Grazie ancora a tutti voi per il tempo dedicatomi.
Codice: Seleziona tutto
#include <MFRC522.h>
#define GREEN0_LED_PIN 2
#define GREEN1_LED_PIN 3
#define GREEN2_LED_PIN 4
#define GREEN3_LED_PIN 5
#define GREEN4_LED_PIN 6
#define GREEN5_LED_PIN 7
#define GREEN6_LED_PIN 8
#define RED_LED_PIN 1
MFRC522 rfid(10, 9);
String users[] = {"0475d5b8700000","049abab6700000","04b9bab6700000","04d9bab6700000","04f7bab6700000","04c3c0b6700000","04e2c0b6700000"};
int usersSize = sizeof(users)/sizeof(String);
void setup(){
  SPI.begin();
  rfid.PCD_Init();
   pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN0_LED_PIN, OUTPUT);
  pinMode(GREEN1_LED_PIN, OUTPUT);
  pinMode(GREEN2_LED_PIN, OUTPUT);
  pinMode(GREEN3_LED_PIN, OUTPUT);
  pinMode(GREEN4_LED_PIN, OUTPUT);
  pinMode(GREEN5_LED_PIN, OUTPUT);
  pinMode(GREEN6_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);};
   if(users[4] == uid){ blinkLed(GREEN4_LED_PIN, 2000, 1);};
   if(users[5] == uid){ blinkLed(GREEN5_LED_PIN, 2000, 1);};
   if(users[6] == uid){ blinkLed(GREEN6_LED_PIN, 2000, 1);};
    }else{
      blinkLed(RED_LED_PIN, 2000, 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);
  }
}
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[19] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 15 apr 2023, 11:29

Ottimo.

Non accende gli altri perché ho fatto un errore nel setup:
Codice: Seleziona tutto
     pinMode(greenLedPins[numPin], OUTPUT);

deve essere
Codice: Seleziona tutto
     pinMode(greenLedPins[i], OUTPUT);

in quel punto numPin vale 0 e mette in out solo il primo pin...
puoi provare sostituendo i a numPin per favore?
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[20] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 30 apr 2023, 18:56

Ciao, scusami tanto se non sono riuscito a risponderti prima ma babbo purtroppo è stato nuovamente ricoverato in ospedale per la sua malattia e non ho avuto ne modo ne testa di dedicarmi alla cosa. Adesso finalmente è a casa e più che mai cerco di ultimare il progetto. Ho provato E FUNZIONA!!!!! GRAZIE DAVVERO DI CUORE.
Adesso ti chiedo l'ultima cosa poi non ti disturbo più. Quando il sistema passa il tag corretto deve avviare un messaggio vocale che, per l'integrato isd che utilizzo, ha bisogno di andare a livello basso (low) anzichè alto come adesso che mi provoca l'accensione del led. Sto provando ma purtroppo non riesco ad arrivarci. Puoi indicarmi come fare per far andare il pin a livello "low" anzichè "High" per 1 secondo circa (non è poi così importante il tempo di low). Ti ringrazio di cuore ancora. sei davvero una bella persona
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti