Gartentor mittels RFID öffnen, Status

Moin zusammen o/

Nachdem ich ja nun schon ein paar mal nach gewissen Sachen gefragt habe, hier nun ein konkretes Statusupdate zu dem Projekt "Gartentor mittels RFID öffnen".

Grundsätzlich habe ich mich erstmal an die Arbeit eines tollen Menschen gehalten da ich es selber so sicher nie hinbekommen hätte Door Lock RFID . Dafür sind die 6 Wochen die ich bisher mit dem Arduino verbracht habe wohl auch etwas wenig :slight_smile:

In meinem Fall sieht die Situation wie folgt aus: Ich habe vor zwei Jahren aus alten Bahnschwellen und Stabmatten meinen Gartenzaun gebaut. Alles schön aufgearbeitet, Fundament gegossen, Bahnschwellen halbiert und als Pfosten eingesetzt, Stabmatten dazwischen, fertig. Sieht hübsch aus und bietet in den Schwellen reichlich Platz für etwaige Installationen. Die erste ist nun besagte Schließanlage. Nachdem ich den Code etwas modifiziert habe um ihn für meine Zwecke anzupassen und die ganze Technik voll verkabelt in Plastikzigarettenschachtel gepackt habe, ging es daran den Raum in der Bahnschwelle zu schaffen. Also mit Fuchsschwanz und einem Sägedraht eine Scholle herrausgesägt, diese fungiert jetzt als Deckel um eine möglichst geschlossene Optik zu erhalten, mit derr Oberfräse, Forstnerbohrern und Stechbeitel ein ausreichend großes Loch ausgearbeitet, mit sehr langen Bohrern (glaubt mir: 50cm reicht dafür noch lange nicht ^^) einen Kanal zur Sohle geschaffen und Strom hineingelegt und letztlich die ganze Installation verbaut. Und welch Überraschung: meine Laienarbeit ist funktionabel \o/

![](http://

)

Kurzes Vine

Nun dachte ich mir "der kleine Nano hat doch noch genügend Speicher und das Netzteil auch noch ausreichend Leistung. Was machen wir daraus jetzt noch?"
Zur Erklärung: Ich habe auf der Suche nach einem passenden Netzteil letztlich in den Untiefen meiner Bastelschränke ein altes PlayStation 2 Netzteil mit 8,5V und 5,56A gefunden. Bietet sich an da der verbaute E-Schließer zw. 6 und 12V zu betreiben ist, ähnlich wie der verbaute Nano, aber 1,6A benötigt. Das ist so viel das die Standard Bastelnetzteile die man normal so in die Hände bekommt leider nicht im Ansatz soviel Leistung haben. In meinem Fall habe ich die ganzen Testinstallationen mit alten Handynetzteilen geprüft... da hört es irgendwo zw 0,8 und 1,2A auf.
Ich entschloss mich nun also die restliche Leistung zu nutzen und habe mich auf eine kleine Wegbeleuchtung festgelegt. Nicht so eine riesige mit der man das halbe Grundstück beleuchtet sondern so ca 40 LEDs die einfach dafür sorgen sollen das ich Nachts nach der Spätschicht überhaupt etwas sehe. Diese steuere ich nun, in Kombination mit einem Fotowiderstand über ein Zweites Relais an. Funktioniert auch grundsätzlich nur bringt es ein kleines Problem mit sich: der Arduino kann kein Multithreading. Heißt: Wenn die Tür aufgeht sollen, bei entsprechenden Lichtverhältnissen, die LEDs mit angehen. Tun sie auch nur muss ich dann warten bis sie wieder aus sind, der Teil des Programms also durchlaufen ist, ehe ich die Tür erneut öffnen kann. Etwas ungünstig wenn man mal nicht schnell genug ist.

Und das ist jetzt der Punkt wo ich euch bitten möchte mir mit einer zündenden Idee unter die Arme zu greifen. Wie bekomme ich es gelöst das beides "zeitgleich" funktioniert? Delay entfällt ja logischerweise, also bin ich jetzt bei millis().

