Hey kurzes Update. Ich habe es geschafft, jedoch mit einem ziemlich blöden Manko:
Ich muss vor jeder neuen Eingabe '' drücken, dann die beiden Zahlen, dann '#'. Dann wird es ausgegeben und wenn ich wieder '' drücke, löscht sich der Display.
Ich würde es gerne so haben, dass man nur einmal beim Start des Arduinos '*' drücken muss, und es dann reicht, wenn man zwei Zahlen eingibt und '#' drückt.
Hier erstmal der Sketch:
#include <Keypad.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
char C1, C2; // Unter C1 bis C2 werden im Loop die zwei eingegebenen Zeichen gespeichert
int Anzahl;
int zehner , einer;
//Hier wird die größe des Keypads definiert
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
int z1 = 0, z2; // Diese Variablen werden verwendet um für die einzelnen Zahlencodes die Eingabe freizuschalten. Damit wird im Sketch verhindert, dass eine einzene Codeziffer einer falschen Position zugeordnet wird.
//Die Ziffern und Zeichen des Keypads werden eingegeben:
char hexaKeys[ROWS][COLS] = {
{'D', '#', '0', '*'},
{'C', '9', '8', '7'},
{'B', '6', '5', '4'},
{'A', '3', '2', '1'}
};
byte colPins[COLS] = {A0, A1, A2, A3}; //Definition der Pins für die 4 Spalten
byte rowPins[ROWS] = {A4, A5, 9, 10}; //Definition der Pins für die 4 Zeilen
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste.
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit "Tastenfeld" angesprochen werden
void setup()
{
lcd.begin(20, 4);
lcd.clear();
lcd.setBacklight(HIGH);
}
void loop()
{
// lcd.setCursor(0, 0);
// lcd.print("Drücke '*' um die ");
// lcd.setCursor(0, 1);
// lcd.print("Anzahl einzugeben!");
Anfang: // Dies ist eine Markierung, zu der per "goto-"Befehl gesprungen werden kann.
Taste = Tastenfeld.getKey(); //Mit Unter der Variablen pressedKey entspricht der gedrückten Taste
if (Taste) //Wenn eine Taste gedrückt wurde...
//Ab hier werden die Eingaben des Tastenfeldes verarbeitet. Zunächst die "*"Taste, da diese eine Sonderfunktion für die Verriegelung besitzt und danach die #-Taste, nach deren Eingabe der zuvor eingegebene Code auf Richtigkeit geprüft wird.
{
if (Taste == '*') // Wenn die "*" Taste gedrückt wurde...
{
if ( z1 != 0 && z2 != 1) {
lcd.clear();
}
z1 = 0; z2 = 1; // Zugang zur ersten Zeicheneingabe freischalten
goto Anfang; //An dieser Stelle springt der Sketch zur Eingabe der Taste zurück, damit das Zeichen "*" nicht im folgenden Abschlitt als Codeeingabe gewertet wird.
}
if (Taste == '#') // Wenn die Rautetaste gedrückt wurde...
{
if (z1 == 1 && z2 == 1 ) //wird gepüft, ob die eingaben Codezeichen (z1 bis z2) getätigt wurden
{
zehner = C1 - 48;
einer = C2 - 48;
Anzahl = zehner * 10 + einer;
lcd.setCursor(0, 0);
lcd.print("Anzahl Chips: ");
lcd.setCursor(8, 1);
lcd.print(Anzahl);
delay(300);
Anzahl = 0;
C1 = '0';
C2 = '0';
z1 = 0;
z2 = 0;
}
else
{
lcd.setCursor(0, 0);
lcd.print("Zwei Zahlen!");
z1 = 0; z2 = 1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
goto Anfang; //An dieser Stelle springt der Sketch zur Eingabe der Taste zurück, damit das Zeichen "#" nicht im folgenden Abschlitt als Codeeingabe gewertet wird.
}
}
// Ab hier werden die zwei Code-positionen unter den Variablen C1 bis C2 abgespeichert. Damit die eingegebenen Zeichen auch an der richtigen Position des Passwortes gespeichert werden, wird mit den Variablen z1 bis z2 der Zugang zu den einzelnen Positinen freigegeben oder gesperrt.
if (z1 == 0) // Wenn das erste Zeichen noch nicht gespeichert wurde...
{
C1 = Taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
z1 = 1; z2 = 0; // Zugang zur zweiten Zeicheneingabe freischalten
goto Anfang;
}
if (z2 == 0) // Wenn das zweite Zeichen noch nicht gespeichert wurde...
{
C2 = Taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
z1 = 1; z2 = 1;
goto Anfang;
}
}
}
Habt ihr eine schnelle Idee, wie ich das schreiben kann?
PS: Ich muss noch schreiben, dass man nur die Zahlen eingeben kann (Wenn man nach dem '', entweder 'A,B,C,D,#,' drückt, kommt was komisches raus)