Mit einem RFID eine LED ein - und ausschalten

Hallo Leute,
ich arbeite seit zwei Tagen an einem Code und komme einfach zu keinem Ergebnis. Ich schaffe es eine LED mit RFID einzuschalten, was ziemlich einfach ist, aber ich schaffe es einfach nicht mit dem gleichen RFID die LED auszuschalten. Hoffentlich kriege ich hier ein paar Denkanstösse, die ich vorantreiben. Mein Code mit LED einschalten sieht wiefolgt aus:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bibliotheken
#include <SPI.h>                                          // SPI-Bibliothek hinzufügen
#include <MFRC522.h>                               // RFID-Bibliothek hinzufügen
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Definitionen
#define SS_PIN 10                                         // SDA an Pin 10
#define RST_PIN 9                                         // RST an Pin 9
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Global
byte RFID_UID [] = {0xF6, 0x26, 0xF2, 0x30};
int Test_LED = 2;
bool RFID_Kontrolle = false;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Setup
void setup ()
{
  //RFID
  SPI.begin ();                                                 // SPI-Verbindung aufbauen
  mfrc522.PCD_Init ();                                    // Initialisierung des RFID-Empfängers

  pinMode (Test_LED, OUTPUT);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Loop
void loop ()
{
  mfrc522.PICC_IsNewCardPresent ();                       // Ist eine Karte präsent?
  mfrc522.PICC_ReadCardSerial ();                           // Konnte diese Karte eingelesen werden?

  // eingelesene UID vergleichen mit RFID_UID
  RFID_Kontrolle = true;
  for (int i=0; i<4; i++)
  {
    if (mfrc522.uid.uidByte [i] != RFID_UID [i])
    {
      RFID_Kontrolle = false;
    }
  }
  
  if (RFID_Kontrolle)
  {
    digitalWrite (Test_LED, HIGH);
  }
}

Danach habe ich folgendes geändert:
Ganz oben vor dem Setup: int Status = 0;
und im Loop:

if (RFID_Kontrolle && Status == 0)
 {
   digitalWrite (Test_LED, HIGH);
   Status = 1;
 }

 if (RFID_Kontrolle && Status == 1)
 {
   digitalWrite (Test_LED, LOW);
   Status = 0;
 }

Problem: Die LED bleibt immer aus.
Dann habe ich was im Internet gefunden, dass man mit Invertierungen arbeiten muss, das habe ich auch probiert. Wenn die LED an ist, dann soll ein Wert invertiert werden und so weiter. Ungelogen, ich habe in zwei Tagen bestimmt 30 verschiedene Versionen durch, nichts klappt.

Mal blinkt die LED die ganze Zeit an und aus, mal ist sie die ganze Zeit aus, mal die ganze Zeit an, nur das was ich will passiert nicht. Bei einem draufhalten = an, bei einem weiteren drauf halten = aus. Ich bin am Ende mit meinem Latein.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hallo,
diese Funktion kannte ich nicht im Forum, habe es jetzt nachträglich geändert.

Code-Tags sind wichtig, hat Tommy schon geschrieben.
Soweit sieht das doch gut aus, aber warum zeigst du nicht, wie der Sketch zusammen gebaut aussieht.
Nur so können wir sehen, wo du den Fehler machst.

Es klappt einfach nicht, ich werde nicht schlau daraus.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bibliotheken
#include <SPI.h>                                                 // SPI-Bibliothek hinzufügen
#include <MFRC522.h>                                      // RFID-Bibliothek hinzufügen
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Definitionen
#define SS_PIN 10                                               // SDA an Pin 10
#define RST_PIN 9                                              // RST an Pin 9
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


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


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Global
byte RFID_UID [] = {0xF6, 0x26, 0xF2, 0x30};
int Test_LED = 2;
bool RFID_Kontrolle = false;
int Status = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Setup
void setup ()
{
  //RFID
  SPI.begin ();                                                 // SPI-Verbindung aufbauen
  mfrc522.PCD_Init ();                                    // Initialisierung des RFID-Empfängers

  pinMode (Test_LED, OUTPUT);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Loop
void loop ()
{
  mfrc522.PICC_IsNewCardPresent ();                       // Ist eine Karte präsent?
  mfrc522.PICC_ReadCardSerial ();                           // Konnte diese Karte eingelesen werden?

  // eingelesene UID vergleichen mit RFID_UID
  RFID_Kontrolle = true;
  for (int i=0; i<4; i++)
  {
    if (mfrc522.uid.uidByte [i] != RFID_UID [i])
    {
      RFID_Kontrolle = false;
    }
  }
  
  if (RFID_Kontrolle && Status ==0)
  {
   digitalWrite (Test_LED, HIGH);
   Status = 1;
  }
  
  if (RFID_Kontrolle && Status == 1)
  {
   digitalWrite (Test_LED, LOW);
   Status = 0;
  }
}

Warum prüfst du die RFID auf false und nicht auf true ?

Ich habe mir da folgendes gedacht. Wenn der Chip, den ich habe, nicht der richtige Chip ist, dann soll er mir melden, dass die RFID_Kontrolle "false" gewesen ist. Diese Schleife macht er solange, bis RFID_Kontrolle "true" ist, deshalb prüfe ich das. Erst wenn der richtige Chip vorgehalten wird, dann erst geht er unten in die If-Abfragen, vorher nicht.

Ok,nur dann musst du in deiner for-Schleife in der if Abfrage ein else setzen und den Zustand auf true setzen. Ohne dem wird es da nicht mehr true.

Alles entsprechende geändert, aber LED bleibt aus, egal wie oft ich den Chip dran halte.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bibliotheken
#include <SPI.h>                                          // SPI-Bibliothek hinzufügen
#include <MFRC522.h>                                      // RFID-Bibliothek hinzufügen
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Definitionen
#define SS_PIN 10                                         // SDA an Pin 10
#define RST_PIN 9                                         // RST an Pin 9
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



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



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Global
byte RFID_UID [] = {0xF6, 0x26, 0xF2, 0x30};
int Test_LED = 2;
bool RFID_Kontrolle = false;
int Status = 0;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Setup
void setup ()
{
  //RFID
  SPI.begin ();                                           // SPI-Verbindung aufbauen
  mfrc522.PCD_Init ();                                    // Initialisierung des RFID-Empfängers

  pinMode (Test_LED, OUTPUT);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Loop
void loop ()
{
  mfrc522.PICC_IsNewCardPresent ();                       // Ist eine Karte präsent?
  mfrc522.PICC_ReadCardSerial ();                         // Konnte diese Karte eingelesen werden?

  // eingelesene UID vergleichen mit RFID_UID
  RFID_Kontrolle = true;
  for (int i=0; i<4; i++)
  {
    if (mfrc522.uid.uidByte [i] != RFID_UID [i])
    {
      RFID_Kontrolle = false;
    }
    else
    {
      RFID_Kontrolle = true;
    }
  }
  
  
  
  if (RFID_Kontrolle && Status == 0)
  {
    digitalWrite (Test_LED, HIGH);
    Status = 1;
  }



  if (RFID_Kontrolle && Status == 1)
  {
    digitalWrite (Test_LED, LOW);
    Status = 0;
  }
}

Dann setze mal ein paar serielle Ausgaben auf den Monitor rein, damit du sehen kannst, ob auch richtige Daten genutzt werden.

Die If-Abfragen ganz unten, da ist der Fehler drin. Ich habe recherchiert im Internet, habe was gefunden "toggle LED", dann irgendwie drei Variablen, eine für alten Status, eine für neuen Status und eine für toggle. Wie gesagt, sitzte seit zwei Tagen dran, habe 20 verschiedene Versionen durch und gar nichts klappt. Entweder geht die LED gar nicht an, oder sie geht an und nicht mehr aus, oder sie blinkt an und aus.

if (RFID_Kontrolle && Status == 0) {

digitalWrite (Test_LED, HIGH);
  Status = 1;
}

if (RFID_Kontrolle && Status == 1) {
  digitalWrite (Test_LED, LOW);
  Status = 0;
}

Sollte doch ziemlich klar sein, dass Status "nicht lange" :slight_smile: auf 1 bleibt, oder?

Du willst vermutlich sowas wie:

if (RFID_Kontrolle) {
  Status = ! Status; // Status umschalten
  digitalWrite (Test_LED,Status);
  RFID_Kontrolle = false; // ??? 
         // so genau habe ich den Rest nicht angeschaut, 
         // wie soll  das nur einmal bei neuer Karte erfolgen?
}

Im unteren Teil ist es nur teilweise falsch.
Da rennt es zu schnell durch.

Setze doch auch hier ein else im zweiten Teil davor, dann müsste es gehen.

Dennoch, der Hauptfehler war das fehlende else oben.

Ich hab es. Der Fehler war glaube ich das Erwähnte "zu schnell" für meine Augen. Ich habe mfrc522.PICC_HaltA(); hinzugefügt. Damit liest er die Karte nur einmal.

Der Code sieht jetzt so aus und es klappt:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bibliotheken
#include <SPI.h>                                          // SPI-Bibliothek hinzufügen
#include <MFRC522.h>                                      // RFID-Bibliothek hinzufügen
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Definitionen
#define SS_PIN 10                                         // SDA an Pin 10
#define RST_PIN 9                                         // RST an Pin 9
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



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



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Global
byte RFID_UID [] = {0xF6, 0x26, 0xF2, 0x30};
int Test_LED = 2;
bool RFID_Kontrolle = false;
int LED_Status = 0;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Setup
void setup ()
{
  //RFID
  SPI.begin ();                                           // SPI-Verbindung aufbauen
  mfrc522.PCD_Init ();                                    // Initialisierung des RFID-Empfängers

  pinMode (Test_LED, OUTPUT);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Loop
void loop ()
{
  mfrc522.PICC_IsNewCardPresent ();                       // Ist eine Karte präsent?
  mfrc522.PICC_ReadCardSerial ();                         // Konnte diese Karte eingelesen werden?

  // eingelesene UID vergleichen mit RFID_UID
  RFID_Kontrolle = true;
  for (int i=0; i<4; i++)
  {
    if (mfrc522.uid.uidByte [i] != RFID_UID [i])
    {
      RFID_Kontrolle = false;
    }
  }

  if (RFID_Kontrolle && LED_Status == 0)
  {
    digitalWrite (Test_LED, HIGH);
    LED_Status = 1;
    mfrc522.PICC_HaltA();
  }
  else
  {
    if (RFID_Kontrolle && LED_Status == 1)
    {
    digitalWrite (Test_LED, LOW);
    LED_Status = 0;
    mfrc522.PICC_HaltA();
    }
  }
}

Mit deinen Augen hat das sicher nichts zu tun, da ich noch keine seriellen Ausgaben sehe, auf den du etwas sehen kannst.

Ok, dann lag es an dem "else". Vielen lieben Dank für die schnellen Antworten, vielen Dank, dass es dieses Forum gibt, Danke an alle. Ihr werdet bestimmt noch ab und zu das Vergnügen mit mir haben. Ich habe mich auch gar nicht vorgestellt. Mache im Moment den staatlich geprüften Techniker im Elektrotechnik, bin nicht ganz Neuling, was Arduino angeht, aber ab und zu kriege ich etwas nicht hin.

noiasca:
nö, gelöst hast du es mit dem hinzugekommenen else.

Aber kann es auch damit zu tun haben, dass ich diesen Extrabefehl noch reingetan haben. Ohne diesen Befehl liesst er andauernt den Chip ohne Pause, aber ich bin kein Experte, wenn du (Sie) sagst (sagen), dass es an dem "else" liegt, dann nehme ich das so auf und achte in Zukunft darauf.

noiasca:
ein staatlich geprüfter Techniker hat in diesem Sketch aber noch vieles zu tun! Z.B.:

  • defines durch Konstante Variablen ersetzen
  • const machen was sich nicht ändern soll
  • richtige Variablengrößen verwenden
  • STRG-T zum formierten drücken

Ich bin seit einem Jahr dabei erst und Programmieren ist einer meiner Schwächen, ich hab da irgendwie Probleme mit. Wie kann ich die defines anders ausdrücken? Ich sehe halt überall im Internet, dass define oft gebraucht wird. Ist in meinem Code etwas was sich nicht ändern soll. Gibt es Variablengrößenfehler? Das wäre echt cool, wenn du den Code korrigieren würdest, ich weiss nicht, wo welcher von dir aufgeführte Punkt in meinem Code vor kommt.

(deleted)