Probleme bei RFID innerhalb größerem Projekt

Hallo zusammen,

leider bin ich (noch) nicht wirklich viel hier unterwegs, deshalb bin ich nicht so sicher, wie ich mein Problem hier schildern und angehen soll.

Ich bin Hobby Programmierer, habe aber dennoch ein umfangreicheres Programm für den Arduino Mega geschrieben.

Hierbei werden nacheinander 6 Funktionen (Rätsel ) aufgerufen und abgefragt. Wobei die erste Funktion lediglich den "Override Status" von 5 Kippschaltern prüft und dann ggf. die zugehörige Folge-Funktion nicht mehr aufruft.
Die letzte Funktion prüft, ob alle 4 Funktionen (Rätsel R1-R4) korrekt gelößt worden sind und zieht dann einen finalen Port auf Masse. Diese Prüfung geschieht allerdings nur, wenn dies über einen RFID Chip initiiert wird (RFID Chip erkannt).

In Summe funktionert mein Programm. Wenn ich alle Funktionen (Rätsel) nacheinander bearbeite und löse, dann öffnet sich die Türe.
Aber: werden die Rätsel parallel bearbeitet (zahlreiche Inputs gedrückt werden etc.), kommt es immer wieder zu Problemen. Vor allem wird dann kein RFID Chip mehr erkannt. Es gibt auch den Fall, dass in der Funktion "verify_MA_des_Monats_Raetsel()" nicht alle Tasten des Tastenfeldes erkannt werden (bzw. kein Kontroll Tone ausgegeben wird).

Ich habe bereits einige Tests durchgeführt, bin aber etwas ratlos, wie ich die "Problemstellen" am besten identifizieren oder eingrenzen kann...ansonsten hätte ich hier auch nur den reduzierten Code / Funktion gepostet.

Leider bin ich mir auch nicht sicher, ob die HW 100% richtig bzw. prozesssicher verbaut / verlötet ist. Da es aber während der "step-by-step" Verwendung funktioniert, tendiere ich eher zu SW Problemen.

Ich drücke die Daumen, dass mir jemand von euch ein paar Ideen hat oder vielleicht direkt einen Fehler im Code findet.
Vielen Dank.

Gruß
Christian

//--------------------------------------------------------------------------------------------------------------------------------
// Kontrollraum Overrides
//--------------------------------------------------------------------------------------------------------------------------------
// Defintion benötigter Kontrollraum Overrides
const int R1_override = 28;                                 // Kontrollraum Override für Rätsel 1 = Controller Rätsel
const int R2_override = 30;                                 // Kontrollraum Override für Rätsel 2 = Diskokugel Rätsel
const int R3_override = 32;                                 // Kontrollraum Override für Rätsel 3 = Bildschirm Rätsel
const int R4_override = 34;                                 // Kontrollraum Override für Rätsel 4 = MA des Monats Rätsel
const int R5_override = 36;                                 // Kontrollraum Override für Rätsel 5 = RFID Auslöser 
boolean R1_override_status = false;                         // Kontrollraum Override für Rätsel 1 Default = false (NOT Solved)
boolean R2_override_status = false;                         // Kontrollraum Override für Rätsel 2 Default = false (NOT Solved)
boolean R3_override_status = false;                         // Kontrollraum Override für Rätsel 3 Default = false (NOT Solved)
boolean R4_override_status = false;                         // Kontrollraum Override für Rätsel 4 Default = false (NOT Solved)
boolean R5_override_status = false;                         // Kontrollraum Override für Rätsel 5 Default = false (NOT Solved)
//--------------------------------------------------------------------------------------------------------------------------------
// R1: Controller / Heizungsrätsel
//--------------------------------------------------------------------------------------------------------------------------------
// Globale Variablen 
int counter = 0;                                            // Indexzähler für cheat Code
boolean correct = false;                                    // Cheat Code correct verifier
const int taste[4] = {2, 3, 4, 5};                          // Array um alle 4 Buttons in For Schleife zu prüfen
const int tastenwert[4] = {0, 1, 2, 3};                     // Array um Tastenwert zu definieren & speichern
// Dreieck  = 0
// Kreis    = 1
// Kreuz    = 2
// Viereck  = 3
// Lösung Cheat Code = 0 3 1 1 2 1 2 0 1 3
int code[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};              // Code Tabelle => Default Empty    
const int cheat_LSG[10] = {0, 3, 1, 1, 2, 1, 2, 0, 1, 3};   // Lösungscode

