RFID arduino , chiarimenti programma

Salve , sono indietro con un progetto , il mio scopo è far andare a 1 una variabile quando la tessera RFID ha il codice corretto , ho trovato questo codice che è quello che mi serve , però in alcuni punti non capisco cosa fa , lo vorrei sapere bene cosi poi da saperto spiegare . E’ la prima volta che ho sotto mano l’RFID Reader/Writer .

Il programma è il seguente :

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
void setup() 
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  Serial.println("Put your card to the reader...");
  Serial.println();

}
void loop() 
{
  // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content= "";
  byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "B6 3A 50 39") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(3000);
    
  }
 
 else   {
    Serial.println(" Access denied");
    delay(3000);
  }
}

La parte che non capisco è questa

 //Show UID on serial monitor
  Serial.print("UID tag :");
  String content= "";
  byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();

Oltre il serial print e il for non capisco gli altri comandi in questa parte ? E soprattuto non capisco cosa faccia il ciclo for …

Se qualcuno mi risponde gliene sarei grato , grazie della lettura

Beh il for() cicla tutti i caratteri contenuti nel campo "uid" di "mfrc522" (questa è normale sintassi C/C++).

Il primo e terzo Serial.print() contiene di fatto una "if", ossia se il byte che vuoi visualizzare è composto da una sola cifra esadecimale (minore di 0x10) aggiunge uno "0" prima, per fare in modo di avere sempre 2 cifre decimali. Il secondo e quarto serial.print() aggiunge quindi il valore esadecimale del byte.

Scusami , sinceramente non ho capito , potresti rispiegarmi passo per passo i comandi e magari spiegarlo in modo diverso ?

Prendiamo il primo print:

Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");

Questo è equivalente a:

if ( mfrc522.uid.uidByte[i] < 0x10 )
  Serial.print(" 0");
else
  Serial.print(" ");

Quindi se, poniamo, il valore dell’ i-esimo byte (mfrc522.uid.uidByte) fosse 5, scrivendo solo

Serial.print(mfrc522.uid.uidByte[i], HEX);

avremmo in output solo:
5
Invece con quella if() ho uno spazio e lo zero iniziale:
05
Se il valore del byte fosse 26 ossia 1A esadecimale, la “if” passerebbe per l’“else” visualizzando solo uno spazio in più:
1A

Discorso un poco più complesso per il concat.

content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));

questo concatena alla stringa “content” il valore " 0" o " ", sempre a seconda della condizione, diciamo:

if ( mfrc522.uid.uidByte[i] < 0x10 )
  content.concat(" 0");
else
  content.concat(" ");

Sono tutte sintassi molto “C” che compattano il codice ma lo rendono anche ben poco leggibile, a mio avviso anche inutili (visto che il codice generato è di solito praticamente identico scrivendo l’una o l’altra versione).

Non preoccuparti, chiedi pure, ma in ogni caso cerca anche in giro qualche corso di C/C++ per imparare meglio le basi di questi linguaggi che hanno di questi “risvolti” un poco ostici all’inizio.
Ciao!

Grazie mille della spiegazione

Non capisco però come far resettare il codice senza la lettura ... , se metto return il programma resta bloccato , io devo farlo scorrere...

Salve , il mio problema è far resettare il codice carta letto dal lettore RFID , cioè se legge una carta dopo aver fatto la decisione (if) il codice letto deve andare a 0 o comunque a un valore nullo , nel programma attuale una volta letto il codice il programma se lo tiene , non capisco come farlo andare a 0 .

Il codice completo è questo :

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
#define buzzer  3
#define reed  7
#define button 4
#define Aled 2  // led allarme acceso 
#define Sled 5   // led allarme spento


int Sbutton; // variabile in cui è contenuto lo stato del pulsante
int allarme = 0;
int reedstate = 0; // stat osensore reed
int allarmset = 0; // sistema di allarme ATTTIVO/DISATTIVO

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

void setup()
{
  Serial.begin(9600);
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  Serial.println("Put your card to the reader...");
  Serial.println();
  pinMode(button, INPUT);
  pinMode(reed, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(Aled, OUTPUT);
  pinMode(Sled, OUTPUT);
}
void loop() {

  digitalWrite(Sled, HIGH);
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
  
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
  
  }
  String content = "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  content.toUpperCase();
  if (content.substring(1) == "B6 3A 50 39") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("SPEGNIMENTO SISTEMA DI ALLARME");
    Serial.println();
    allarmset = 0;
    allarme = 0;
    digitalWrite(Sled, HIGH);
    digitalWrite(Aled, LOW);

  }



  Sbutton = digitalRead(button);
  if (Sbutton == HIGH) {
    allarmset = 1;
    digitalWrite(Aled, HIGH);
    digitalWrite(Sled, LOW);
    Serial.println("ACCENSIONE SISTEMA DI ALLARME");
  }
  else {
    Serial.println("");
  }
  // PARTE ALLARME
  reedstate = digitalRead(reed);

  if (allarmset == 1) {
    AllarmeON();
  }
  if (allarmset == 0) {
    Serial.println("ALLARME SPENTO");
  }
  // FINE PARTE ALLARME

}

void AllarmeON() {
  Serial.println("ALLARME ATTIVO");
  if (reedstate == 0 ) {
    Serial.println("INTRUSO");
    allarme = 1;
  }
  if (allarme == 1 ) {
    digitalWrite(buzzer, HIGH);
    Serial.println("ALLARMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");
  }
  if (allarme == 0 ) {
    digitalWrite(buzzer, LOW);
    Serial.println("\t");
    Serial.println("sicuro");
  }
  if (reedstate == HIGH) {
    Serial.println("sicuro");
  }
}

Grazie della lettura , aspetto risposte .

> insane401: Ho riunito io due thread e ti prego di NON aprire più thread per lo stesso argomento di cui stai già parlando qui. Grazie,

Guglielmo

Ok , ho capito

gpb01:
> insane401: Ho riunito io due thread e ti prego di NON aprire più thread per lo stesso argomento di cui stai già parlando qui. Grazie,

Guglielmo

@gpb01 però cosi la mia discussione non è visibile.... tutti pensano che il problema sia gia risolto e non ci cliccano nemmeno...

Assolutamente NO, risolta è la discussione che riporta [RISOLTO] nel tutolo del thread (... cosa che pochi purtroppo fanno), negli altri casi .. la discussione è aperta ... e ogni 48 ore la puoi riportare in testa alle discussioni facendo "up".

Mancate risposte possono dipendere da vari fattori, tra cui: domande poco chiare, poche informazioni fornite, pochi utenti interessatia all'argomento o in grado di fornire risposte "sensate", ecc. ecc.

Guglielmo