PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Uno + RFID Aktion halten bis zum nächsten Kontakt



blackzero23
04.10.2016, 11:11
Hallo,
ich sitzte seid gestern dran und versuche meinen NFC Sensor zu Programmieren.
Leider bin ich in der ganzen Sache noch recht neu und habe da noch so meine Probleme mit.

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);

// Ab hier erfolgt die erweiterung des Programms.

if (code==1232922) // Wenn der Zahlencode 1232922 lautet...

{ // Programmabschniss öffnen

digitalWrite (2, HIGH); // ...dann soll die LED an Pin 2 leuchten...

delay (2000); // für 5 Sekunden

digitalWrite (2, LOW); // … und danach wieder aus gehen.

} // Programmabschnitt schließen

} // Sketch abschließen
Diesen Code habe ich gestern im Internet gefunden, und er funktioniert echt super so weit.
Allerdings möchte ich jetzt gerne einen Sketch, der bewirkt, das die Led bei erkennen der
Karte an geht und solange an bleibt, bis das ich wieder die Karte drüber ziehe.
Jetzt bin ich auf eine Stoßschaltungsanleitung gestoßen und habe versucht das umzuschreiben,
aber ich denke das war wohl etwas zu einfach gedacht.

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}



void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);

// Ab hier erfolgt die erweiterung des Programms.

if (code==1232922) // Wenn der Zahlencode 1232922 lautet...

{ // Programmabschniss öffnen

if (2==LOW) {
digitalWrite(2, HIGH);
}

if (2==HIGH) {
digitalWrite(2, LOW);
}
} // Programmabschnitt schließen

// put your main code here, to run repeatedly:

}
Leider geht es damit auch nicht, und jetzt bin ich fürs erste mit meinem Latein am ende.
Ich weiß das da noch viel Arbeit und lernen hinter steckt, aber das Projekt würde ich doch gerne schnell abschließen.

Kann mir einer sagen was ich falsch mache???

MFG

Black Zero

i_make_it
04.10.2016, 12:57
Versuch mal das:


#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

int ledtogglestate = LOW; //Blink LED State


void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232922) // Wenn der Zahlencode 1232922 lautet...
{
if (ledtogglestate == LOW){
ledtogglestate = HIGH;
}else{
ledtogglestate = LOW;
}
}
digitalWrite(2, ledtogglestate);
}

} // Sketch abschließen


Immer Wenn die Kartennummer richtig ist, wird geprüft ob die Merkvariable für den LED Status LOW oder HIGH ist.
Und wird dann entsprechened umgeschaltet.
Danach wird die LED entsprechend gesetzt.

Ceos
04.10.2016, 13:00
wie du die LED an und aus schaltest hast du ja schon gezeigt.
WAs du jetzt noch brauchst ist eine zusätzliche Abfrage.


Wenn (Code korrekt) dann
Wenn (LED AN) dann LED AUS
sonst LED AN

blackzero23
04.10.2016, 13:22
Vielen lieben dank i_make_it, klappt super.
Ceos, das habe ich ja versucht:

if (2==LOW) {
digitalWrite(2, HIGH);
}

if (2==HIGH) {
digitalWrite(2, LOW);
}

Jetzt hatte ich meinen alten Sketch mit 3 verschiedenen Karten gehabt und 3 verschiedenen LED´s.


#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (3, OUTPUT); // Der Pin 3 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (4, OUTPUT); // Der Pin 3 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);

// Ab hier erfolgt die erweiterung des Programms.

if (code==1232922) // Wenn der Zahlencode 1232922 lautet...

{ // Programmabschniss öffnen

digitalWrite (2, HIGH); // ...dann soll die LED an Pin 2 leuchten...

delay (2000); // für 5 Sekunden

digitalWrite (2, LOW); // … und danach wieder aus gehen.

} // Programmabschnitt schließen

if (code==1232923) // Wenn der Zahlencode 1232923 lautet...

{ // Programmabschniss öffnen

digitalWrite (3, HIGH); // ...dann soll die LED an Pin 2 leuchten...

delay (2000); // für 5 Sekunden

digitalWrite (3, LOW); // … und danach wieder aus gehen.

} // Programmabschnitt schließen
if (code==1232924) // Wenn der Zahlencode 1232924 lautet...

{ // Programmabschniss öffnen

digitalWrite (4, HIGH); // ...dann soll die LED an Pin 2 leuchten...

delay (2000); // für 5 Sekunden

digitalWrite (4, LOW); // … und danach wieder aus gehen.

} // Programmabschnitt schließen

} // Sketch abschließen

Jetzt wollte ich deinen Teil aus dem Sketch kopieren, damit ich wieder alle 3 ansteuern kann mit verschiedenen Karten.

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

int ledtogglestate = LOW; //Blink LED State