// Defintion benötigter IN- & Outputs Controller / Heizungsrätsel
const int R1_Solved = 8;                                    // Controller Rätsel Solved => Relais auf LOW ziehen  // Controller Rätsel NOT Solved => Relais auf HIGH ziehen  
const int button_dreieck = 2;                               // Button Dreieck an PIN 2 grüne Litze
const int button_kreis = 3;                                 // Button Kreis an   PIN 3 rote  Litze
const int button_kreuz = 4;                                 // Button Kreuz an   PIN 4 weiße Litze
const int button_viereck = 5;                               // Button Viereck an PIN 5 blaue Litze
                                                            // PIN 6 = Ton für PS Controller Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
// R2: Diskokugel Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
// Globale Variablen 
#include "pitches.h"                                        // Bib für Töne
int i=0;                                                    // Zählvariable für Schleife Schalterabfrage
int j=0;                                                    // Zählvariable für Schleife Schalterabfrage
int k=0;                                                    // Zählvariable für Schleife Schalterabfrage
boolean start = true;
byte leds = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Globale Variablen DiskoRätsel neu
//Lösung => Gelb (1) - Blau (2) - Rot (3) - Grün (4)
const int taste_DK[4] = {25, 27, 29, 31};                   // Array um alle 4 Buttons (über Ihre PIN Lokation) in For Schleife zu prüfen
const int DK_cheat_LSG[4] = {1, 2, 3, 4};                   // Lösungsarray / Reihenfolge Gelb (1) - Blau (2) - Rot (3) - Grün (4)
int DK_cheat_counter = 0;                                   // Counter für Lösungsarray Vergleich "Point" auf Position 1 (Stelle 0) setzten
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Defintion benötigter IN- & Outputs Diskokugel Rätsel
const int R2_Solved = 9;                                    // Diskokugel Rätsel Solved => Relais auf LOW ziehen  // Diskokugel Rätsel NOT Solved => Relais auf HIGH ziehen 
const int ledBel = 23;                                      // Dauerplus für Button Beleuchtung
//Lösung => Gelb  - Blau - Rot - Grün
const int buttonYellowPin = 25;                             // wird buttonYellowPin  => 1. Schalter
const int buttonBluePin = 27;                               // wird buttonBluePin    => 2. Schalter
const int buttonRedPin = 29;                                // wird buttonRedPin     => 3. Schalter
const int buttonGreenPin = 31;                              // wird buttonGreenPin   => 4. Schalter
/*not needed to define PIN 35*/                             // PIN 35 wird für Ton Ausgabe verwendet

//--------------------------------------------------------------------------------------------------------------------------------
// R3: Bildschirm Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
// Globale Variablen 
// Defintion benötigter IN- & Outputs Bildschirm Rätsel
const int R3_Solved = 10;                                   // Bildschirm Rätsel Solved => Relais auf LOW ziehen  // Bildschirm Rätsel NOT Solved => Relais auf HIGH ziehen 
const int Steckdose = 37;                                   // Input PIN über Steckdose
//--------------------------------------------------------------------------------------------------------------------------------
// R4: MA_des_Monats Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
// Globale Variablen 
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {         // Spiegelverkehrt, sodass es mit neuem PINPAD passt
  {'1','4','7','*'},
  {'2','5','8','0'},
  {'3','6','9','#'},
  {'A','B','C','D'}
};

byte rowPins[COLS] = {14, 15, 16, 17}; //connect to the row pinouts of the keypad
byte colPins[ROWS] = {18, 19, 20, 21}; //connect to the column pinouts of the keypad

// old byte rowPins[ROWS] = {14, 15, 16, 17}; //connect to the row pinouts of the keypad
// old byte colPins[COLS] = {18, 19, 20, 21}; //connect to the column pinouts of the keypad
//byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
//byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

