- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Arduino Uno + RFID Aktion halten bis zum nächsten Kontakt

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2016
    Ort
    Essen
    Alter
    40
    Beiträge
    6

    Arduino Uno + RFID Aktion halten bis zum nächsten Kontakt

    Anzeige

    Praxistest und DIY Projekte
    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.
    Code:
    #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.
    Code:
    #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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    Versuch mal das:
    Code:
    #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.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    wie du die LED an und aus schaltest hast du ja schon gezeigt.
    WAs du jetzt noch brauchst ist eine zusätzliche Abfrage.
    Code:
    Wenn (Code korrekt) dann
      Wenn (LED AN) dann LED AUS
      sonst LED AN
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2016
    Ort
    Essen
    Alter
    40
    Beiträge
    6
    Vielen lieben dank i_make_it, klappt super.
    Ceos, das habe ich ja versucht:
    Code:
     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.

    Code:
    #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.
    Code:
    #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:
    Code:
    #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
    Geändert von blackzero23 (04.10.2016 um 13:30 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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
    Code:
    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
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2016
    Ort
    Essen
    Alter
    40
    Beiträge
    6
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    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.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2016
    Ort
    Essen
    Alter
    40
    Beiträge
    6
    Ich danke dir i_make_it.
    Code:
    #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

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    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.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2016
    Ort
    Essen
    Alter
    40
    Beiträge
    6
    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

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Mit Taster von einem Loop zum nächsten springen
    Von Bow-Hunter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 21
    Letzter Beitrag: 29.09.2014, 10:02
  2. Problem beim Lesen von Mifare RFID Tags mit dem Arduino NFC Shield
    Von Jonas15 im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 02.04.2012, 18:58
  3. tastendruck ein, beim nächsten druck wieder aus?
    Von bigeggmc im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 23.03.2006, 12:00
  4. und auf zum nächsten: Spannung messen...
    Von boeseTURBO-CT im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 19.05.2004, 16:26
  5. 32-Bit RISC-Mikrocontroller der nächsten Generation
    Von Frank im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 1
    Letzter Beitrag: 27.03.2004, 13:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus