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...
LG LupinWeb
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
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.
/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
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.
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.
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....
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.