char keycode[5] = "2637#";                                  // Char Array Lösungscode 2-6-3-7
int keycode_1[4] = {0,0,0,0};                               // Char Array Code Tabelle => Default Empty
char key_pressed=0;
int R4_i = 0;                                              // Zählvariable für 5 Ziffern inkl. #
// Defintion benötigter IN- & Outputs MA_des_monats Rätsel Rätsel
const int R4_Solved = 11;                                  // MA_des_Monats Rätsel Solved => Relais auf LOW ziehen  // MA_des_Monats Rätsel NOT Solved => Relais auf HIGH ziehen 
//--------------------------------------------------------------------------------------------------------------------------------
// R5: RFID_PAD 
//--------------------------------------------------------------------------------------------------------------------------------
// Globale Variablen 
/*---------------------------------------------------------------------------- 
 * * This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
 * for further details and other examples.
 * NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
 * Released into the public domain.
 * ----------------------------------------------------------------------------
 * This sample shows how to read and write data blocks on a MIFARE Classic PICC
 * (= card/tag).
 * BEWARE: Data will be written to the PICC, in sector #1 (blocks #4 to #7).
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno           Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */
#include <SPI.h>
#include <MFRC522.h>
// Defintion benötigter IN- & Outputs RFID_PAD
#define RST_PIN         49                                  // Configurable, see typical pin layout above   => PIN CHECK
#define SS_PIN          53                                  // Configurable, see typical pin layout above   => PIN CHECK
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
MFRC522::MIFARE_Key key;
const int Get_together = 45;                               // 27.05 corrected: Get_together Rätsel Solved => Open door => Signal PIN auf LOW ziehen => Stromfluss unterbrechen      
//const int Get_together = 45;                             // 27.05 corrected: Get_together Rätsel Solved => Open door => Signal PIN auf HIGH ziehen  // Get_together Rätsel NOT Solved => lock door => Signal PIN auf LOW ziehen      
const int LEDOutputRED = 47;                               // LED Output RED über old Output 7
//--------------------------------------------------------------------------------------------------------------------------------
 
void setup()
{
  //Temp. Elemente zur Diagnose
  Serial.begin(9600);
  //--------------------------

// Defintion benötigter IN- & Outputs für Kontrollraum Overrides
  pinMode(R1_override, INPUT_PULLUP);
  pinMode(R2_override, INPUT_PULLUP);
  pinMode(R3_override, INPUT_PULLUP);
  pinMode(R4_override, INPUT_PULLUP);
  pinMode(R5_override, INPUT_PULLUP);
  // Defintion benötigter IN- & Outputs Controller / Heizungsrätsel
  pinMode(R1_Solved, OUTPUT);
  pinMode(button_dreieck, INPUT_PULLUP);
  pinMode(button_kreis, INPUT_PULLUP);
  pinMode(button_kreuz, INPUT_PULLUP);
  pinMode(button_viereck, INPUT_PULLUP);
  // Defintion benötigter IN- & Outputs Diskokugel Rätsel 
  pinMode(R2_Solved, OUTPUT);
  pinMode(ledBel, OUTPUT);
  pinMode(buttonYellowPin, INPUT_PULLUP);  
  pinMode(buttonBluePin, INPUT_PULLUP);  
  pinMode(buttonRedPin, INPUT_PULLUP);  
  pinMode(buttonGreenPin, INPUT_PULLUP); 
  // Defintion benötigter IN- & Outputs Bildschirm Rätsel 
  pinMode(R3_Solved, OUTPUT);
  pinMode(Steckdose, INPUT_PULLUP);
  // Defintion benötigter IN- & Outputs MA_des_Monats Rätsel 
  pinMode(R4_Solved, OUTPUT);
  // Defintion benötigter IN- & Outputs RFID_PAD
  pinMode(LEDOutputRED, OUTPUT);
  pinMode(Get_together, OUTPUT);
  
  // Default Werte zum Rätselstart Controller / Heizungsrätsel
  digitalWrite(R1_Solved, HIGH);                              // Controller Rätsel NOT Solved => Relais auf HIGH ziehen 
  // Default Werte zum Rätselstart Diskokugel Rätsel 
  digitalWrite(R2_Solved, HIGH);                              // Diskokugel Rätsel NOT Solved => Relais auf HIGH ziehen 
  digitalWrite(ledBel, HIGH);                                 // Button Beleuchtung einschalten
  // Default Werte zum Rätselstart Bildschirm Rätsel
  digitalWrite(R3_Solved, HIGH);                              // Bilschirm Rätsel NOT Solved => Relais auf HIGH ziehen 
  // Default Werte zum Rätselstart MA_des_Monats Rätsel 
  digitalWrite(R4_Solved, HIGH);                              // MA_des_Monats Rätsel NOT Solved => Relais auf HIGH ziehen
  // Default Werte zum Rätselstart RFID_PAD
  digitalWrite(Get_together, HIGH);                           // Get_together Rätsel NOT Solved => Open closed => Strom für Magnete einschalten
  digitalWrite(LEDOutputRED, LOW);                            // RFID Rätsel NOT Solved => rote LED ausschalten
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();        // Init SPI bus
  mfrc522.PCD_Init(); // Init MFRC522 card
  // Prepare the key (used both as key A and as key B)
  // using FFFFFFFFFFFFh which is the default at chip delivery from the factory
  for (byte ii = 0; ii < 6; ii++) 
  {
    key.keyByte[ii] = 0xFF;
  }
  Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
  Serial.println();
  Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
}

void loop()
{
  verify_Kontrollraum_Status();                              // Kontrollraum Overrides abfragen
  if (R1_override_status == false)                            // Controller Rätsel abfragen, aber nur falls Override nicht gesetzt ist
    verify_Controller_Raetsel();                               
  if (R2_override_status == false)                            // Diskokugel Rätsel abfragen, aber nur falls Override nicht gesetzt ist
    verify_Diskokugel_Raetsel();                             
  if (R3_override_status == false)                            // Bildschirm Rätsel abfragen, aber nur falls Override nicht gesetzt ist    
    verify_Bildschirm_Raetsel();                             
  if (R4_override_status == false)                            // MA des Monats Rätsel abfragen, aber nur falls Override nicht gesetzt ist    
    verify_MA_des_Monats_Raetsel();                          
  if (R5_override_status == false)                            // RFID PAD abfragen, aber nur falls Override nicht gesetzt ist      
    verify_RFID_PAD();                                        
}

//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen  Kontrollraum Overrides prüfen
//--------------------------------------------------------------------------------------------------------------------------------

void verify_Kontrollraum_Status()
{
  if (digitalRead(R1_override) == LOW)                      // Kontrollraum Overrides Rätsel 1 abfragen
  {
    digitalWrite(R1_Solved, LOW);                           // Controller Rätsel Solved => Relais auf LOW ziehen
    R1_override_status = true;
  }
  if (digitalRead(R1_override) == HIGH && R1_override_status == true)
  {
    digitalWrite(R1_Solved, HIGH);                          // RESET Controler Rätsel NOT Solved => Relais auf HIGH ziehen
    R1_override_status = false;
  }
  
  if (digitalRead(R2_override) == LOW)                      // Kontrollraum Overrides Rätsel 2 abfragen
  {
    digitalWrite(R2_Solved, LOW);                           // Diskokugel Rätsel Solved => Relais auf LOW ziehen
    R2_override_status = true;
  }
  if (digitalRead(R2_override) == HIGH && R2_override_status == true)
  {
    digitalWrite(R2_Solved, HIGH);                          // Diskokugel Rätsel NOT Solved => Relais auf HIGH ziehen
    R2_override_status = false;
  }

  if (digitalRead(R3_override) == LOW)                      // Kontrollraum Overrides Rätsel 3 abfragen
  {
    digitalWrite(R3_Solved, LOW);                           // Bildschirm Rätsel Solved => Relais auf LOW ziehen  
    R3_override_status = true;
  }
  if (digitalRead(R3_override) == HIGH && R3_override_status == true)
  {
    digitalWrite(R3_Solved, HIGH);                          // RESET Bildschirm Rätsel NOT Solved => Relais auf HIGH ziehen
    R3_override_status = false;
  }

  if (digitalRead(R4_override) == LOW)                      // Kontrollraum Overrides Rätsel 4 abfragen
  {
    digitalWrite(R4_Solved, LOW);                            // MA des Monats Rätsel Solved => Relais auf LOW ziehen 
    R4_override_status = true;
  }
  if (digitalRead(R4_override) == HIGH && R4_override_status == true)
  {
    digitalWrite(R4_Solved, HIGH);                          // RESET MA des Monats Rätsel NOT Solved => Relais auf HIGH ziehen
    R4_override_status = false;
  }
  
  if (digitalRead(R5_override) == LOW)                      // Kontrollraum Overrides Rätsel 5 abfragen
  {
    digitalWrite(Get_together, LOW);                         // Get_together Rätsel Solved => Open door => Signal PIN auf LOW ziehen
    R5_override_status = true;
  }
  if (digitalRead(R5_override) == HIGH && R5_override_status == true)
  {
    digitalWrite(Get_together, HIGH);                          // RESET RFID PAD Rätsel NOT Solved => Relais auf HIGH ziehen
    R5_override_status = false;
  }
}

//--------------------------------------------------------------------------------------------------------------------------------
// Ende Funktionen  Kontrollraum Overrides prüfen
//--------------------------------------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen  R1: Controller / Heizungsrätsel
//--------------------------------------------------------------------------------------------------------------------------------

void verify_Controller_Raetsel()
{
  get_Keypressed();
  if (counter == 10)                                            // Cheat Code vollständig
  {
    digitalWrite(R1_Solved, LOW);                               // Controller Rätsel Solved => Relais auf LOW ziehen
    counter = 0;                                                // Counter zurückstellen 
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms 
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
  }  
}

void get_Keypressed()
{
  const unsigned long bouncetime = 150;
  static unsigned long tastmillis = 0;
  static boolean isKey = false;
  
  if (millis() - tastmillis > bouncetime)                   // BounceTime abgelaufen!
  {
    tastmillis = millis();
    if (isKey == true)                                      // Taste war gedrückt?
    {
      tone(6, NOTE_A5, 200);                                // Ton (PIN 6) für 200 ms 
      for (byte b = 0; b < 4; b++)                          // durchlaufe alle Tasten
      {
        if (digitalRead(taste[b]) == LOW) return;           // Wenn eine Taste gedrückt -> raus (falls Taste gegrückt gehalten wird)
      }
      isKey = false;                                        // Es war keine Taste gedrückt
    }
    else
    {
      for (byte b = 0; b < 4; b++)                          // Frage Tasten
      {
        if (digitalRead(taste[b]) == LOW)                   // abgefragte Taste gedrückt?
        {
          Serial.print("Tastencode: ");
          Serial.println(tastenwert[b]);                    // Zeige TastenCode
          Serial.println(b);   
                        
          code[counter] = tastenwert[b];                    // aktueller TastenCode in Code Array gespeichert
          correct_key(b);                                   // prüfe, ob correct Taste gedrückt worden ist
          isKey = true;                                     // Merke, das Taste gedrückt => Entprellen starten
        }
      }
    }
  }
}

void correct_key(int aa)
{
  //int code[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};              // Code Tabelle => Default Empty    
  //const int cheat_LSG[10] = {0, 3, 1, 1, 2, 1, 2, 0, 1, 3};   // Lösungscode
  
  if(aa == cheat_LSG[counter])                                  // cheat_LSG[10] = {0, 3, 1, 1, 2, 1, 2, 0, 1, 3};
    counter++;                                                  // korrekte Taste gedrückt, "pointer" an nächste Stelle setzen
  else if (aa== 1 && digitalRead(R1_Solved)== LOW) 
  {
    digitalWrite(R1_Solved, HIGH);                              // RESET Funktion => Dreick dann Kreis drücken => Controller Rätsel NOT Solved => Relais auf HIGH ziehen  
    counter=0;                                                  // korrekte Taste NICHT gedrückt, zurück auf Anfang springen
  }
  else
    counter=0;                                                  // korrekte Taste NICHT gedrückt, zurück auf Anfang springen
    Serial.println(counter);   
}

//--------------------------------------------------------------------------------------------------------------------------------
// ENDE Funktionen  R1: Controller / Heizungsrätsel
//--------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen R2: Diskokugel Rätsel
//--------------------------------------------------------------------------------------------------------------------------------

void verify_Diskokugel_Raetsel()                                // Diskokugel Rätsel abfragen
{
  //Lösung => Gelb  - Blau - Rot - Grün
  get_Buttonpressed();                                          // Button abfragen
  if (DK_cheat_counter == 4)                                    // Cheat Code vollständig
  {
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms 
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
    digitalWrite(R2_Solved, LOW);                               // Diskokugel Rätsel Solved => Relais auf LOW ziehen 
    DK_cheat_counter = 0;                                         // Counter zurückstellen 
  }  
}

