MFRC522 Library RFID UID an Nextion Display

Hallo,

ich möchte das Programm von hier
Nr.19 RFID Kit – Funduino – Kits und Anleitungen für Arduino zum Auslesen der RFID UID ändern. Es soll die UID nicht nur auf dem seriellen Monitor anzeigen, sondern auch auf einem Nextion Display.

#include <SPI.h> // SPI-Bibiothek hinzufügen

#include <MFRC522.h> // RFID-Bibiothek hinzufügen

#define SS_PIN 10 // SDA an Pin 10 (bei MEGA anders)

#define RST_PIN 9 // RST an Pin 9 (bei MEGA anders)

MFRC522 mfrc522(SS_PIN, RST_PIN); // RFID-Empfänger benennen



void setup() // Beginn des Setups:

{

Serial.begin(9600); // Serielle Verbindung starten (Monitor)

SPI.begin(); // SPI-Verbindung aufbauen

mfrc522.PCD_Init(); // Initialisierung des RFID-Empfängers

}



void loop() // Hier beginnt der Loop-Teil

{

if ( ! mfrc522.PICC_IsNewCardPresent()) // Wenn keine Karte in Reichweite ist...

{

return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.

}



if ( ! mfrc522.PICC_ReadCardSerial()) // Wenn kein RFID-Sender ausgewählt wurde

{

return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
}



Serial.print("Die ID des RFID-TAGS lautet:"); // "Die ID des RFID-TAGS lautet:" wird auf den Serial Monitor geschrieben.



for (byte i = 0; i < mfrc522.uid.size; i++)

{

Serial.print(mfrc522.uid.uidByte[i], HEX); // Dann wird die UID ausgelesen, die aus vier einzelnen Blöcken besteht und der Reihe nach an den Serial Monitor gesendet. Die Endung Hex bedeutet, dass die vier Blöcke der UID als HEX-Zahl (also auch mit Buchstaben) ausgegeben wird

Serial.print(" "); // Der Befehl „Serial.print(" ");“ sorgt dafür, dass zwischen den einzelnen ausgelesenen Blöcken ein Leerzeichen steht.

}


Serial.println(); // Mit dieser Zeile wird auf dem Serial Monitor nur ein Zeilenumbruch gemacht.

}

Mit dem Nextion Library Befehl
t3.setText(uidchars);
kann ich den Text der in der Variable uidchars gespeichert ist in einem Textfeld auf dem Nextion Display ausgeben.

uidchars definiere ich so: char uidchars[30]

Wie bekomme ich die 4 Bytes (Integer Werte) , die in der Schleife vom Tag gelesen werden, in die Variable uidchars? Dabei sollen die Bytes als Hexadezimalzahlen angezeigt werden.

Liebe Grüße
Charlotte

cklar:
....
Wie bekomme ich die 4 Bytes (Integer Werte) , die in der Schleife vom Tag gelesen werden, in die Variable uidchars? Dabei sollen die Bytes als Hexadezimalzahlen angezeigt werden.

Wenn du die in einem Textfeld anzeigen willst, geht es nur, wenn du die zuvor in einen String wandelst.

Danke,

ich habe den befehl itoa gefunden. Damit kann man integer Werte in Text umwandeln.
Der Befehl kann sogar in Hexadezimalzahlen umwandeln.

Ich habe aber noch ein Problem. Jetzt wird immer nur ein Byte in das Textfeld geschrieben. Wie kann ich denn die einzelnen Bytes der UID zusammenmachen?

for (byte i = 0; i < mfrc522.uid.size; i++)

  {
  
    
  // Das Byte wird auf den seriellen Monitor geschrieben und zwar als Hexadezimalzahl;
  Serial.print(mfrc522.uid.uidByte[i];, HEX); 
  Serial.print(" "); // Der Befehl „Serial.print(" ");“ sorgt dafür, dass zwischen den einzelnen ausgelesenen Blöcken ein Leerzeichen steht.
  
  
  // mfrc522.uid.uidByte[i] liest ein uid Byte vom Tag mit der Nr. i 
  // Das Byte wird in der Integer Variable uidcode gespeichert 
  uidcode=mfrc522.uid.uidByte[i];
    
  // Der Integer Wert von uidcode wird mit itoa in einen string umgewandelt
  // und als string in uidstrng gespeichert 
  // 16 damit die Zahl als Hexadezimalzahl umgewandelt wird 
  itoa(uidcode, uidstrng, 16);

  
  }
  
  Serial.println(); // Mit dieser Zeile wird auf dem Serial Monitor nur ein Zeilenumbruch gemacht.
  t3.setText(uidstrng);  // Mit diese Zeile wird uidstrng auf dem Nextion-Display im textfeld t3 angezeigt

Liebe Grüße
Charlotte

du liest EIN BYTE aus

uidcode=mfrc522.uid.uidByte*;*

wandelst das in eine Zahl

  • itoa(uidcode, uidstrng, 16);*
    wiederholst das ganze in in deiner For
    und gibst dann EINMAL
    *t3.setText(uidstrng); *
    aus.
    Erkennst du das Problem?
    wenn du mit c-strings weiterarbeiten willst, wäre z.B. stracat eine Möglichkeit.

Super danke. Das hat mir gefehlt.

Einfach die Strings addieren ging nicht. uidstrng=uidstrng+uidstrngbuffer gab eine Fehlermeldung:

exit status 1
invalid operands of types 'const char*' and 'const char [4]' to binary 'operator+'

Mit strcat klappt das Zusammenfügen der Strings. Ich hab zwar nicht verstanden, warum es mit + nicht geht, aber ok strcat funktioniert.

Wenn ich jetzt den Button drücke, dann erscheint die ganze UID im Textfeld.

