#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.
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.
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
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.
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
}
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.