Schede RFID ARDUINO

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10         
MFRC522 mfrc522(SS_PIN, RST_PIN);   
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
}}

void loop() {
  
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    byte sector         = 1;
    byte blockAddr      = 4;
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
    Serial.println();
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
}
void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
    }
}

Eccolo qui, modificato da quello di prima. Adesso devo solo trasformare l’HEX in TEXT.
Qualche esempio ?

Serial.print ((char) buffer[i]);

Sarebbe anche meglio fare prima un controllo che il carattere sia stampabile con isprint().

Grazie, stavo provando. con quello che mi scrivi mi da questo
49I 6Cl 4DM 4FO 6En 64d 6Fo 20 20 20 20 20 20 20 20 20

le lettere sono collegate al numero. “ILMondo”

void dump_byte_array(byte *buffer, byte bufferSize) {
    
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
        Serial.print ((char) buffer[i]);
    }

Credo che puoi arrivarci da solo ;).

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10         
MFRC522 mfrc522(SS_PIN, RST_PIN);   
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
}}

void loop() {
  
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
   
    byte sector         = 1;
    byte blockAddr      = 4;
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
    Serial.println();
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
   
  
 
}
void dump_byte_array(byte *buffer, byte bufferSize) {
    
     for (byte i = 0; i < bufferSize; i++) {
         Serial.print((char) buffer[i]);
    }

}

ok finito.
Grazie. Sukko e Guglielmo
Adesso mi devo creare la scrittura.

Eccomi per un altra informazione. Ho finito lo sketch sia di lettura che scrittura li ho messi insieme e ho realizzato questo.

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          
MFRC522 mfrc522(SS_PIN, RST_PIN);  
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 

    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }}
void loop() {
    
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock[]    = {
        0x33, 0x20, 0x20, 0x20, //  3,
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20  
    };
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));

    // Scrive il blocco dataBlock
    Serial.print(F("Scrivo il credito ")); 
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();
 
    // Halt PICC
    mfrc522.PICC_HaltA();
    // Stop encryption on PCD
    mfrc522.PCD_StopCrypto1();
}

void dump_byte_array(byte *buffer, byte bufferSize) {
// VISUALIZZO IL CREDITO TRASFORMATO DA HEX A TESTO 
    for (byte i = 0; i < bufferSize; i++) {
         Serial.print((char) buffer[i]);
    }
}

ora mi servirebbe sapere se c’è un modo per scrivere nel blocco

byte dataBlock[]    = {
        0x33, 0x20, 0x20, 0x20, //  3,
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20  
    };

solo il primo numero, vorrei fare che se premo il pulsante + aumenta il numero,
mentre se premo il pulsante - diminuisce.
c’è un modo potete indicarmi qualcosa per capire.
Grazie

Il fatto è che tu stai scrivendo il tuo numero sotto forma di caratteri, una stringa insomma. Sarebbe decisamente più semplice se lo trattasse direttamente come numero. Qual è il range che devi gestire?

è già un numero perchè se vedi nel blocco

byte dataBlock[]    = {
        0x33, 0x20, 0x20, 0x20, //  3,
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20, 
        0x20, 0x20, 0x20, 0x20  
    };

il 0x33 rappresente il numero 3.

come crediti se non è molto complicato che devo uscire pazzo vorrei fare fino a 10
ma mi va benissimo anche s0lo fino a 9. cosi da modificare solo il primo numero da 30 a 39.

Se fosse un numero ci sarebbe 3 a rappresentare 3, non 0x33, che è il codice ASCII del carattere '3'. Se fai così diventi matto, perché quando hai più cifre come fai?

Devi memorizzare solo interi?

Ho solo questi numero da 0 a 9
quindi avrei 0x30 0x31 0x32 e cosi via fino a 0x39.
Pero devo anche fare in modo che questi numeri aumentano o diminuiscono in base se premo dei tasti.
HAi qualche idea ?

Scusa adesso ho capito, lui mi fa la conversione in testo e non numero.
Quindi come posso fare ?

