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

[1] Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 10 apr 2023, 1:32

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.
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[2] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 10 apr 2023, 8:08

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.
Avatar utente
Foto UtenteGioArca67
4.570 4 6 9
Master EY
Master EY
 
Messaggi: 4590
Iscritto il: 12 mar 2021, 9:36

0
voti

[3] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 10 apr 2023, 8:34

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
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[4] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 11 apr 2023, 0:39

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!
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[5] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteGioArca67 » 11 apr 2023, 8:50

Che dice il debug??
Avatar utente
Foto UtenteGioArca67
4.570 4 6 9
Master EY
Master EY
 
Messaggi: 4590
Iscritto il: 12 mar 2021, 9:36

0
voti

[6] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteIlGuru » 11 apr 2023, 10:00

Il confronto fra stringhe in c non si fa con l'operatore ==
Così confronti gli indirizzi di memoria dei due operandi.
\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

[7] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 11 apr 2023, 10:32

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
Ultima modifica di Foto Utenteteletommy il 11 apr 2023, 10:53, modificato 1 volta in totale.
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[8] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteEcoTan » 11 apr 2023, 10:51

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),
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[9] Re: Lettore tag rfid rc522

Messaggioda Foto Utenteteletommy » 11 apr 2023, 10:55

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
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[10] Re: Lettore tag rfid rc522

Messaggioda Foto UtenteIlGuru » 11 apr 2023, 13:43

Guarda qui: stringhe-in-c
In particolare dove parla di strcmp
\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

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Google [Bot] e 4 ospiti