Zutrittsauswahl über RFID bestätigen..

Hallo zusammen,

ich habe da ein Problem und hoffe ihr könnt mir helfen.

Ich möchte gerne ein Art Türöffnungssytem bauen.
Die Kinder haben ein Display zwischen zwei Kellertüren, wo sie eine Auswahl treffen können.
Entweder beide Türen, linke Tür oder rechte Tür.
Nach der Auswahl, wird die Auswahl im Display angezeigt und muss mit der RFID-Karte bestätigt werden.
Nach der Bestätigung öffnet sich die ausgewählte Tür/Türen.

Hier erstmal der Code, der mich in den Wahnsinn treibt...

#include <Elegoo_GFX.h>      
#include <Elegoo_TFTLCD.h>  
#include <TouchScreen.h>  
#include <SPI.h>
#include <MFRC522.h>
MFRC522 mfrc522(53, 49);
String tagUID = "F7 FC D0 3B";

#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif


#define YP A3  
#define XM A2  
#define YM 9   
#define XP 8   

#define TS_MINX 120   
#define TS_MAXX 900  
#define TS_MINY 70    
#define TS_MAXY 920   

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); 

#define LCD_RESET A4
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GRAY    0xDEFB

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define PENRADIUS 3

const int led1Pin = 22;                                               
const int led2Pin = 23;                                               
const int led3Pin = 24;                                              

int screen_id = 0;

void fbutton1 ();
void fbutton2 ();
void fbutton3 ();

void setup(void)
  {
    Serial.begin(9600);

    pinMode(led1Pin, OUTPUT);                                         
    pinMode(led2Pin, OUTPUT);                                         
    pinMode(led3Pin, OUTPUT);                                         

    tft.reset();
    tft.begin(0x9341);
    tft.setRotation(2);      
    screen_main();
    SPI.begin();      
    mfrc522.PCD_Init();  
  }

#define MINPRESSURE 10      
#define MAXPRESSURE 1000    

void loop()
  {
    TSPoint p = ts.getPoint();                                                                
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);

    if (p.z > MINPRESSURE && p.z < MAXPRESSURE)                                               
      {
        p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);                                             
        p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);                                             

        if (screen_id == 0)                                                                   
          {
            if (p.x > 20 && p.x < 220 && p.y > 140 && p.y < 190)                              // Beide Türen Button
              {
                fbutton1();         
              }
            else if (p.x > 130 && p.x < 200 && p.y > 200 && p.y < 310)                        // Linke Tür Button
              { 
                fbutton2 ();                             
              }
            else if (p.x > 20 && p.x < 110 && p.y > 200 && p.y < 310)                         // Rechte Tür Button
              {
                fbutton3 ();                             
              }
          }   
      }
  }
void fbutton1 ()                                                                              // Funktion zum öffnen beider Türen
  {
    tft.fillRect(20, 70, 200, 50, WHITE);                                                    
    tft.setCursor(80, 90);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Beide!");
    Serial.println(F("Beide Türen wurde gewählt"));
    if (! mfrc522.PICC_IsNewCardPresent())
      {
        Serial.print("Karte gefunden");
        return;
      }
    if ( ! mfrc522.PICC_ReadCardSerial())
      {
        Serial.print("Karte gelesen");
        return;
      }
    String tag = "";
    for (byte j = 0; j < mfrc522.uid.size; j++)
      {
        tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
        tag.concat(String(mfrc522.uid.uidByte[j], HEX));
      }
    tag.toUpperCase();
   
    if (tag.substring(1) == tagUID)
      {
        digitalWrite(led1Pin, HIGH);
        delay(3500);
        digitalWrite(led1Pin, LOW);
        tft.fillRect(20, 70, 200, 50, WHITE);
      }
    else
      {
        Serial.print("nix da");
        tft.fillRect(20, 70, 200, 50, WHITE);
        delay(3500);
       }
   }
  
void fbutton2 ()                                                                     // Funktion zum öffnen der linken Tür
  {
    tft.fillRect(20, 70, 200, 50, WHITE);                                                     // Wahlfeld
    tft.setCursor(55, 90);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Linke Tuer!");
    Serial.println(F("Linke Tür wurde gewählt"));
    digitalWrite(led2Pin, HIGH);
    delay(3500);
    digitalWrite(led2Pin, LOW);
    tft.fillRect(20, 70, 200, 50, WHITE);                                                     // Wahlfeld
  }
void fbutton3 ()                                                                    // Funktion zum öffnen der linken Tür
  {
    tft.fillRect(20, 70, 200, 50, WHITE);                                                     // Wahlfeld
    tft.setCursor(50, 90);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Rechte Tuer!");
    Serial.println(F("Rechte Tür wurde gewählt"));
    digitalWrite(led3Pin, HIGH);
    delay(3500);
    digitalWrite(led3Pin, LOW);
    tft.fillRect(20, 70, 200, 50, WHITE);                                                     // Wahlfeld
  }
// Hauptbildschirm
void screen_main()
  {
    screen_id = 0;
    tft.fillScreen(BLACK);
    
    tft.setCursor(60, 15);                                                                    // Textanzeigebereich
    tft.setTextColor(BLUE);
    tft.setTextSize(2);
    tft.println("Welche Tuer");
    tft.setCursor(20, 35);
    tft.setTextColor(BLUE);
    tft.setTextSize(2);
    tft.println("soll ich oeffnen?");
    
    tft.fillRect(20, 70, 200, 50, WHITE);                                                     // Wahlfeld

    tft.fillRect(20, 140, 200, 50, YELLOW);                                                   // Beide Türen
    tft.setCursor(80, 160);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Beide?");
   
    tft.fillRect(20, 200, 90, 110, YELLOW);                                                   // Linke Türe
    tft.setCursor(37, 230);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Linke");
    tft.setCursor(38, 270);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Tuer?");

    tft.fillRect(130, 200, 90, 110, YELLOW);                                                // Rechte Türe
    tft.setCursor(141, 230);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Rechte");
    tft.setCursor(148, 270);
    tft.setTextColor(BLACK);
    tft.setTextSize(2);
    tft.println("Tuer?");
  }

Das Programm läuft und macht was es soll...

Außer in der Funktion "void fbutton1 ()".
Dort habe ich mal die RFID Abfrage eingebaut.

Nach der Auswahl "Beide Türen" schreibt er sofort "Karte gefunden" in den seriellen Monitor,
ohne das die Karte nur in der Nähe des Readers war.

Ich denke, dass ist auch das Problem weil er die Karte nicht einlesen konnte
Aber denken, ist nicht wissen, und ich hoffe ihr wisst es besser :slight_smile:

Ich hoffe, ihr könnt mir helfen und das Programm zum laufen zu bringen.

Lieben Gruß :confused:

    if (! mfrc522.PICC_IsNewCardPresent())
      {
        Serial.print("Karte gefunden");
        return;
      }

Du prüfst hier auf das Nichtvorhandensein.

Ist das der Fall (Weil nicht da) gibbet die Meldung.

Ah.. danke für den Hinweis.

Wenn ich aber das Ausrufezeichen rausnehme, springt er sofort in die else-Beingung am Schluss. :confused:

Kannst du deinen Sketch bitte noch so kommentieren, das wir auch erkennen können, was da eigentlich wo passieren soll ?
Dann sehen sich den Sketch sicher mehr User an und du hast mehr Helfer.

Wenn ich aber das Ausrufezeichen rausnehme, springt er sofort in die else-Beingung am Schluss. :confused:

Ich hab die Technik nicht zum probieren, aber die Funktion scheint anderen auch schon Probleme gemacht zu haben.
Schau mal hier mfrc522.PICC_IsNewCardPresent() function · Issue #279 · miguelbalboa/rfid · GitHub da gibt es was zu lesen :wink: - ich habs nur kurz überflogen.....

Notfalls erstmal mit den Examples arbeiten und da rausarbeiten.

Noch ein Nachtrag:
Ich hab den Code mal in meiner "Lesart" formatiert.

Das Du dann in den else-Zweig kommst, ist kein Wunder.
Ich habs im Code kommentiert.

  if (! mfrc522.PICC_IsNewCardPresent()) // Nimmst Du das ! weg, bekommst Du keinen Elsezweig
    {
    Serial.print("Karte gefunden");
    return;
    }
/*
Um zu prüfen, müsste hier ein else rein
*/

  if (! mfrc522.PICC_ReadCardSerial()) // Hier genau das Selbe
    {
    Serial.print("Karte gelesen");
    return;
    }