Beh, hai un buffer di byte in cui puoi scrivere quello che vuoi...

buffer[0] = 0;
buffer[0]++;
buffer[0]--;

Sono tutte cose che puoi fare e che lavorano su un singolo elemento. Leggi, aggiorni e riscrivi.

dove posso leggere un esempio da capire come inserirlo nel mio sketch.

Boh? Invece di cercare qualcosa di già fatto, che non so se troverai, sarebbe meglio che pensassi e definissi a livello teorico il flusso del tuo programma. Poi un passo alla volta andrai a implementarlo. Se ho capito bene quel che vuoi fare, io farei più o meno quel che segue, partendo dal presupposto di utilizzare un settore della tessera per la mia applicazione.

Nota che uno dei problemi che dobbiamo affrontare è capire se la tessera passata è già "abilitata" al nostro sistema oppure no. Ad esempio possiamo decidere di scrivere una firma (= "LUCA") nei primi 4 byte del settore per marcare le tessere abilitate, e quindi di usare il 4° byte per la cifra che vogliamo salvare. Definiremo quindi una sorta di "formattazione" in cui scriviamo la firma e inizializzaziamo il credito a 0.

  • Attendo tessera
  • Leggo il settore che mi interessa e verifico la firma
  • Se la firma è errata, riscrivo il settore con la firma corretta e il credito iniziale
  • Se la firma è corretta... Non so, qua non ho ben capito cosa devi fare, comunque aggiorno il credito e riscrivo il settore

mi sto già muovendo cosi, per l'identificazione per il momento non serve. E' solo un gioco per il mio piccolo.
in effetti funziona cosi mette le monete nel salvadanaio carica la scheda e può prendere poi le caramelle. molto semplificato il progetto.
Vedo se riesco a fare qualcosa.

