RFID Probleme mit zurücksetzen des Codes

Hallo,
Ich habe ein problem bei meiner Programierung mit dem RFID Leser RC522.
Geplant habe ich mit dem RFID Scanner eine Arlarmanlage als kleines Spielchen für meine Zimmertür...
Ich bin gerade bei der programierung dabei und bin auf ein Problem gestoßen... Ich aktiviere meine Alarm anlage mit der RFID Karte... aber wenn die Arlarmanlage aktiviert ist. Hängt sie sich auf, wenn ich die Karte auslesen will.
Hier ist mein Skript:

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53 //SDA an Pin 53
#define RST_PIN 5 //RST an Pin 5
MFRC522 mfrc522(SS_PIN, RST_PIN); // RFID bennenen
int LEDrot = 10;
int LEDgruen = 8;
int LEDblau = 9;
int Sensor = 7; // Deklaration des Sensor-Eingangspin
int val; // Temporaere Variable
int speaker = 6;


void setup() 
{
  pinMode (speaker,OUTPUT);
  pinMode (Sensor, INPUT) ; // Initialisierung Sensorpin
  pinMode (LEDrot, OUTPUT);
  pinMode (LEDblau, OUTPUT);
  pinMode (LEDgruen, OUTPUT);
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  digitalWrite(LEDgruen,HIGH);
}



void loop() 
{
  if ( ! mfrc522.PICC_IsNewCardPresent())  //Karte erkennen und code schreiben...
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  long code=0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    code=((code+mfrc522.uid.uidByte[i])*10);
  }
  Serial.print("Die Kartennummer lautet: ");
  Serial.println(code); //...bis hier hin
  val = digitalRead (Sensor) ; // Das gegenwärtige Signal am Sensor wird ausgelesen
  
  if (code==557520)
  {
    digitalWrite(LEDgruen,LOW);
    for (int i = 0; i < 5; i++)
    {
      digitalWrite(LEDblau,HIGH);
      delay(500);
      digitalWrite(LEDblau,LOW);
      delay(500);
      code=0;
    }
    for (val == HIGH;val == LOW; val = digitalRead (Sensor))
    {
      digitalWrite(LEDrot,HIGH);
      val = digitalRead (Sensor) ; // Das gegenwärtige Signal am Sensor wird ausgelesen
      if (code==557520)
      {
        goto Ende;
      }
    }
    for (int i = 0; i < 10; ++i)
    {
      digitalWrite(speaker,HIGH);
      delay (500);
      digitalWrite(speaker,LOW);
      delay (500);
    }
    Ende:
    digitalWrite(LEDrot,LOW);
    digitalWrite(LEDgruen,HIGH);
    delay (5000);
  }
}

Ich hoffe auf Hilfe bei meinem Projekt... :upside_down_face:
LG LupinWeb

Was genau willst du damit bewirken ?

Diese Zeile soll bewirken, dass er in der for Schleife bleibt is das Reed relai geöfnett ist...
Also kein Magnet am Relai ist.
Was anderes ist mir nicht eingefallen...
Hättest du einen Tip, wie ich das verbessern kann ???
LG LupinWeb

Im prenzip habe ich probleme mit dem Teil:

for (val == HIGH;val == LOW; val = digitalRead (Sensor))
    {
      digitalWrite(LEDrot,HIGH);
      val = digitalRead (Sensor) ; // Das gegenwärtige Signal am Sensor wird ausgelesen
      if (code==557520)
      {
        goto Ende;
      }

da ich die Karte lesen muss bevor ich sagen kann, dass er zum "Ende" gehen soll wenn der code 557520 ist. Aber wenn ich einfach die Sachen von oben übernehme:

for (val == HIGH;val == LOW; val = digitalRead (Sensor))
    {
      digitalWrite(LEDrot,HIGH);
      val = digitalRead (Sensor) ; // Das gegenwärtige Signal am Sensor wird ausgelesen
bc:
if ( ! mfrc522.PICC_IsNewCardPresent())  //Karte erkennen und code schreiben...
  {
    goto bc;
  }
ab:
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    goto ab;
  }
  long code=0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    code=((code+mfrc522.uid.uidByte[i])*10);
  }
      if (code==557520)
      {
        goto Ende;
      }
    }