void get_Buttonpressed()                                      // Detektieren, welcher Diskukugel Button gedrückt wurde
{
  const unsigned long bouncetime_DK = 150;
  static unsigned long tastmillis_DK = 0;
  static boolean isKey_DK = false;


  if (millis() - tastmillis_DK > bouncetime_DK)                   // BounceTime abgelaufen!
  {
    tastmillis_DK = millis();
    if (isKey_DK == true)                                      // Taste war gedrückt?
    {
      disko_kugel_blinken();
      for (byte b_DK = 0; b_DK < 4; b_DK++)                          // durchlaufe alle Tasten
      {
        if (digitalRead(taste_DK[b_DK]) == LOW) return;           // Wenn eine Taste gedrückt -> raus (falls Taste gegrückt gehalten wird)        
      }
      isKey_DK = false;                                        // Es war keine Taste gedrückt
    }
    else
    {
      for (byte b_DK = 0; b_DK < 4; b_DK++)                       // Frage Tasten
      {
        if (digitalRead(taste_DK[b_DK]) == LOW)                   // abgefragte Taste gedrückt?
        {
          Serial.print("gedrückter Button: ");
          Serial.println(taste_DK[b_DK]);                         // Zeige TastenCode
          correct_button(b_DK+1);                                   // prüfe, ob correct Taste gedrückt worden ist
          isKey_DK = true;                                        // Merke, das Taste gedrückt => Entprellen starten
        }
      }
    }
  }
}

void correct_button(int a)
{
  if(a == DK_cheat_LSG[DK_cheat_counter])                       //DK_cheat_LSG[4] = {1, 2, 3, 4};
    DK_cheat_counter++;                                         // korrekte Taste gedrückt, "pointer" an nächste Stelle setzen
  else if (a== 1)
    digitalWrite(R2_Solved, HIGH);                              // RESET Funktion => 2 mal gelb drücken => Diskokugel Rätsel NOT Solved => Relais auf HIGH ziehen  
  else
    DK_cheat_counter=0;                                         // korrekte Taste NICHT gedrückt, zurück auf Anfang springen
}

void disko_kugel_blinken()                                      // sobald Taste gedrückt wurde, Hintergrundbelechtung blinken lassen => User Rückmeldung
{
  digitalWrite(ledBel, LOW);                                 // Button Beleuchtung ausschalten
  delay(200);                                                // warten / blinken
  digitalWrite(ledBel, HIGH);                                 // Button Beleuchtung einschalten
  delay(200);
  //digitalWrite(ledBel, LOW);                                 // Button Beleuchtung ausschalten
  //delay(200);                                                // warten / blinken
  //digitalWrite(ledBel, HIGH);                                 // Button Beleuchtung einschalten
  //delay(200);
  //digitalWrite(ledBel, LOW);                                 // Button Beleuchtung ausschalten
  //delay(200);                                                // warten / blinken
  //digitalWrite(ledBel, LOW);                                 // Button Beleuchtung einschalten
}

//--------------------------------------------------------------------------------------------------------------------------------
// ENDE Funktionen R2: Diskokugel Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen R3: Bildschirm Rätsel
//--------------------------------------------------------------------------------------------------------------------------------

void verify_Bildschirm_Raetsel()                            // Bildschirm Rätsel abfragen
{
  if (digitalRead(Steckdose) == LOW)
  {  
    digitalWrite(R3_Solved, LOW);                           // Bildschirm Rätsel Solved => Relais auf LOW ziehen
    /*
    //hier fehlt noch die Abfrage, dass es nicht die Ganze Zeit piepst. 
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms 
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
    tone(33, NOTE_A5, 200);                                     // Ton (PIN 33) für 200 ms
    delay(250);
    */
  }  
  else
    digitalWrite(R3_Solved, HIGH);                          // Bildschirm Rätsel NOT Solved => Relais auf HIGH ziehen
}

//--------------------------------------------------------------------------------------------------------------------------------
// ENDE Funktionen R3: Bildschirm Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen R4: MA_des_Monats Rätsel
//--------------------------------------------------------------------------------------------------------------------------------

void verify_MA_des_Monats_Raetsel()                         // MA des Monats Rätsel abfragen
{
  key_pressed = customKeypad.getKey();                      // gedrückte Taste abfragen 

 if (key_pressed)                                          // gedrückte Taste verarbeiten
  {
      Serial.println(key_pressed);
      tone(13, NOTE_A5, 200);                                     // Ton (PIN 13) für 200 ms 
      keycode[R4_i]= key_pressed;                             // gedrückte Taste in keycode speichern
      R4_i++;                                               // hochzählen
  } 
  if(key_pressed=='#')                                      // '#' Taste => abfrage starten & Rest "Zählfunktion"
  {   
    compare();
  } 
}