ciao, sicuramente è un modo sbagliatissimo di farlo, ma come posso fare che mi viene letto il valore 9 e mi si accende il LED? io ho provato cosi ma sicuramente è sbagliato.
La funzione di lettura e accensione led è giù.

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          
#define PulsPiu  2
#define PulsMeno  3
#define LedPiu  4
#define LedMeno  5
int StatoPulsPiu = 0;
int StatoPulsMeno = 0;
int val;
MFRC522 mfrc522(SS_PIN, RST_PIN);  
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
    pinMode(PulsPiu, INPUT);
    pinMode(PulsMeno, INPUT);
    pinMode(LedPiu, OUTPUT);
    pinMode(LedMeno, OUTPUT);
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }}
void loop() {
//test sensori crediti IMPORTANTE SENZA SCHEDE INSERITE KEY
    StatoPulsPiu = digitalRead(PulsPiu);  //Legge il valore del pulsante, ossia il valore del pin 2
     //Controllo lo stato del pulsante
     if (StatoPulsPiu == HIGH)
         digitalWrite(LedPiu, HIGH);  //Spengo il led
     else
         digitalWrite(LedPiu,LOW);  //Accendo il led
     
     StatoPulsMeno = digitalRead(PulsMeno);  //Legge il valore del pulsante, ossia il valore del pin 2
     //Controllo lo stato del pulsante
     if (StatoPulsMeno == HIGH)
         digitalWrite(LedMeno, HIGH);  //Spengo il led
     else
         digitalWrite(LedMeno,LOW);  //Accendo il led
//*********************************************************
              
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock9[]    = {0x39, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

     mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
     //    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16);// Serial.println();
//    Serial.println();
   
    
    /*status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
    
    // Scrive il blocco dataBlock
    Serial.print(F("Scrivo il credito ")); 
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock9, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock9, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();*/


 
    // Halt PICC
    mfrc522.PICC_HaltA();
    // Stop encryption on PCD
    mfrc522.PCD_StopCrypto1();
}

void dump_byte_array(byte *buffer, byte bufferSize) {

// VISUALIZZO IL CREDITO TRASFORMATO DA HEX A TESTO 
    for (byte i = 0; i < bufferSize; i++) {
         Serial.print((char) buffer[i]);
    }
    if (Serial.available() > 0) {
    delay(3);  
    val = Serial.read();
  switch (val) {
    case '9' :
      digitalWrite(LedMeno, HIGH);
      delay(1000);
      break;  
  }
  }

Penso che adesso sia ok. Ma continua a non accendermi il LED quando la readString legge “9”
Perchè? :frowning: :frowning: :frowning:
Dove sbaglio ?

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          
#define PulsPiu  2
#define PulsMeno  3
#define LedPiu  4
#define LedMeno  5
int StatoPulsPiu = 0;
int StatoPulsMeno = 0;
int val;
MFRC522 mfrc522(SS_PIN, RST_PIN);  
MFRC522::MIFARE_Key key;
String readString;
void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
    pinMode(PulsPiu, INPUT);
    pinMode(PulsMeno, INPUT);
    pinMode(LedPiu, OUTPUT);
    pinMode(LedMeno, OUTPUT);
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }}
void loop() {
//test sensori crediti IMPORTANTE SENZA SCHEDE INSERITE KEY
    StatoPulsPiu = digitalRead(PulsPiu);  //Legge il valore del pulsante, ossia il valore del pin 2
     //Controllo lo stato del pulsante
     if (StatoPulsPiu == HIGH)
         digitalWrite(LedPiu, HIGH);  //Spengo il led
     else
         digitalWrite(LedPiu,LOW);  //Accendo il led
     
     StatoPulsMeno = digitalRead(PulsMeno);  //Legge il valore del pulsante, ossia il valore del pin 2
     //Controllo lo stato del pulsante
     if (StatoPulsMeno == HIGH)
         digitalWrite(LedMeno, HIGH);  //Spengo il led
     else
         digitalWrite(LedMeno,LOW);  //Accendo il led
//*********************************************************
              
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock9[]    = {0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

     mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
     //    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16);// Serial.println();
//    Serial.println();
       /*status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
    
    // Scrive il blocco dataBlock
    Serial.print(F("Scrivo il credito ")); 
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock9, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock9, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();*/
    // Halt PICC
    mfrc522.PICC_HaltA();
    // Stop encryption on PCD
    mfrc522.PCD_StopCrypto1();
}

void dump_byte_array(byte *buffer, byte bufferSize) {

// VISUALIZZO IL CREDITO TRASFORMATO DA HEX A TESTO 
    for (byte i = 0; i < bufferSize; i++) {
         Serial.print((char) buffer[i]);
    }
    String val((char) *buffer);
  
    while (Serial.available()) {
    delay(3);  
    char val = Serial.read();
    readString += val;}
    
    Serial.println("");
    Serial.println(val);
   
    if (readString.length() >0) {
      Serial.println(readString);
    
    if (readString == "9")     
    {
      digitalWrite(LedMeno, HIGH);
      delay(400);//400
      digitalWrite(LedMeno, LOW);
}}}

Ma... Ti rendi conto di quello che fa il codice che scrivi o fai cose a caso come tutti qui? Che c'entra la Serial???

ho fatto altre prove e modifiche.

void dump_byte_array(byte *buffer, byte bufferSize) {

// VISUALIZZO IL CREDITO TRASFORMATO DA HEX A TESTO 
    for (byte i = 0; i < bufferSize; i++) {
         Serial.print((char) buffer[i]);
    }
    String val((char) *buffer);
  
    while (Serial.available()) {
    delay(3);  
    char val = Serial.read();
    readS = val;}
    
    Serial.println("");
    Serial.println(val);
   
   if (readS.length() >0) {
   Serial.println(readS);
    
    if (readS == '0')    
    {
      digitalWrite(LedPiu, HIGH);
      delay(1000);
      digitalWrite(LedPiu, LOW);
        
      }
    }
}

ma continua a accendermi il LED :frowning:

Ripeto: perché leggi caratteri dalla seriale??? Dal codice si direbbe che vuoi che il led si accenda se scrivi 0 lì!