void granted (int setDelay) {
digitalWrite(blueLed, LED_OFF); // Turn off blue LED
digitalWrite(redLed, LED_OFF); // Turn off red LED
digitalWrite(greenLed, LED_ON); // Turn on green LED

digitalWrite(relay, LOW); // Unlock door! //////////////////////////////////////////////////////////
delay(3000); // Hold door lock open for given seconds
digitalWrite(relay, HIGH); // Relock door
delay(1000); // Hold green LED on for a second


int sensorVal = analogRead(7)/4;

if (sensorVal < 220) {
while ( milli2-milli1 >5) {
milli1 = millis();
milli2 = milli1;
digitalWrite(relayLED, LOW);
}

digitalWrite(relayLED, HIGH);
}

}

Das scheint aber irgendwie auch nicht die Lösung zu sein. Wo liegt hier mein Denkfehler?

Liebe Grüße,

-mahlwerkende-

Ups, der Link ist kaputt.... dann hier nochmal Kurzes Vine

Hallo,

schönes Projekt, nur hier an der Stelle viel zu viel Text um das Problem herum. Verwirrt eher. Leider.
Wenn das fertig ist und alles läuft, kannste das gern komplett mit so vielen Bildern und Text wie du möchtest hier reinstellen. Zeigt her eure geilen Projekte! - Deutsch - Arduino Forum

Was du und wir benötigen ist der komplette Code, wir wissen nicht was millis1 und millis2 sind.
Und dann müßtest du uns noch sagen was wie genau ablaufen soll. Eine Art Ablaufplan der Steuerung. Wenn der gründlich ausgearbeitet ist, ist das meistens schon die halbe Miete. Entweder für einen selbst oder mit noch paar Hinweisen vom Forum.
grobes Bsp. Taster wird gedrückt, Tor soll geöffnet werden, gleichzeitig soll Licht angehen, Licht soll wegen Grund xyz wieder ausgehen usw.

Edit:
den Code vorm posten bitte nochmal durchgehen und so gut es geht kommentieren was er an der Stelle eigentlich machen soll laut deinen Gedanken. Den Code dann in Code Tags setzen, oben links </> Symbol oder falls zu lang die .ino Datei anhängen.

Dein Codeausschnitt oben kannste noch nachträglich in Code Tags setzen. Damit bleibt die Formatierung erhalten und ist besser lesbar.

Oh, ok.... Ich dachte das man vielleicht gern mal sehen mag was andere so basteln.... den anderen Thread kannte ich einfach nicht. Werds mir für die Zukunft merken :slight_smile:

Im Anhang der Sketch. Ich weiß leider nicht wie ich den Code hier blank poste, deswegen die *.ino .

Tun soll es genau ein was: Wenn die passende Karte gescannt wird und es dunkel ist, soll Licht angehen, nach bspw. 2min geht das Licht allein wieder aus. Das allein ist nicht weiter schwer nur bekomme ich es nicht hin den Scanvorgang vom Licht zu entkoppeln. Sprich: wenn passende Karte und dunkel dann für Zeit X auch Licht aber in der Zeit kein weiterer Scanvorgang bis der Programmteil für das Licht abgeschlossen ist.
Verzeiht mir wenn ich mich unverständlich ausdrücke... Mir fehlt im Schreiben etwas die Übung :-S

-mahlwerkende-

EEPROM.ino (20 KB)

Hallo,

kurze Codezeilen wie gesagt in Code Tags setzen. Der Button </> links oben im Textfeld. Über den Smilies.

Bevor ich den Code lese muß der Ablauf klar sein. :slight_smile:
Wie es sein soll. Nicht wie es zur Zeit ist.

Karte scannen > Licht geht an für 2min
neuer Kartenscan soll sofort möglich sein

Anders gesagt, meine Glaskugel bekommt Licht ...