/*
Um zu prüfen, müsste hier ein else rein
*/

  String tag = "";
  for (byte j = 0; j < mfrc522.uid.size; j++)
    {
    tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
    tag.concat(String(mfrc522.uid.uidByte[j], HEX));
    }
  tag.toUpperCase();
  if (tag.substring(1) == tagUID) // Weil hier die Bedingung NICHT erfüllt ist....
    {
    digitalWrite(led1Pin, HIGH);
    delay(3500);
    digitalWrite(led1Pin, LOW);
    tft.fillRect(20, 70, 200, 50, WHITE);
    }
  else                                 // .. springt er hierhin
    {
    Serial.print("nix da");
    tft.fillRect(20, 70, 200, 50, WHITE);
    delay(3500);
    }

Vielen Dank an my_xp_projekt, und natürlich auch an den anderen!

Ihr habt mir sehr geholfen!

Hier jetzt nur der richtige Code für die Funktion "fbutton1", geschuldet der Zeichenbegrenzung.

void fbutton1 ()      // Funktion zum öffnen beider Türen
  {
    tft.fillRect(20, 70, 200, 50, WHITE);     // Auf Textanzeigefeld wird die Auswahl "Beide!" angezeigt
    tft.setCursor(80, 90);
    tft.setTextColor(GREEN);
    tft.setTextSize(2);
    tft.println("Beide!");     
    delay(3000);
    if (mfrc522.PICC_IsNewCardPresent()&& mfrc522.PICC_ReadCardSerial())      // Schauen nach neuem Ereignis
      {
        String tag = "";
        for (byte j = 0; j < mfrc522.uid.size; j++)
          {
            tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
            tag.concat(String(mfrc522.uid.uidByte[j], HEX));
          }
        tag.toUpperCase();
        if (tag.substring(1) == tagUID)     // Berechtigte Karte wird verglichen
          {
            Serial.println("Berechtigt!");
            Serial.println(F("Beide Türen wurden geöffnet"));
            digitalWrite(led1Pin, HIGH);
            digitalWrite(led2Pin, HIGH);
            delay(4000);
            digitalWrite(led1Pin, LOW);
            digitalWrite(led2Pin, LOW);
            tft.fillRect(20, 70, 200, 50, WHITE);     // Clear Textanzeigefeld
          }
        else
          {
            Serial.println("Nix da");
            tft.fillRect(20, 70, 200, 50, WHITE);     // Auf Textanzeigefeld wird "Nix da!" angezeigt
            tft.setCursor(80, 90);
            tft.setTextColor(RED);
            tft.setTextSize(2);
            tft.println("Nix da!");     
            delay(5000);
            tft.fillRect(20, 70, 200, 50, WHITE);     // Clear Textanzeigefeld
          }
        }
      else
        {
          delay(5000);
          tft.fillRect(20, 70, 200, 50, WHITE);     // Clear Textanzeigefeld
          Serial.println("Neue Auswahl treffen");
          return;
        }
  }

Das Programm ist bestimmt nicht zu 100% sauber und ließe sich auch bestimmt noch optimieren, aber es läuft!

Mir gefällt es und die Kinder sind zufrieden!

Danke euch!

PS: Im Anhang nochmal der komplette Code.

Vielen Dank an my_xp_projekt, und natürlich auch an den anderen!

Ihr habt mir sehr geholfen!
Das Programm ist bestimmt nicht zu 100% sauber und ließe sich auch bestimmt noch optimieren, aber es läuft!
Mir gefällt es und die Kinder sind zufrieden!
Danke euch!
PS: Im Anhang nochmal der komplette Code.

Danke für die Rückmeldung und schön wenn es so funktioniert, wie die Kinder es wollen.

Dein Code war lesbar und vor allem war die Fragestellung so vollständig, das es recht einfach war einen Lösungsansatz zu finden.

Als Ansatz für eine Codeverbesserung einen ersten Hinweis:

if (Bedingung)
 if (Bedingung)
   Ausgabe
 else
   Ausgabe
 delay(5000);
 tft.fillRect(20, 70, 200, 50, WHITE);

Mach Dir aber darum keinen Stress...
Der Code im Anhang war nicht bei, ist aber auch nicht nötig.
Nur schade, das Du unter neuem Account postest.