da
teletommy » 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 "232f189
3"), 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