Ich habe so etwas schon mit einer Tastatur 4*3 0-9A-F gemacht.
Das Programm steuerte zwei Garagentore die ich mit der Tastaur aufgemacht habe (jeweils ein Passwort für ein Tor).
Funktion:
-Eingabe das Passwortes öffente da entsprechende Tor)
-nur bestätigung der Eingabe egal ob falsch oder richtig durch die LED.
-Timeout nach einer bestimmten Zeit wird da Speicher array gelöscht.
-Funktion zum vergleichen des Speicher Arrays mit dem Passwortarray
#include <avr/pgmspace.h>
// Mega
#define r1 8 // 24 //Row 1 connected Pin24 Connection Mega Board
#define r2 7 //25 //Row 2 connected Pin25
#define r3 9 //23 //Row 3 connected Pin23
#define r4 10 //22 //Row 4 connected Pin22
#define c1 3 //29 //Colmn 1 connected Pin 29
#define c2 4 //28 //Colmn 2 connected Pin 28
#define c3 5 //27 //Colmn 3 connected Pin 27
#define c4 6 //26 //Colmn 4 connected Pin 26
#define LEDgn 18
#define LEDrd 19
#define Rel1 14
#define Rel2 15
int Num[]={ // Array four Matrix Post look like
7, 8, 9,10, // 7, 8, 9, A
4, 5, 6,11, // 4, 5, 6, B
1, 2, 3,12, // 1, 2, 3, C
0,15,14,13}; // 0, F, E, D
int PW1[5]={ // Password for the first Door
3,2,6,4,11}; // 3264 and B to confrim (in German it is easier to hit B)
int PW2[5]={ // 4632 and B to confrim
4,6,2,3,11};
int PACT[5]; // Actual Array for the save
unsigned long pmil1; // for timer
unsigned long pmilLast; // for timer
int ArrayLeer= 1;
long pause1 = 2;
long timeout = 5000;
int ring=1;
int last=0;
int I1=0;
int I2=0;
int I3=0;
int I4=0;
int x=0;
int y=0;
int z=0;
int i=0;
int r;
int HR=LOW;
void setup(){
//decalarations
pinMode(r1,OUTPUT);
pinMode(r2,OUTPUT);
pinMode(r3,OUTPUT);
pinMode(r4,OUTPUT);
pinMode(c1,INPUT);
pinMode(c2,INPUT);
pinMode(c3,INPUT);
pinMode(c4,INPUT);
pinMode(LEDgn,OUTPUT); // Relais 1 door opener 1
pinMode(LEDrd,OUTPUT); // Relais 2 door opener 2
pinMode(Rel1,OUTPUT); // red LED of the DUO LED is connected here
pinMode(Rel2,OUTPUT); // green LED of the DUO LED is connected here
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
digitalWrite(r3,HIGH);
digitalWrite(r4,HIGH);
digitalWrite(c1,HIGH);
digitalWrite(c2,HIGH);
digitalWrite(c3,HIGH);
digitalWrite(c4,HIGH);
// Serial.begin(9600); // only for debug in normal operation all serial can be deleted
}
void loop(){
if (millis() - pmil1 >pause1) { // Ringtimer for Array Request
pmil1=millis();
if (ring <=4){
ring=++ring;
}
if (ring==5){
ring=1;
}
}
if (ring==1){ // Slope Row1
digitalWrite(r1,LOW);
x=0;
}
else
digitalWrite(r1,HIGH);
if (ring==2){ // Slope Row2
digitalWrite (r2,LOW);
x=4;
}
else
digitalWrite (r2,HIGH);
if (ring==3){ // Slope Row3
digitalWrite(r3,LOW);
x=8;
}
else
digitalWrite(r3,HIGH);
if (ring==4){ // Slope Row4
digitalWrite (r4,LOW);
x=12;
}
else
digitalWrite (r4,HIGH);
I1=digitalRead(c1); // Request Colmns 1-4
I2=digitalRead(c2);
I3=digitalRead(c3);
I4=digitalRead(c4);
if (I1==LOW) // mapping pointer y pos
y=1;
if (I2==LOW)
y=2;
if (I3==LOW)
y=3;
if(I4==LOW)
y=4;
if (I1==HIGH&&I2==HIGH&&I3==HIGH&&I4==HIGH)
y=0;
if (I1==LOW||I2==LOW||I3==LOW||I4==LOW){ // do when one key is pressed
z=x+(y-1);
PACT[i]= Num[z];
i=++i;
r= Num[z];
ArrayLeer=0;
pmilLast=millis();
HR=LOW;
digitalWrite(LEDrd,HIGH);
delay(500);
digitalWrite(LEDrd,LOW);
/*
Serial.println(i); // only for debug
Serial.println(r);
Serial.print(PW1[0]);
Serial.print(PW1[1]);
Serial.print(PW1[2]);
Serial.print(PW1[3]);
Serial.println(PW1[4]);
Serial.print(PACT[0]);
Serial.print(PACT[1]);
Serial.print(PACT[2]);
Serial.print(PACT[3]);
Serial.println(PACT[4]);
*/
}
if(ArrayLeer==1){ // Array is empty the green LED switched on to see ready for input
digitalWrite(LEDgn,HIGH);
}
else{
digitalWrite(LEDgn,LOW);
}
if (ArrayLeer==0 &&(millis() - pmilLast >timeout)){ // if longer then 5 sec no key pressed the Array will be reseted
ArrayReset();
// Serial.println("Array Reset timeout");
}
if (r==13&&HR==LOW || i>=6){ // if the switch D is pressed of the array pointer equal or biggger 6 array will be reseted
ArrayReset();
HR=HIGH;
//digitalWrite(11,HIGH);
// Serial.println("Array Reset");
}
if (array_cmp(PW1, PACT, 5, 5) == true){ // Array comparison with the act array and the saved Password1
// Serial.println("Tor 1 auf");
digitalWrite(Rel1,HIGH); // Turn on the LED to see the array is true Here you can set ther relais or someting
digitalWrite(LEDrd,HIGH); // Relais 1 for door one switch on
delay(750); // Time to react
digitalWrite(Rel1,LOW);
digitalWrite(LEDrd,LOW);
ArrayReset();
}
if (array_cmp(PW2, PACT, 5, 5) == true){ // Array comparison with the act array and the saved Password2
// Serial.println("Tor 2 auf");
digitalWrite(Rel2,HIGH);
digitalWrite(LEDrd,HIGH); // Relais 2 for door one switch on
delay(750);
digitalWrite(Rel2,LOW);
digitalWrite(LEDrd,LOW);
ArrayReset();
}
}
boolean array_cmp(int *a, int *b, int len_a, int len_b){ // Array comparion Funtion
int n;
// if their lengths are different, return false
if (len_a != len_b) return false;
// test each element to be the same. if not, return false
for (n=0;n<len_a;n++) if (a[n]!=b[n]) return false;
//ok, if we have not returned yet, they are equal :)
return true;
}
void ArrayReset() { // Array Reset Function
i=0;
PACT[0]=0;
PACT[1]=0;
PACT[2]=0;
PACT[3]=0;
PACT[4]=0;
ArrayLeer=1;
digitalWrite(LEDrd,HIGH);
delay(500);
digitalWrite(LEDrd,LOW);
}