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.
Bin leider ziemlicher Anfänger und um jede Hilfe dankbar.!
Frohe Ostern euch!