Hängt er sich bei dem

if ( ! mfrc522.PICC_IsNewCardPresent())  //Karte erkennen und code schreiben...
  {
    goto bc;
  }

auf...

Wen ich aber anstat dem goto vor die Schleife return schreibe geht er zum anfang dem void loop.
Ich hoffe das hat geholfen meine Situation zu verstehen...
Hoffe auf antworten
LG LupinWeb

Eine for-Schleife ist generell schlecht, da blockierend.
Bau das besser mit einer if-Abfrage auf.
Auch goto ist nicht gerade optimal. Kann man machen, aber besser ist es ohne.

DATEI - VOREINSTELLUNGEN

grafik

Dann kommt auch das hier bei Dir zur Anzeige:

/tmp/arduino_modified_sketch_162704/sketch_jun08a.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_162704/sketch_jun08a.ino:58:14: warning: statement has no effect [-Wunused-value]
     for (val == HIGH; val == LOW; val = digitalRead (Sensor))

Leider fehlt in Deinem Code vollständig, was Du an welcher Stelle erwartest.
Ich kann nicht erraten, was das sensor ist und was da tatsächlich passieren soll.

Willst Du mit dem RFID einmal "scharf" und einmal "unscharf" stellen?
Was soll der inputPin dazu noch machen? Oder ist das etwa ein Türkontakt, der als AlalrmAuslöser dient?

Der InputPin ist wie du gesagt hast einfach nur um fest zu stellen ob die Tür offen (LOW) oder zu (HIGH) ist.

Was ich erwarte ist, dass wenn ich die RFID Karte an das lesegerät halte, dass die Alarm-Anlagen aktiviert ist. Wenn man nun in dießem Status durch die Tür geht fängt ein Speaker an zu Pipsen...

Bis hierhin funktioniert alles einbahnfrei.

Doch meine Forstellung ist, dass ich nun die Karte nochmal an den Leser halten kann und nun die Alarm-Anlage deaktiviert ist. In dem Status kann ich dann, ohne das der Speaker anfängt zu Piepsen, durch meine Tür gehen... Die LEDrot, gruen und blau sind nur für die Symbolisierung der Angeschalteten/Ausgeschalteten Alarm-Anlage zuständig.

Entschuldigung für die fehlenden informationen...
LG LupinWeb

1 Like

Ja.
Das ist eine Warnung.
Die sagt, das der Code dort keinen Effekt hat.
In späteren Versionen könnte das als Fehler interpretiert werden und dann wird der Controller nicht mehr bespielt...

Im Übrigen bist Du der erste der sie zu mir sagt.... Tu's nicht. Das fühlt sich noch älte ran, als ich schon bin. :wink:

Entschuldigung :upside_down_face:
Mit was sollte ich den die For Schleife am besten ersetzen ???

Wenn ich den Code ein bisschen umendere kann ich dei AA auch deaktivieren nur hatt der Tür-Status keinen Effekt mehr...

btw. vor knapp einem halben jahr habe ich genau das gleiche nicht mit RFID sondern mit BlueTooth gemacht und hatt funktioniert...

Las mir mal nen Moment - ich bin grad dabei das zu entwirren....

:+1:

Probier mal, ob der die LED's richtig leuchten lässt.
BLAU -> ZU -> Alarmbereitschaft
ROT -> ALARM -> nur wenn mit dem RFID vorher auf ZU gestellt war
GRUEN -> Offen -> Es darf auch kein Alarm ausgelöst werden.