Eins klappt aber noch nicht. Wenn ich den Button nochmal drücke, dann erscheint im Textfeld die UID doppelt: UID:4B:10:23:A0:4B:10:23:A0.

Wenn ich einen anderen Tag auflege, dann kommt beim zweiten Lesen:
UID:4B:10:23:A0:12:14:A3:30.

Es sieht so aus, als würde die Variable uidstrng immer länger.

Hat da noch jemand eine Idee?

// Button für Auslesen der UID des RFID-Tags
void b34PushCallback(void *ptr) {
/*  :-) Haha jetzt wird die UID des RFID Tags ausgelesen
 */

    
  t3.setText("Karte aufgelegt?");
  if ( ! mfrc522.PICC_IsNewCardPresent()) // Wenn keine Karte in Reichweite ist...
      {
            return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
      }

  
  if ( ! mfrc522.PICC_ReadCardSerial()) // Wenn kein RFID-Sender ausgewählt wurde
    {
    return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
    }

    
  Serial.print("Die ID des RFID-TAGS lautet:"); // "Die ID des RFID-TAGS lautet:" wird auf den Serial Monitor geschrieben.
  t3.setText(uidstrng); // Auf das Display im Textfeld t3 wird "UID" geschrieben. 

// Dann wird die UID ausgelesen, die aus vier einzelnen Bytes besteht und der Reihe nach an den Serial Monitor gesendet. 
// Die Endung Hex bedeutet, dass die vier Bytes der UID als HEX-Zahl (also auch mit Buchstaben) ausgegeben wird
  
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
  
  // Das Byte wird auf den seriellen Monitor geschrieben und zwar als Hexadezimalzahl;
  Serial.print(mfrc522.uid.uidByte[i];, HEX);
  Serial.print(" "); // Der Befehl „Serial.print(" ");" sorgt dafür, dass zwischen den einzelnen ausgelesenen Blöcken ein Leerzeichen steht.
 
 
  // mfrc522.uid.uidByte[i] liest ein uid Byte vom Tag mit der Nr. i
  // Das Byte wird in der Integer Variable uidcode gespeichert
  uidcode=mfrc522.uid.uidByte[i];
   
  // Der Integer Wert von uidcode wird mit itoa in einen string umgewandelt
  // und als string in uidstrngbuffer gespeichert
  // 16 damit die Zahl als Hexadezimalzahl umgewandelt wird
  itoa(uidcode, uidstrngbuffer, 16);

  
  // Am Anfang steht in uidstrng nur "UID"
  // die einzelnen Bytes der UID vom Tag werden dann drangehängt
  // zunächst ":" wird an uidstrng darangehängt, um die einzelnen Bytes der UID zu trennen
  strcat (uidstrng, ":");
  // dann wird uidstrngbuffer (das Byte als Hexadezimalzahl) an uidstrng darangehängt 
  strcat (uidstrng, uidstrngbuffer);
  
  
  }
  
  Serial.println(); // Mit dieser Zeile wird auf dem Serial Monitor nur ein Zeilenumbruch gemacht.
  t3.setText(uidstrng);  // Mit diese Zeile wird uidstrng auf dem Nextion-Display im textfeld t3 angezeigt
  
}

Liebe Grüße
Charlotte

Du musst uidstrng nach der Anzeige/Nutzung wieder leer machen.

uidstrng[0] = '\0';

Gruß Tommy

cklar:
Einfach die Strings addieren ging nicht. uidstrng=uidstrng+uidstrngbuffer gab eine Fehlermeldung:

du hast auch keinen String (Objekt der Arduino String Klasse) verwendet sondern einen (c-)string

und das kannst eben nicht mit + "addieren".
Du willst auch gar nicht "addieren" sondern concatinieren, ergo strcat, bzw. mit strcpy kopieren.

Such einfach ein wenig nach "c++ string", "array of char" etc ... da findet sich viel darüber.

... und jetzt warten wir auf Combie der das sicher fachlich besser erklären kann. :wink:

Ich hab zwar nicht verstanden, warum es mit + nicht geht, aber ok strcat funktioniert.

Wenn du erwartest, dass "eins"+"drei" den Text "vier" ergibt, das dauert noch ein wenig. Bis dahin ist der Operator + für 2 Texte (char *) in C nicht definiert.

Danke an alle. Ich habe jetzt mehr vertsanden wie C mit Zeichenketten umgeht.

Ganz verstanden abe ich es aber noch nicht. Im folgenden Beispiel verstehe ich, dass buchstaben2 nur die 20 ersten Zeichen enthält. Aber warum enthält buchstaben5 nach dem strcat-Befehl alle Zeichen, obwohl buchstaben5 nur mit 10 Zeichen Länge definiert ist?

Liebe Grüße
Charlotte

char buchstaben1='A';
char buchstaben2=66;
char buchstaben3[20]="Das ist eine Zeichenkette";
char buchstaben4[30]="Das ist eine Zeichenkette";
char buchstaben5[10]="Test:";

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

Serial.println(buchstaben1);
Serial.println(buchstaben2);

Serial.println(buchstaben3);
Serial.println(buchstaben4);
Serial.println(buchstaben4[2]);

strcat(buchstaben5, buchstaben4);
Serial.println(buchstaben5);

}

void loop() {
  // put your main code here, to run repeatedly:

Weil Du in C/C++ problemlos über Arraygrenzen hinaus schreiben kannst.
Du überschreibst dann andere Bereiche im Speicher, was ganz verschiedene unplanmäßige Effekte haben kann.

In C/C++ bist Du selbst für die Einhaltung der Arraygrenzen verantwortlich.

Gruß Tommy