void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (3, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (4, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232922) // Wenn der Zahlencode 1232922 lautet...
{
if (ledtogglestate == LOW){
ledtogglestate = HIGH;
}else{
ledtogglestate = LOW;
}
}
digitalWrite(2, ledtogglestate);


// Ab hier erfolgt die erweiterung des Programms.
if (code==1232923) // Wenn der Zahlencode 1232923 lautet...
{
if (ledtogglestate == LOW){
ledtogglestate = HIGH;
}else{
ledtogglestate = LOW;
}
delay(500);
}
digitalWrite(3, ledtogglestate);


// Ab hier erfolgt die erweiterung des Programms.
if (code==1232924) // Wenn der Zahlencode 1232924 lautet...
{
if (ledtogglestate == LOW){
ledtogglestate = HIGH;
}else{
ledtogglestate = LOW;
}
}
digitalWrite(4, ledtogglestate);
delay(500);

} // Sketch abschließen
Doch dann macht er erst die LED 2 an, dann mit Delay 3, danach mit Delay LED 4.
Wie kann ich das jetzt einstellen das ich jede LED mit einer anderen Karte ansteuern kann???

Ich habe übrigens noch ein Delay eingefügt, das ich danna uch Zeit habe die Karte zu entfernen.
Jedesmal wenn ich die Karte drüber gezogen habe ging die LED an/aus/an/aus bis das ich die Karte entfernt hatte.
Der Sketch sieht jetzt so aus:

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

int ledtogglestate = LOW; //Blink LED State


void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (3, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (4, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232922) // Wenn der Zahlencode 1232922 lautet...
{
if (ledtogglestate == LOW){
ledtogglestate = HIGH;
}else{
ledtogglestate = LOW;
}
}
digitalWrite(2, ledtogglestate);
delay(1000);
} // Sketch abschließen

MFG

Black Zero

Ceos
04.10.2016, 13:36
if (2==LOW)

ooooooookaaaaayyyy ... dir mangelt es wohl an Grundlagen :) nicht bös gemeint

die Begriffe LOW und HIGH sind in deinem Fall Enumerationen oder Makros, die Ziffer 2 damit zu vergleichen ist ungefähr so wie
if(affe==marmeladenbrotmithonig) und die zweite ist if(affe=marmeladenbrotohnehonig)

gaaaanz weit aus dem FEnster gelehnt würde ich das eher so schreiben


if(digitalRead(2)==LOW)


das ließt sich dann so
if(EinPinAnDerPosition[2]==LOW)

Du solltest dich eventuell noch ein wenig mehr mit der Materie des Programmierens generell beschäftigen :)

blackzero23
04.10.2016, 13:57
Ich gebe dir voll und ganz Recht Ceos, das es mir noch an den Grundlagen mangelt.
Ich habe das Board am Freitag erst bekommen, und muss noch einiges darüber lernen.
Ich versuche erstmal nur die Schaltung hin zu bekommen, da ich mit dieser Schaltung
ein Projekt was ich gerade bearbeite bewerkstelligen möchte.
Darum versuche ich ein Sketch zu bekommen, was meine Zwecke erfüllt.
Dieses Board werde ich dann auch direkt in Benutzung haben, aber mir morgen ein weiteres
Board bestellen, woran ich dann mit ein paar Tutorials auch dann mich weiter in die Materie einarbeiten werde.

Darum wäre es nett, wenn mir einer den Sketch so umschreibt, das ich alle 3 Karten nutzen kann und damit
verschiedene LED´s ansteuern kann.
Die LED´s sind Karte 1 in Digital 2, Karte 2 Digital 3 und Karte 3 Digital 4.
Hoffe das mir da einer bei helfen kann.

MFG

Black Zero

i_make_it
04.10.2016, 14:02
In meiner Modifikation Deines Scetchs ging es um eine LED
Also habe ich auch eine Merkvariable eingeführt.
int ledtogglestate = LOW; //Blink LED State

Bei drei verschiedenen LEDs muss man folglich auch die Zustände mit 3 Merkvariablen händeln.
int led1togglestate = LOW;
int led2togglestate = LOW;
int led3togglestate = LOW;

Da eine Variable die nur LOW und HIGH kennt nur die zwei Zustände einer LED darstellen kann.

Auch vergleiche ich nirgendswo den Zustand der Merkvariable mit einem Eingang.
Ich habe am Anfang die Variable definiert und den Startzustand festgelegt.
Danach wird ja nur noch der aktuelle Zustand der Merkvariablen verglichen und wenn er LOW ist auf HIGH gesetzt und umgekehrt.
Da der Programmteil immer nur aufgerufen wird wenn die Kartennummer stimmt, wird bei jedem richtigen Erkennen der Nummer einmal der Zustand gewechselt.
Wenn also das Lesegerät eine Karte beim Davor halten mehrfach einliest, dann Toggelt die LED auch dauernd.
Ein Delay an der Stelle ist allerdings nicht schön.
Der Programmteil macht ja das was er soll.
Eigentlich liegt die Baustelle beim Einlesen der Werte vom Kartenleser.
Dort kommt normalerweise eine Verriegelung rein.
Wird die Kartennummer erkannt, gibt man sie Weiter und speichert sie. Bei jeder neu eingelesenen Nummer wird diese mit der gespeicherten verglichen.
Sind sie identisch verwirft man den neuen Wert.
Damit ist es egal ob jemand die selbe Karte 2 Sekunden oder 10 Minuten vor den Sensor hält.
Das kannst Du mit einem starren Delay niemals hinbekommen.

