/*
Made by Berend Koedam Fri 6 May.
Pretty self explanatory. The "A,B,C,D,*,0,#" dont do anything.
to set a code put it in the const byte "code" seporated by a ,
Dont tell me my programing sucks, I know.
PS I didnt feel like commenting everything.
*/
//Includes library
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>
//LCD pins
const byte rs = 12, en = 11, d4 = A0, d5 = A1, d6 = A2, d7 = A3, R = 10, G = 13, B = A5, servoPin = 6;
//Keypads rows and colloms
const byte ROWS = 3;
const byte COLS = 3;
//Tells the arduino what the code is
const byte code[4] = {1,2,3,4};//Enter code here(single digit higher than 0)
//Sets the code to 0 0 0 0 on startup
byte input[4] = {0,0,0,0};
//Initiates the keypad
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
};
//Tells the ardiuno what the pins are for what rows or cols
byte colPins[COLS] = {5, 4, 3,};
byte rowPins[ROWS] = {9, 8, 7,};
//Sets up the keypad 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//sets u servo
Servo servo;
//void setup
void setup()
{
  servo.attach(6);
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
 lcd.print("  ENTER  CODE:");
 lcd.setCursor(3, 1);
  for(int i = 0; i < 4; i++)
  {
    lcd.println(input[i]);
  }
  digitalWrite(R, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(B, LOW);
  servo.write(0);
}
 
void loop()
{
 char key = keypad.getKey();
 lcd.setCursor(3, 1);
 if (key != NO_KEY && input[0] == 0)
 {
  blinkYellow();
  input[0] = key - 48;
  if(input[0] <= 9)
  {
    for(int i = 0; i < 4; i++)
    {
      lcd.println(input[i]);
    }
  }
 }
 else if(key != NO_KEY && input[1] == 0)
 {
  blinkYellow();
  lcd.setCursor(3, 1);
  input[1] = key - 48;
  if(input[1] <= 9)
  {
    for(int i = 0; i < 4; i++)
    {
      lcd.println(input[i]);
    }
  }
 }
 else if(key != NO_KEY && input[2] == 0)
 {
  blinkYellow();
  lcd.setCursor(3, 1);
  input[2] = key - 48;
  if(input[2] <= 9)
  {
    for(int i = 0; i < 4; i++)
    {
      lcd.println(input[i]);
    }
  }
 }
 else if(key != NO_KEY && input[3] == 0)
 {
  blinkYellow();
  lcd.setCursor(3, 1);
  input[3] = key - 48;
  if(input[3] <= 9)
  {
    for(int i = 0; i < 4; i++)
    {
      lcd.println(input[i]);
    }
  }
 }
 
  if(input[0] == code[0] && input[1] == code[1] && input[2] == code[2] && input[3] == code[3] )
  {
   allowed();
  }
  else if(input != code && input[3] > 0)
  {
   denied();
  }
}
void allowed()
{
  servo.write(90);
  digitalWrite(R, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(B, HIGH);
  delay(750);
  lcd.setCursor(0, 0);
  lcd.println("  A C C E S S ");
  lcd.setCursor(0, 1);
  lcd.println(" G R A N T E D ");
  delay(5000);
  servo.write(0);
  digitalWrite(R, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(B, LOW);
  lcd.setCursor(0, 0);
  lcd.print("  ENTER  CODE:  ");
  lcd.setCursor(1, 1);
  lcd.print("  ");
  for(int i = 0; i < 4; i++)
  {
    input[i] = 0;
  }
  lcd.setCursor(3, 1);
  for(int i = 0; i < 4; i++)
  {
    lcd.println(input[i]);
  }
}
void denied()
{
  servo.write(0);
  delay(500);
  lcd.setCursor(0, 0);
  lcd.println("  A C C E S S ");
  lcd.setCursor(0, 1);
  lcd.println("  D E N I E D ");
  digitalWrite(R, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(B, HIGH);
  delay(2000);
  digitalWrite(R, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(B, LOW);
  lcd.setCursor(2, 0);
  lcd.print("ENTER  CODE:  ");
  lcd.setCursor(1, 1);
  lcd.print("  ");
  for(int i = 0; i < 4; i++)
  {
    input[i] = 0;
  }
  lcd.setCursor(3, 1);
  for(int i = 0; i < 4; i++)
  {
    lcd.println(input[i]);
  }
}
void blinkYellow()
{
  digitalWrite(R, LOW);
  digitalWrite(G, LOW);
  digitalWrite(B, HIGH);
  delay(100);
  digitalWrite(R, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(B, LOW);
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
lcd1:VSS
lcd1:VDD
lcd1:V0
lcd1:RS
lcd1:RW
lcd1:E
lcd1:D0
lcd1:D1
lcd1:D2
lcd1:D3
lcd1:D4
lcd1:D5
lcd1:D6
lcd1:D7
lcd1:A
lcd1:K
rgb1:R
rgb1:COM
rgb1:G
rgb1:B
servo1:GND
servo1:V+
servo1:PWM