Sobald am Kartenscanner Aktivitäten sind, soll Licht angehen. Egal ob die Karte als gültig erkannt wird oder nicht.
Nach der letzten Karten Aktivität soll 2min später das Licht ausgehen. Aber jederzeit soll eine Karte gescannt werden können.

So in etwa?

So:

Karte scannen > Licht geht an für 2min
neuer Kartenscan soll sofort möglich sein

mit der Einschränkung das dies nur bei einer gültigen Karte passiert.
Aber grundsätzlich ja (Ich bin ja grad verblüfft das ich mich scheinbar doch nicht vollkommen am Thema vorbei formuliert habe :smiley: )

Hallo,

okay, ich versuche es mal, mit umfangreichen fremden Code tue ich mich immer etwas schwer.

relayLED, LOW bedeutet Licht ein?
relayLED, HIGH bedeutet Licht aus?

Die Funktion granted soll so bleiben wie sie ist?
Wenn diese aufgerufen wird, dann ist damit automatisch die Karte gültig gewesen?

Wenn dem so ist, folgender Vorschlag. In granted das Licht einschalten und eine Statusvariable auf true setzen und weitere Variable auf die aktuelle millis Zeit setzen. Wenn du millis1 und millis2 nicht weiter benötigst, diese beiden entfernen.

In Loop prüfst du nun laufend ob die Statusvariable true ist. Also ob Licht ein ist.
Wenn true, wird die Lichtfunktion aufgerufen. In dieser wird geprüft ob millis 2min weiter ist wie die aktualisierte lastmillis Variable. Wenn 2min abgelaufen sind, wird das Licht ausgeschalten und Status auf false gesetzt. Damit wird die Lichtfunktion aus loop heraus nicht mehr aufgerufen. Bis zum erneuten Kartenscan und damit erneuten Aufruf der granted Funktion. Nebeneffekt. Mit jeden Kartenscan wird die lastmillis Variable erneut aktualisiert, was bedeutet, die 2min beginnen immer mit letzten Kartenscan von vorn.

Kannste so jeweils einbauen bzw. ändern?

Falls du noch am Gartentor einen Taster fürs Licht einbauen möchtest, brauchste auch nur wieder die 3 Zeilen von granted dort einbauen und haste damit auch Deine Licht sofort ein und 2min später wieder aus.

// global deklarieren
unsigned long lastmillis;
bool Licht_aktiv = false;

// in loop
if (Licht_aktiv == true)  {
  Licht_aus_Verzoegerung();      // Lichtfunktion aufrufen
}	


// in granted
digitalWrite(relayLED, LOW);  // Licht einschalten
Licht_aktiv = true;           // Status true setzen zum Licht einschalten
lastmillis = millis;          // Variable auf aktuelle millis setzen


// einzelne Funktion
void Licht_aus_Verzoegerung()
{ 
  if ( millis - lastmillis > 120000)  {   // 2min warten
    digitalWrite(relayLED, HIGH);         // Licht ausschalten
    Licht_aktiv = false;                  // Status zurücksetzen
  }
}

Erstmal ein dickes DANKESCHÖN :slight_smile:
Ich hatte nicht drauf abgezielt fertigen Code zu bekommen, finde das natürlich aber total genial!

Zu deinen Fragen

relayLED, LOW bedeutet Licht ein?
relayLED, HIGH bedeutet Licht aus?

Die Funktion granted soll so bleiben wie sie ist?
Wenn diese aufgerufen wird, dann ist damit automatisch die Karte gültig gewesen?

Ja,Ja, Ja und Ja... beziehungsweise wird granted nur aufgerufen wenn die Karte gültig ist.^^

Für mich zum Verständnis: Ich muss

void Licht_aus_Verzoegerung()
{
if ( millis - lastmillis > 120000) { // 2min warten
digitalWrite(relayLED, HIGH); // Licht ausschalten
Licht_aktiv = false; // Status zurücksetzen
}
}

nicht aus granted heraus aufrufen? So hatte ich bisher das Prinzip von Unterfunktionen bisher verstanden.

