Zahlenschloss mit Gültigkeitsprüfung

Hallo, ich bin totaler Anfänger und bin nun Stunden am ausprobieren, aber bekomme es einfach nicht so hin, wie ich es möchte. Nun seid Ihr meine einzige Hoffnung, und ich hoffe es ist einer unter Euch der mir in diesem komplexen Thema weiterhelfen kann...

Ich hab mir das folgende Projekt nachgebaut und es funktionier einwandfrei:

Nun möchte ich aber, dass mein eine bestimmte Nummer vom Personalausweis eingeben kann, anstatt ein festgelegten Zahlencode.
Diese besteht aus Jahr, Monat, Tag und als letzte Zahl aus einer Prüfnummer (Beispiel: 8405036) die Prüfnummer errechnet sich aus den 6 Zahlen davor mit einem bestimmten System.
Dabei wird jede Ziffer vom Geburtsdatum mit einem Wert multipliziert. Die erste Stelle wird mit dem Wert 7 multipliziert, die zweite mit dem Wert 3, die dritte Ziffer mit dem Wert 1. Danach beginnt diese Sequenz von vorne.
Beispiel für eine Gültigkeitsprüfung der Eingabe der Nummer aus dem Personalausweis: 8405036
(7×8)+(4×3)+(0×1)+(5×7)+(0
×3)+(3×1)=106
Die letzte Zahl 6 wäre also die richtige Prüfziffer. Diese Rechnung würde ich gerne als Gültigkeitsprüfung durchführen.
Ist die letzte Zahl, also die Prüfziffer korrekt und das eingegeben Geburtsdatum über 16, soll der Code gültig sein.
Weiß jemand wie dafür der Sourcecode aussehen müsste?

#include <LiquidCrystal.h>

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>

Servo myservo;

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

#define Password_Lenght 8 // Give enough room for six chars + NULL char

int pos = 0;    // variable to store the servo position

char Data[Password_Lenght]; // 6 is the number of chars it can hold + the null char = 7
char Master[Password_Lenght] = "8405036";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
bool door = true;

byte rowPins[ROWS] = {1, 2, 3, 4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 6, 7}; //connect to the column pinouts of the keypad

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

void setup()
{
  myservo.attach(9);
  ServoClose();
  lcd.begin(16, 2);
  lcd.print(" Arduino Door");
  lcd.setCursor(0, 1);
  lcd.print("--Look project--");
  delay(3000);
  lcd.clear();

}

void loop()
{
  if (door == 0)
  {
    customKey = customKeypad.getKey();

    if (customKey == '#')

    {
      lcd.clear();
      ServoClose();
      lcd.print("  Tür geöffnet");
      delay(3000);
      door = 1;
    }
  }

  else Open();
}

void clearData()
{
  while (data_count != 0)
  { // This can be used for any array size,
    Data[data_count--] = 0; //clear array for new data
  }
  return;
}

void ServoOpen()
{
  for (pos = 180; pos >= 0; pos -= 5) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

void ServoClose()
{
  for (pos = 0; pos <= 180; pos += 5) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

void Open()
{
  lcd.setCursor(0, 0);
  lcd.print("Nummer auf Perso");
  
  customKey = customKeypad.getKey();
  if (customKey) // makes sure a key is actually pressed, equal to (customKey != NO_KEY)
  {
    Data[data_count] = customKey; // store char into data array
    lcd.setCursor(data_count, 1); // move cursor to show each new char
    lcd.print(Data[data_count]); // print char at said cursor
    data_count++; // increment data array by 1 to store new char, also keep track of the number of chars entered
  }

  if (data_count == Password_Lenght - 1) // if the array index is equal to the number of expected chars, compare data to master
  {
     if (!strcmp(Data, Master)) // equal to (strcmp(Data, Master) == 0) 
    {
      lcd.clear();
      ServoOpen();
      lcd.print("  Door is Open");
      door = 0;
    }
    else
    {
      lcd.clear();
      lcd.print("  Wrong Password");
      delay(1000);
      door = 1;
    }
    clearData();
  }
}

Ich habe gedacht, dass man bei der Zeile "if (!strcmp(Data, Master))" die Gültigkeitsprüfung einsetzten kann, aber bei jedem Versuch bin ich gescheitert. Nun hoffe ich auf die Profis unter euch. :wink:
Bin leider ziemlicher Anfänger und um jede Hilfe dankbar.!
Frohe Ostern euch!

Also Du willst eine Zahl eingeben und wenn die Prüfzahl richtig ist dann etwas machen?

Ich verstehe Dein Problem (Knoten) nicht.
Du bekommst die Zahlen ja einzeln nacheinander. Da kannst Du gleich die Quersumme errechnen oder die eingegebenen Zahlen in einem Array nachspeichern und später die Prüfsumme errechnen.
Grüße Uwe

Hey Uwe vielen dank für deine schnelle Antwort und das Du dir für mein Problem Zeit genommen hast. Du scheinst auch ein nachtaktiv Mensch zu sein. :wink: Deine Methode hört sich plausibel an. Da ich mich erst seit ein paar Tagen mit dem Arduino und programmieren beschäftige muss ich mir erst mal beibringen, wie ich deinen Vorschlag im Code umsetze.
Grüße Martin