blackzero23
04.10.2016, 14:18
Ich danke dir i_make_it.

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

int led1togglestate = LOW; //Blink LED State
int led2togglestate = LOW; //Blink LED State
int led3togglestate = LOW; //Blink LED State


void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (3, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
pinMode (4, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)

}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
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);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232922) // Wenn der Zahlencode 1232922 lautet...
{
if (led1togglestate == LOW){
led1togglestate = HIGH;
}else{
led1togglestate = LOW;
}
}
digitalWrite(2, led1togglestate);
delay(1000);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232923) // Wenn der Zahlencode 1232922 lautet...
{
if (led2togglestate == LOW){
led2togglestate = HIGH;
}else{
led2togglestate = LOW;
}
}
digitalWrite(3, led2togglestate);
delay(1000);
// Ab hier erfolgt die erweiterung des Programms.
if (code==1232924) // Wenn der Zahlencode 1232922 lautet...
{
if (led3togglestate == LOW){
led3togglestate = HIGH;
}else{
led3togglestate = LOW;
}
}
digitalWrite(4, led3togglestate);
delay(1000);
} // Sketch abschließen
Damit ist dann mein Problem endgültig gelöst, vielen dank für die nette Hilfe.

MFG

Black Zero

i_make_it
04.10.2016, 16:23
Schön wenn es klappt, aber wemn jemand mehr wie eine Sekunde hinhält taucht das Problem trotzdem auf.
Eventuell denkst Du noch mal über das nach was ich oben dazu geschrieben habe.
Das gibt dann eine 100% zuverlässige Lösung die Zeitunabhängig ist.

blackzero23
04.10.2016, 16:48
Wie gesagt fange ich jetzt gerade erst damit an und habe so noch keine großen Elektronischen Kenntnisse
und auch nur ein paar grundlegende Sachen damals mit HTML gelernt und kann nicht wirklich groß programmieren.
Da ich aber diese Schaltung für ein Projekt gerade brauche, war es mir wichtig, das ich jetzt zumindest
diesen Sketch zum laufen bekomme und er das tut was ich gerne von ihm möchte.

Klar ist es jetzt nicht die schönste Lösung, aber für meine Zwecke reicht es erstmal, das er danach noch eine
kurze Pause macht bis das er dann wieder den nächsten Chip ausließt oder halt den gleichen nochmal.

Ich denke wenn ich etwas tiefer in der Materie drin bin, werde ich es bestimmt nochmal umschreiben.

Aber bis dahin muss die Schaltung so erstmal reichen.

Besten Dank nochmal dafür.

MFG

Black Zero

i_make_it
04.10.2016, 17:37
Gut, solltest Du später die Zeit haben, kannst Du das machen ist auf jeden Fall robuster und eleganter.


Sollten es mehr als 3 Karten werden (viel mehr?) schreibt man den Code auch anders.
momentan kommt der ganze Codeblock ja für jede Kartnenummer einmal vor.
Das gibt bei mehr Karten einen immer größer werdenden Code.
Hier kann man zwei oder drei Arrays einführen.
Eins mit den Merkervariablen und eins mit den Kartennummern.
Dann werden die Kartennummern einmal oben fürs Array definiert und unten läuft dann eine Schleife durch die das Array abarbeitet.
Ein drittes Array um die Pins für die LEDs zu adressieren.
Bei einigen Compilern kann man den Index des Arrays nehmen und damit die Pins adressieren (vorrausgesetzt diese sind fortlaufend nummeriert).

blackzero23
04.10.2016, 17:46
In meinem Fall habe ich die Nummern halt hier im Forum durch andere ersetzt, da ich nicht weiß wie einfach die Nummern zu kopieren sind.
Eigentlich ist eine Steuerung von 2 Sachen geplant.
Die erste Karte soll später Relais steuern, womit ich dann ne Steckdosenleiste an und abschalten will.
Die ganze Steuerung soll dann in meinen Schreibtisch gebaut werden und dann ist es schwer bei Fertigstellung an die Steckdose ran zu kommen.
Darum habe ich mir das System ausgedacht.
Die zweite Steuerung soll dann einen Motor steuern, der dann eine kleine Rollade im Schreibtisch öffnet und dann nen Powerschalter vom PC frei gibt.
Darum sind zwei Module vollkommen ausreichend.

Und wie gesagt, ich werde mich da noch viel weiter einarbeiten.

MFG

Black Zero