Ich hab absichtlich auf serielle Ausgaben verzichtet - wenns nicht geht, muss ich schaun. (Ich schreib das "blind" - also ohne es testen zu können) - es kompiliert aber fehler udn warnungsfrei:

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53 //SDA an Pin 53
#define RST_PIN 5 //RST an Pin 5
MFRC522 mfrc522(SS_PIN, RST_PIN); // RFID bennenen
const byte LEDrot = 10;
const byte LEDgruen = 8;
const byte LEDblau = 9;
const byte Sensor = 7; // Deklaration des Sensor-Eingangspin
const byte  speaker = 6;

int val; // Temporaere Variable

const bool auf = true;        // Vorgabe für Auswertung
const bool zu = !auf;         // ist das Gegenteil :)
bool zustand = zu;            // Festlegung Startzustand
unsigned int zustandStartZeit;// Merker, wann der Status sich geändert hat

const bool alarm = HIGH;      // Zustand des Sensor PIN auf den der Alarm ausgelöst wird
bool alarmStatus = !alarm;    // Merker - voreingestellt auf kein Alarm
unsigned long alarmStartZeit; // Zeitvariable wann ausgelöst wurde


void setup()
{
  pinMode (speaker, OUTPUT);
  pinMode (Sensor, INPUT) ; // Initialisierung Sensorpin
  pinMode (LEDrot, OUTPUT);
  pinMode (LEDblau, OUTPUT);
  pinMode (LEDgruen, OUTPUT);
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  digitalWrite(LEDgruen, HIGH);
}

void loop()
{
  if (!mfrc522.PICC_IsNewCardPresent())  //Karte erkennen und code schreiben...
  {
    return;
  }
  if (!mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  long code = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    code = ((code + mfrc522.uid.uidByte[i]) * 10);
  }
  Serial.print(F("Die Kartennummer lautet: "));
  Serial.println(code); //...bis hier hin
  if (code == 557520)
  {
    zustand = !zustand;  // auf oder zu - mit jedem Wechsel....
    zustandStartZeit = millis(); // wird später gebraucht
  }
  if (zustand == zu)
  {
    if (digitalRead(Sensor) == alarm)
    {
      digitalWrite(LEDrot, HIGH);
      digitalWrite(LEDgruen, LOW);
      digitalWrite(LEDblau, LOW);
    }
    else
    {
      digitalWrite(LEDrot, LOW);
      digitalWrite(LEDgruen, LOW);
      digitalWrite(LEDblau, HIGH);
    }
  }
  else
  {
    digitalWrite(LEDrot, LOW);
    digitalWrite(LEDgruen, HIGH);
    digitalWrite(LEDblau, LOW);
  }
}

Wenn der geht, dann machen wir das mit blinken und hupen. :wink:
UND ACHTE DRAUF: Ich hab den alarmpin mit HIGH ausgerwertet, da ich nicht weiss, wie der angeschlossen udn verdrahtet ist.... Die Stelle findest Du ganz oben - kommentiert....

Geht aber die Leuchte blinkt mehrmals schnell hintereinander, wenn ich die Karte an den Leser halte. Was soll ich jetzt machen ???
:upside_down_face:

Ja. In der Initialisierung eine Zuweisung an Stelle eines Vergleichs zu benutzen.

for (val = HIGH; val == LOW; val = digitalRead (Sensor))

Was mich aber an deiner Logik zweifeln lässt,
weil dann das for überhaupt nicht ausgeführt würde, da HIGH nicht LOW ist.

Ausführen tut er es auch nicht... War ein logig fehler...

Der code den ich geschrieben habe taugt nichts... ich glaube ich bin falsch und ohne die richtigen vorkenntnisse an die sache ran gegangen.

Variante 1: daraus weiterentwickeln, da der Grundstock steht
Variante 2: warten bis sich jemand erbarmt und da weiter macht
2.a: Ich setz mich später ran und bau Dir da was. - Aber wirklich erst später.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.