/*
*Simulazione del sistema di sicurezza di una cassaforte.
*Può essere definita la lunghezza del codice la quale dovrà essere rispettata (non può essere nè più lungo nè più corto)
*Vengono inseriti 2 codici: uno di sicurezza, e uno immesso dall'utente.
*Tramite un pulsate, l'utente può azzerare il proprio codice per "ritenteare".
*Se i due codici combaciano, verrà accesa una luce verde, altrimenti rossa.
*
*Autore: Matteo Ghilardini
*Ultima modifica: 29.05.2018
*/
//4 X 4 Switch matrix pressing code by haneefputtur.com
//Using Push Buttons to create 4 X 4 Switch matrix. Can be extended to more buttons
//Data will be displayed in serial monitor for testing project
byte h = 0, v = 0; //variables used in for loops
const unsigned long period = 50; //little period used to prevent error
unsigned long kdelay = 0; // variable used in non-blocking delay
const byte rows = 4; //number of rows of keypad
const byte columns = 4; //number of columnss of keypad
const byte Output[rows] = {11, 10, 9, 8}; //array of pins used as output for rows of keypad
const byte Input[columns] = {7, 6, 5, 4}; //array of pins used as input for columnss of keypad
String code = "";
int codeLength = 6;
bool codeChanged = false;
boolean isReading = true;
String userCode = "";
int funz;
byte keypad() // function used to detect which button is used
{
static bool no_press_flag = 0; //static flag used to ensure no button is pressed
for (byte x = 0; x < columns; x++) // for loop used to read all inputs of keypad to ensure no button is pressed
{
if (digitalRead(Input[x]) == HIGH); //read evry input if high continue else break;
else
break;
if (x == (columns - 1)) //if no button is pressed
{
no_press_flag = 1;
h = 0;
v = 0;
}
}
if (no_press_flag == 1) //if no button is pressed
{
for (byte r = 0; r < rows; r++) //for loop used to make all output as low
digitalWrite(Output[r], LOW);
for (h = 0; h < columns; h++) // for loop to check if one of inputs is low
{
if (digitalRead(Input[h]) == HIGH) //if specific input is remain high (no press on it) continue
continue;
else //if one of inputs is low
{
for (v = 0; v < rows; v++) //for loop used to specify the number of row
{
digitalWrite(Output[v], HIGH); //make specified output as HIGH
if (digitalRead(Input[h]) == HIGH) //if the input that selected from first sor loop is change to high
{
no_press_flag = 0; //reset the no press flag;
for (byte w = 0; w < rows; w++) // make all outputs as low
digitalWrite(Output[w], LOW);
return v * 4 + h; //return number of button
}
}
}
}
}
return 50;
}
void setup()
{
for (byte i = 0; i < rows; i++) //for loop used to make pin mode of outputs as output
{
pinMode(Output[i], OUTPUT);
}
for (byte s = 0; s < columns; s++) //for loop used to makk pin mode of inputs as inputpullup
{
pinMode(Input[s], INPUT_PULLUP);
}
Serial.begin(9600); //to use serial monitor we set the buad rate
pinMode(20, OUTPUT); //RED
pinMode(22, INPUT); //switch read
pinMode(19, INPUT); //button read
pinMode(24, OUTPUT); //BLUE
pinMode(26, OUTPUT); //GREEN
pinMode(52, OUTPUT); //+5
pinMode(50, OUTPUT); //GND
pinMode(37, OUTPUT); //green Center
pinMode(35, OUTPUT); //green LeftUp
pinMode(33, OUTPUT); //green Up
pinMode(31, OUTPUT); //green RightUp
pinMode(29, OUTPUT); //green LeftDown
pinMode(27, OUTPUT); //green Down
pinMode(25, OUTPUT); //green RightDown
pinMode(23, OUTPUT); //green DOT
}
void loop()
{
digitalWrite(52, HIGH);
digitalWrite(50, LOW);
int pot = map(analogRead(A15), 0, 1023, 0, 9);
if (codeChanged == false) {
codeLength = pot;
} else {
digitalWrite(23, HIGH);//dot
}
if (codeLength == 0) {
digitalWrite(37, LOW);//center
digitalWrite(35, LOW);//LU
digitalWrite(33, LOW);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, LOW);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 1) {
digitalWrite(37, HIGH);//center
digitalWrite(35, LOW);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, HIGH);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, LOW);//RD
} else if (codeLength == 2) {
digitalWrite(37, HIGH);//center
digitalWrite(35, LOW);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 3) {
digitalWrite(37, HIGH);//center
digitalWrite(35, HIGH);//LU
digitalWrite(33, LOW);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, LOW);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 4) {
digitalWrite(37, HIGH);//center
digitalWrite(35, HIGH);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, LOW);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 5) {
digitalWrite(37, HIGH);//center
digitalWrite(35, HIGH);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, LOW);//RU
digitalWrite(29, HIGH);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 6) {
digitalWrite(37, LOW);//center
digitalWrite(35, LOW);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, LOW);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 7) {
digitalWrite(37, HIGH);//center
digitalWrite(35, HIGH);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, HIGH);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, HIGH);//RD
} else if (codeLength == 8) {
digitalWrite(37, HIGH);//center
digitalWrite(35, HIGH);//LU
digitalWrite(33, HIGH);//U
digitalWrite(31, HIGH);//RU
digitalWrite(29, LOW);//LD
digitalWrite(27, HIGH);//D
digitalWrite(25, HIGH);//RD
}
if (digitalRead(22) == LOW) {
digitalWrite(20, HIGH); //RED
digitalWrite(24, LOW); //BLUE
digitalWrite(26, HIGH); //GREEN
Serial.println(digitalRead(19));
if (digitalRead(19) == HIGH) {
userCode = "";
}
isReading = true;
} else {
digitalWrite(20, HIGH); //RED
digitalWrite(24, HIGH); //BLUE
digitalWrite(26, HIGH); //GREEN
isReading = false;
}
if (millis() - kdelay > period) //used to make non-blocking delay
{
kdelay = millis(); //capture time from millis function
switch (keypad()) //switch used to specify which button
{
case 0:
codeChanged = true;
Serial.println(3);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 3;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 3;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ABCD
}
break;
case 1:
codeChanged = true;
Serial.println(7);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 7;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 7;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ABC
}
break;
case 2:
codeChanged = true;
Serial.println('B');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "B";
digitalWrite(49, LOW); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "B";
digitalWrite(49, LOW); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
case 3:
codeChanged = true;
Serial.println('F');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "F";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "F";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
case 4:
codeChanged = true;
Serial.println(2);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 2;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 2;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
//ABGED
break;
case 5:
codeChanged = true;
Serial.println(6);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 6;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 6;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ACDEFG
}
break;
case 6:
codeChanged = true;
Serial.println('A');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "A";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "A";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
case 7:
codeChanged = true;
Serial.println('E');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "E";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "E";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
case 8:
codeChanged = true;
Serial.println(1);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 1;
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 1;
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
}
//BC
}
break;
case 9:
codeChanged = true;
Serial.println(5);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 5;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 5;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ACDFG
}
break;
case 10:
codeChanged = true;
Serial.println(9);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 9;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 9;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ABCDFG
}
break;
case 11:
codeChanged = true;
Serial.println('D');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "D";
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "D";
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, LOW); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
case 12:
codeChanged = true;
Serial.println(0);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 0;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 0;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ABCDEF
}
break;
case 13:
codeChanged = true;
Serial.println(4);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 4;
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 4;
digitalWrite(49, LOW); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, LOW); //D-2
digitalWrite(45, LOW); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//BCFG
}
break;
case 14:
codeChanged = true;
Serial.println(8);
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += 8;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += 8;
digitalWrite(49, HIGH); //A-7
digitalWrite(47, HIGH); //B-6
digitalWrite(41, HIGH); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, HIGH); //G-10
digitalWrite(39, LOW); //DOT-5
}
//ABCDEFG
}
break;
case 15:
codeChanged = true;
Serial.println('C');
if (code.length() <= codeLength || userCode.length() <= codeLength) {
if (isReading == false && code.length() <= codeLength) {
code += "C";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
} else if (isReading == true && userCode.length() <= codeLength) {
userCode += "C";
digitalWrite(49, HIGH); //A-7
digitalWrite(47, LOW); //B-6
digitalWrite(41, LOW); //C-4
digitalWrite(43, HIGH); //D-2
digitalWrite(45, HIGH); //E-1
digitalWrite(51, HIGH); //F-9
digitalWrite(53, LOW); //G-10
digitalWrite(39, LOW); //DOT-5
}
}
break;
default:
;
}
Serial.print("Code: ");
Serial.println(code + "-" + userCode);
if (code.length() > codeLength && userCode.length() > codeLength) {
if (userCode == code) {
digitalWrite(24, HIGH); //BLUE
digitalWrite(20, HIGH); //RED
digitalWrite(26, LOW); //GREEN
} else {
digitalWrite(24, HIGH); //BLUE
digitalWrite(20, LOW); //RED
digitalWrite(26, HIGH); //GREEN
}
delay(100);
}
}
}