tag rfid - ligne de code ça veut dire quoi excatement

bonjour,

après avoir trouver un code qui marche pour mon besoin, lire uniquement un tag rfid, j’aurai besoin de savoir précisément ce que veulent dire quelques lignes de codes dans le “loop”

merci d’avance

void loop() // le corp de notre programme
{
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  String tag= "";
  byte caractere;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     tag.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
}

bonjour,

j'arrive pas à comprendre ces lignes de codes

les deux premiers if sont là pour dire:
S’il n’y a pas de badge, ne rien faire (return)
Si la lecture a merdée, alors ne rien faire (return)

Si on arrive à la suite, c’est que la lecture a marché, dans ce cas le N° de série du badge est stocké dans le tableau mfrc522.uid.uidByte[] et le nombre d’octets à lire est stocké dans mfrc522.uid.size

donc on fait une boucle pour lire chaque octet  for (byte i = 0; i < mfrc522.uid.size; i++) et pour les afficher proprement en HEXA décimal, on teste d’abord si l’octet en cours se représente que sur un symbole (donc si strictement plus petit que 0x10 - soit de 0 à 9 ou A,B,C…F) dans ce cas on écrit d’abord un ‘0’ pour toujours avoir 2 caractères affichés

Serial l’envoie à l’écran

le concat le rajoute à la chaine de caractère

merci pour ta réponse, je commence à voir plus clair.
La suite c'est que je dois envoyer ce tag RFID (en chaine de caractère) en LoRa. Comment je pourrais modifier son nom ?

quel nom ?

le N° de série est dans la String tag. c'est une chaîne de caractère et vous pouvez manipuler cela à votre convenance avec les méthodes de la classe String

Mais pourquoi passer par de l'ASCII très verbeux pour l'envoyer en LORA, pourquoi ne pas envoyer directement les octets du tableau ?

pour envoyer la donnée du tag en LORA, je dois la mettre en chaîne de caractère

et après faut que j’obtienne ceci : C4 AF 50 03

je ne sais pas comment faire

c’est déjà ce que vous avez dans tag… imprimez le et vous verrez

comment je pourrais afficher le contenu de string tag ?

le tableau j'en est plus besoin par conséquent ?

le tableau va être vidé au prochain appel pour voir s'il y a une carte.

Serial.println(tag);va imprimer la String

si vous en êtes là vous êtes TRES TRES loin de pouvoir faire quoique ce soit par vous même encore plus si vous devez ajouter de la communication sans fil

Mettez ce projet de côté et allez faire des tutos sur le C et le C++ et sur Arduino => un bon point de départ c'est de lire les tutos d'eskimon

quand j'ai demandé comment afficher la string tag, c'est que cette ligne de code je l'avais déjà essayé avant de demander et du coup rien ne s'affiche sur le moniteur.

du tableau j'en est encore besoin ?

Postez tout le code que vous avez utilisé

Vous n’êtes pas propriétaire du tableau il est dans la classe RFID donc ce n’est pas à votre code de le toucher sauf en lecture quand un badge est déclaré dispo. Je ne peux pas vous dire si vous en avez encore besoin je ne connais pas le cahier des charges...

tout le code, et fonctionnel
pouvez vous me dire si les commentaires déjà présent sont correct ?
et que mettre en commentaires pour les lignes avec le concat ?

//mise à jour : 04/05/2020

#include <SPI.h> //initialisation bibliothèque
#include <MFRC522.h> //initialisation bibliothèque
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // definition des pin du RC522


int temoin = 6; //initialisation d'un entier temoin a 6


char st[20];

void setup() 
{
  pinMode(temoin, OUTPUT); //définit le pin temoin
  Serial.begin(9600); //cadensement à 9600 bauds
  SPI.begin();
  mfrc522.PCD_Init(); 
}

void loop() // le corp de notre programme
{
  if ( ! mfrc522.PICC_IsNewCardPresent()) //si pas de badge ne rien faire
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) //si problème de lecture ne rien faire
  {
    return;
  }
 String tag= "";
  
  byte caractere;
 for (byte i = 0; i < mfrc522.uid.size; i++) // boucle pour lire chaque octet
  {
   tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
   tag.concat(String(mfrc522.uid.uidByte[i], HEX)); 
  }
 Serial.println(tag); //afficher le contenu de tag
  delay(1000);
}

c’est à vous d’essayer d’expliquer non ?
par exemple expliquez moi cela?

int temoin = 6; //initialisation d'un entier temoin a 6
...
  pinMode(temoin, OUTPUT); //définit le pin temoin

pour les concat:

un octet c’est 8 bits. 1101 1001 par exemple. Pour le représenter en Hexadécimal on prend par groupe de 4 bits (base 2) et on regarde la valeur associée; elle va vairier entre 0 et 15. De 0 à 9 on utilise le symbole ‘0’ à ‘9’ mais comme ensuite on n’a pas de chiffre en base 10, pour la base 16 on utilise des lettres ‘A’ pour 10, ‘B’ pour 11, ‘C’ pour 12 … et ‘F’ pour 15.

Dans mon exemple ci dessus [color=red]1101[/color] [color=blue]1001[/color]
[color=red]1101[/color] c’est 8+4+1 = 13 donc symbole ASCII ‘D’
[color=blue]0101[/color] c’est 4+1 = 5 donc symbole ASCII ‘5’
==> représentation hexadécimale = D5

Quand on imprime des octets en hexadécimal, on aime bien qu’il y ait toujours deux caractères ASCII, un par groupe de 4 bits.

Le souci avec la fonction print c’est que si le premier groupe de 4 bits est 0000 soit la valeur 0, la fonction ne l’imprimera pas. et donc [color=red]0000[/color] 1111 par exemple s’affichera sous forme ‘F’ au lieu de ‘0F’ qu’on aimerait avoir.

Le test si dessus

octet < 0x10 ? " 0" : " "

va dire si mon octet est strictement plus petit que 10(hex) alors l’octet devrait commencer par un ‘0’ mais comme il ne sera pas mis, et bien on le rajoute

en français c’est donc

si mon octet commence par un ‘0’, concaténer à la chaîne courante un espace suivi d’un zéro, sinon concatènera seulement un espace.

le second concat() lui va imprimer le nombre en hexadécimal (sur un ou deux symboles)

déjà, premièrement, je voulais vous remercier

int temoin = 6; //initialisation d'un entier temoin a 6
...
  pinMode(temoin, OUTPUT); //définit le pin temoin

déclaration du pin 6 en sortie, à la place de temoin on aurait pu mettre 6 directement

j'ai bon ?

et pour l'explication claire du concat, merci

bof bof ‘témoin’ ça ne veut pas dire grand chose…

par exemple ça se serait mieux:

const byte pinLEDTemoin = 6; // 6 est le N° de la broche qui sera connectée à une LED témoin par le biais d'une résistance de limitation de courant de 220Ω
// câblage  broche 6 <----> R 220Ω <-- ANODE--[LED]--CATHODE--> GND

et ensuite pinMode(pinLEDTemoin, OUTPUT); //on règle la broche de commande de la LED témoin en SORTIE

Notez que j’ai changé le type, un octet (byte) est suffisant pour un N° de broche (pin) et comme ce N° ne changera pas, on le dit au compilateur que c’est une constante. (un int prendrait 2 octets sur un UNO, 4 sur des cartes 32 bits donc on perdrait de la mémoire pour rien).