void compare ()
{
  if (strncmp(keycode,"2637", 4) == 0 )                     // Array mit Lösungscode 2-6-3-7 vergleichen              
  {
    digitalWrite(R4_Solved, LOW);                           // MA_des_Monats Rätsel Solved => Relais auf LOW ziehen
    tone(33, NOTE_A5, 200);                                 // Ton (PIN 33) für 200 ms 
    delay(250);
    tone(33, NOTE_A5, 200);                                 // Ton (PIN 33) für 200 ms
    delay(250);
    tone(33, NOTE_A5, 200);                                 // Ton (PIN 33) für 200 ms
    delay(250);
    R4_i=0;
  }  
  else
  {
    digitalWrite(R4_Solved, HIGH);                          // MA_des_Monats Rätsel NOT Solved => Relais auf HIGH ziehen
    R4_i=0;
  }
}

//--------------------------------------------------------------------------------------------------------------------------------
// ENDE Funktionen R4: MA_des_Monats Rätsel
//--------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------
// Funktionen R5: RFID_PAD
//--------------------------------------------------------------------------------------------------------------------------------

void verify_RFID_PAD()                                     //RFID PAD abfragen
{ 
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())             //nur wenn Karte gefunden und gelesen werdnen kann
  {
    ///Diagnose START ----wird noch entfernt/////////////////////////////////////////
    // Show some details of the PICC (that is: the tag/card)
    Serial.print(F("Card UID:"));
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
        Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(mfrc522.uid.uidByte[i], HEX);
    }
    Serial.println();  
    ///Diagnose ENDE----wird noch entfernt/////////////////////////////////////////

    if (digitalRead(R1_Solved) == LOW && digitalRead(R2_Solved) == LOW)
    {
      if (digitalRead(R3_Solved) == LOW && digitalRead(R4_Solved) == LOW)
      {
        digitalWrite(Get_together, LOW);                  // Get_together Rätsel Solved => Open door => Signal PIN auf LOW ziehen
      }
      else
      {
      digitalWrite(Get_together, HIGH);                    // Get_together Rätsel NOT Solved => CLOSE door => Signal PIN auf HIGH lassen
      }
    }
    else
    {
      digitalWrite(Get_together, HIGH);                    // Get_together Rätsel NOT Solved => CLOSE door => Signal PIN auf HIGH lassen
    }
    // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können
    mfrc522.PICC_HaltA();
  }
}
//--------------------------------------------------------------------------------------------------------------------------------
// ENDE Funktionen R5: RFID_PAD
//--------------------------------------------------------------------------------------------------------------------------------

Ui... komplex :slight_smile:

Ja, das ist die Gefahr, bei so vielen gleichzeitig bespielten Rätsel-Baustellen. Da machen dir die vielen blockierenden Delays einen Strich durch den flüssigen Spieleablauf.

Tipp 1 zur Fehlerfindung: gaanz viele serielle Ausgaben über Eingangs- und Ausgangs-Status, z.B. welche Taste wurde gerade gedrückt, was ist gerade von inaktiv zu aktiv gewechselt etc..

Tipp 2 speziell zum RFID-Tag-Reader... daß der im Ablauf gerne mal den Dienst versagt, kann viele Ursachen haben: kurze Spannungseinbrüche bedingt durch Leitungslängen, mangelhafte Spannungsversorgung oder geschaltete Verbraucher. Ich habe in einem ähnlichen Projekt vor dem IsNewCardPresent() eine Zeile vorher ein mfrc522.PCD_Init(); (eventuell gefolgt von einem delay(1); ) gesetzt, so daß der Reader auch wirklich aktiviert ist. Am Ende hinter dem mfrc522.PICC_HaltA(); habe ich noch ein mfrc522.PCD_StopCrypto1(); dran. Ob es nötig ist, weiß ich nicht mehr.. :wink:

Hi @derGeppi vielen Dank für deine Tipps. DAs mit den seriellen Ausgaben habe ich teilweise schon gemacht...aber das probiere ich auf jeden Fall vertieft aus.
Ich habe auch mit ner zusätzlichen LED oder Pieper gearbeitet, die ich an den verschiedenen Stellen "anschalte", sodass ich sehe, ob ich in eine Funktion rein springe oder nicht.

Zwecks Tipp2: auch hierfür vielen Dank. Das hatte ich tatsächlich gar nicht auf dem Schirm. Das ist durchaus möglich, da ich auch eine Leitungslänge von gut 4-5m habe.
Die zusätzlichen Funktionselemente baue ich gleich heute Abend in meine Code ein.

Ist schon heftig für SPI Bus.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.