Ich bau das nachher ein wenn ich zu Hause bin und mache zeitnah Meldung wie es funktioniert :slight_smile:
Nochmal: DANKEDANKEDANKE!!! Ich sitz an dem Spaß nun schon drei Tage und bin sogar schon dabei gewesen eine Timer Lib einzubinden :smiley:

Hallo,

naja, ob ich dir nun lang und breit erkläre was du wie ändern könntest oder gleich paar Zeilen schreibe, kommt am Ende so vielleicht kürzer. :slight_smile:

Genau. Du rufst die Licht_aus_Verzögerung nicht in granted auf. Sonst könntest du sie nur einmal aufrufen. In granted setzt du nur eine Statusvariable. Zur Steuerung. Damit der Aufruf aus der loop heraus erfolgen kann und zwar nur dann wenn benötigt. Der eigentliche Aufruf erfolgt in der loop wenn true gesetzt wurde. Nur die loop wird ständig ohne Ende durchlaufen. Die granted Funktion wird ja nur aufgerufen wenn du was mit der Karte gemacht hast. Also eher selten.

Die Funktion wird fremd gesteuert aktiviert. Und nach 2min sperrt sie sich selbst. Das ist im Grunde alles was passiert.

Der eigentliche Trick ist, wenn man von Trick überhaupt sprechen kann. Kurze klare Funktionen schreiben. Mußte ich auch lernen und verstehen warum. Die Code Wartung wird später leichter. Und diese gesteuert in loop aufrufen. Oder wenn nötig untereinander aufrufen. Wird aber dann zunehmend verschachtelt. Wie gesagt nur loop wird ständig durchlaufen. Deshalb kann nur loop immer reagieren.

Ich bin der Typ der gern Statusvariablen nutzt um Funktionen aus der loop heraus aufzurufen oder auch nicht. Man muß nur den Überblick behalten. Du kannst auch gern sinnvollere Namen für alles vergeben. Ist ja letztlich dein Programm.

Maximalen Erfolg beim testen, hoffe das klappt wie gewünscht.

Hmmmm.... Hmmmhmmmhmmmmmm.... Also nach ein bisschen Gebastel habe ich die Programmschnipsel eingebunden. Funktioniert zwar noch nicht aber dem widme ich mich wenn ein größeres Problem behoben ist.
Der Arduino schaltet an USB so wie er soll (außer dass das Licht Relais nicht wieder aus geht.... primär unwichtig) aber sobald ich Netzstrom anstecke, schaltet er nur noch das Türrelais und ignoriert das andere völlig.
Das ist ja nu nix was ich über den Code zu lösen habe, oder? Ich versteh es nicht.... :frowning:

Hallo,

mit dem "alten Sketch" verhält er sich genauso komisch?

Huhu.

Da das zweite Relais noch nie schaltete, kann ich dir das leider nicht sagen. Der Schließer als solches funktioniert in allen Fällen wie er soll.
Und ich hab mittlerweile rausgefunden wo vermutlich das Problem mit dem Licht liegt. Er routet nicht auf die Unterfunktion, schätzungsweise liegt es an

// in loop
if (Licht_aktiv == true) {
Licht_aus_Verzoegerung(); // Lichtfunktion aufrufen
}

wobei man mich darauf bitte nicht festnageln möchte. Das übersteigt mein aktuelles Wissen bei weitem. Ich hab ja schon fast eine Stunde gebraucht um einen Klammerfehler zu finden :'-D

Hallo,

welche Klammer fehlte?

Ich habe nämlich wirklich eine vergessen, jetzt wo du es sagst. Entschuldigung.
Bei all meinen Codezeilen muss statt
millis;
millis();
stehen. Das ist eine Funktion der Arduino IDE. Wenn das immer noch nicht hilft, muss ich morgen wieder drüber schauen. Ab Nachmittag.

