Forum: Mikrocontroller und Digitale Elektronik Arduino Code Erklärung RFID


von Jürgen_2310 (Gast)


Lesenswert?

Hallo zusammen!
Bin ein relativer Neuling in der Arduino Materie, habe aber schon einige 
Bücher zur Hardware und dem Programmieren mit der IDE gelesen. Ich würde 
gerne einen Türzugangschutz mit RFID bauen (natürlich will ich das 
erstmal nicht wirklich in eine tür einbauen, weil zu unsicher und viel 
Aufwand etc., will erstmal den Aarduino und RC522 RFID Reader zum laufen 
bekommen). Dazu habe ich mir einen Code aus dem Internet für diesen 
Zweck geladen, den ich erstmal nachvollziehen will. Dazu dieser Link:
http://www.duinos.net/files/2015/rfid_lock.ino
Soweit verstehe ich das auch alles, habe auch das Video des Autors dazu 
geschaut, nur folgende Passagen geben mir Rätsel auf:
1
void dump_byte_array(byte *buffer, byte bufferSize) {
2
    read_rfid="";
3
    for (byte i = 0; i < bufferSize; i++) {
4
        read_rfid=read_rfid + String(buffer[i], HEX);

Hier wird ja eine Funktion erstellt, die die ausgelesenen Werte als HEX 
Zahl speichert(?), nur: Wie funktioniert das?

und
1
    // Look for new cards
2
    if ( ! mfrc522.PICC_IsNewCardPresent())
3
        return;
4
5
    // Select one of the cards
6
    if ( ! mfrc522.PICC_ReadCardSerial())
7
        return;

Zunächst sind das ja zwei if Operatoren, dazu folgende Fragen:

Was bedeutet das Ausrufezeichen in den Bedingungen?

Was bringen diese if Operatoren in diesem Fall?(Es ist ja nichts 
angegeben, was passieren soll, wenn die Bedingung erfüllt oder eben 
nicht erfüllt ist (keine {} nach der Bedingung), oder etwa doch?). Laut 
Kommentaren soll ja die erste quasi etwas tun, wenn eine RFID Karte da 
ist nehme ich mal an, die zweite vermutlich selbige dann auslesen bzw. 
auswählen (wie auch das mit einer if Konstruktion gehen soll...), oder?

Was bedeutet das return?(Gibt das nicht am Ende einer Funktion einen 
Wert zurück und steht hier nur formhalber, weil nichts zurückgegeben 
wird?

Ich wäre sehr dankbar, wenn jemand hier mir das erklären könnte bzw. 
einfach diese Passagen verständlich kommentieren könnte!

von Elektroniker 3.Lehrjahr (Gast)


Lesenswert?

Jürgen_2310 schrieb:
> und
>     // Look for new cards
>     if ( ! mfrc522.PICC_IsNewCardPresent())
>         return;
>
>     // Select one of the cards
>     if ( ! mfrc522.PICC_ReadCardSerial())
>         return;
>
> Zunächst sind das ja zwei if Operatoren, dazu folgende Fragen:
>
> Was bedeutet das Ausrufezeichen in den Bedingungen?

Das Ausrufezeichen ist eine Invertierung. So wie ich den Code mit dem 
Kommentar verstehe wird zuerst eine Abfrage durchgeführt ob eine neue 
Karte vorhanden ist. Ist dies der Fall geht der Code unten 
weiter...ansonsten geht es in die Schleife und macht einen return.

Bei der zweiten If wird ja eine Karte ausgewählt. Ich könnte mir 
vorstellen dass er die verschiedenen Karten durchtestet und immer wenn 
es nicht die vorgegebene Karte ist, passiert der Return in der Schleife. 
Ist die richtige Karte ausgewählt geht es im Code weiter.

So würde ich den Code interpretieren.

Gruss und viel Spass

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jürgen_2310 schrieb:
> for (byte i = 0; i < bufferSize; i++) {
>         read_rfid=read_rfid + String(buffer[i], HEX);
>
> Hier wird ja eine Funktion erstellt, die die ausgelesenen Werte als HEX
> Zahl speichert(?), nur: Wie funktioniert das?

 Uninteressant, macht der Compiler, eine Zahl wird in ein String
 umgewandelt, kann auch BIN oder DEC anstatt HEX stehen.

> und
> Zunächst sind das ja zwei if Operatoren, dazu folgende Fragen:
>
> Was bedeutet das Ausrufezeichen in den Bedingungen?
 NOT (nicht) - Invertierung.

Jürgen_2310 schrieb:
> Ich wäre sehr dankbar, wenn jemand hier mir das erklären könnte bzw.
> einfach diese Passagen verständlich kommentieren könnte!
1
     // Look for new cards
2
     if ( ! mfrc522.PICC_IsNewCardPresent())
3
         return;

 Wenn keine neue Karte in der Nähe ist, gehe gleich zurück, die nächste
 IF-Abfrage ist sowieso nicht wahr.

1
     // Select one of the cards
2
     if ( ! mfrc522.PICC_ReadCardSerial())
3
         return;

 Eine Karte gefunden, wenn die Karte nicht gelesen werden kann, gehe
 gleich zurück, ansonsten geht es mit Programm weiter.

 P.S.
 Irgendwie fehlt da der Flag für ungültige/nicht lesbare Karten...

: Bearbeitet durch User
von Jürgen_2310 (Gast)


Lesenswert?

Vielen Dank erstmal! Jetzt erscheint mir das auch logisch ;)

Elektroniker 3.Lehrjahr schrieb:
> Bei der zweiten If wird ja eine Karte ausgewählt. Ich könnte mir
> vorstellen dass er die verschiedenen Karten durchtestet und immer wenn
> es nicht die vorgegebene Karte ist, passiert der Return

Das return steht also (in diesem Fall) nicht für einen Rückgabewert, 
sondern für eine Wiederholung, falls die Bedingung nicht erfüllt ist? 
Und kann dann auch außerhalb geschweifter Klammern stehen?

von Wolfgang (Gast)


Lesenswert?

Jürgen_2310 schrieb:
> Was bedeutet das Ausrufezeichen in den Bedingungen?

Das ist ein unärer Operator u.a. in der Programmiersprache C.
https://en.wikibooks.org/wiki/C_Programming/Reference_Tables#Table_of_Operators

von Jürgen_2310 (Gast)


Lesenswert?

Wolfgang schrieb:
> Das ist ein unärer Operator u.a. in der Programmiersprache C.
> https://en.wikibooks.org/wiki/C_Programming/Refere...

Okay nochmals Danke dafür, auch für den Link, habe nämlich schon auf der 
Arduino IDE Referenz Website geschaut, aber nichts gefunden (oder falsch 
gesucht...).

von Frank-Ferdinand Fogel (Gast)


Lesenswert?

Jürgen_2310 schrieb:
> habe nämlich schon auf der
> Arduino IDE Referenz Website geschaut, aber nichts gefunden (oder falsch
> gesucht...).

https://www.arduino.cc/en/Reference/HomePage
https://www.arduino.cc/en/Reference/Boolean

von Jürgen_2310 (Gast)


Lesenswert?

Frank-Ferdinand Fogel schrieb:
> https://www.arduino.cc/en/Reference/HomePage
> https://www.arduino.cc/en/Reference/Boolean

Danke. Ich habe nur das Suchfeld auf der Arduino.cc Website bemüht und 
das hat nichts gefunden, daher ging ich davon aus, dass es das da nicht 
gibt... Auf die Idee selber zu suchen bin ich gar nicht gekommen ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.