Jup, die fehlte auch aber die meinte ich nicht. Das hab ich relativ zeitnah gesehen. Dafür musst du dich lange nicht entschuldigen :-). Den besagten Fehler hab ich selber gemacht indem ich zwei "}" nicht gesetzt hab.... tja, das passiert wenn man einfach nur copy+paste spielt und nicht richtig aufpasst^^

Ich pack nochmal den aktuellen Sketch in den Anhang... vielleicht hab ich auch in meiner grenzenlosen Dummheit irgendwas falsch eingefügt... Das mag man mir dann verzeihen, ich starre heut schon wieder 11h auf diese Spielerei :smiley:

Ich wünsche noch einen wundervollen Abend, Ich denk bei der Frühschicht weiter drüber nach :smiley:

Beste Grüße,

-mahlwerkende-

EEPROM.ino (20.3 KB)

Hallo,

also eingefügt haste alles richtig wie ich das angedacht hatte. Da ich deinen Kartenleser und den Rest so nicht habe, habe ich den Code drastisch reduziert und mit einem Taster und 2 LEDs simuliert. Funktioniert. LED Relay geht ein, dann wieder aus, danach geht Wege LED ein und verzögert wieder aus.

Ich habe jetzt in deinen Code nochmal extra eingefügt das der SS Pin vom SPI klar auf OUTPUT gesetzt wird, weis nicht ob das die MFC522 Lib selbst macht. Der soll bei Verwendung von SPI Output sein, egal ob man den Pin wirklich nutzt oder nicht. Ist ein Versuch wert.

Und dann habe ich in den Funktionaufruf eine serielle Debugausgabe reingeschrieben. Daran kannst du erkennen ob die Funktion überhaupt angesprungen wird, wenn ja kommt eine Weile die gleiche Ausgabe und am Ende eine "Licht aus" Ausgabe nach Ablauf der Zeit. Das sollte eigentlich so auch bei dir funktionieren.

Ansonsten kannste nur an verschiedenen Stellen eine Debugausgabe in Form von
Serial.println(F(" bla bla "));
einfügen wo man einen Fehler vermutet und testen.

Probier mal den Sketch.

NFC_Tor_Licht_4.ino (20.4 KB)

Der tut leider nicht :-[ Und wenn ich das richtig sehe, ruft er die Lichtfunktion einfach nicht auf. Aber wenn es bei dir geht, muss der Fehler ja bei mir liegen. Ich versuch eben einen Schaltplan so zu zeichnen das man auch erkennt was ich hier zusammengepfuscht hab. Vielleicht siehst du da einen Fehler....

Hallo,

okay, versuchen wir mal den Fehler zu finden.
Was siehst du denn davon auf dem seriellen Monitor?

a) "LOOP kommt vorbei"
b) "Licht_aktiv gleich true"
c) "Licht ist AUS"

siehst du a) wenn du nichts machst?
siehst du a) wenn du was mit der Karte machst?

Wenn einmal nicht, dann wird die loop nicht durchlaufen und bleibt irgendwo mittendrin hängen.

wenn a) in beiden Fällen erscheint, dann sollte bei gültiger Karte b) erscheinen und dann auch später c)

Schaltplan :slight_smile:

Hallo,

der ist irgendwie zu klein. Kann nichts erkennen. Kannste den eigentlichen Teil ausschneiden und in 800x ... reinstellen als Anhang? Bitte noch obigen Text lesen. Kannst dir bis morgen Zeit nehmen, muß erstmal Schluß machen für heute. Und grübel jetzt nicht weiter über den Sketch nach. Bist jetzt eh nach Tagen "Betriebsblind". Ist normal. :wink:

Also der Monitor spuckt folgendes aus

Welcome, You shall pass 
LOOP kommt vorbei
Licht_aktiv gleich true

Ersteres ist die Bestätigung das die Karte akzeptiert wurde.
Und Schaltplan hab ich dir mal als PDF hintenran gepackt :slight_smile:

Schaltplan Schließanlage 17.03.16.pdf (691 KB)