#include <LiquidCrystal.h>
#include<Arduino_FreeRTOS.h>
#include<semphr.h>
#include <Servo.h>
Servo myServo;
uint8_t row =0;
uint8_t col =0;
const uint8_t no_rows =4;
const uint8_t no_cols =4;
char NewPass[4];
char ChangePass[4]={'*','1','1','*'};
char Pass[4]={'0','0','0','0'};
char key[4];
#define SERVO_PIN 5
uint8_t rowPins[no_rows]={7,8,9,10};
uint8_t colPins[no_cols]={13,12,11};
SemaphoreHandle_t semphr1;
SemaphoreHandle_t semphr2;
TaskHandle_t main_Handle;
TaskHandle_t check_Handle;
//LCD
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
//LCD
int buzzerPin = 6;
int ledpin = 4;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
semphr1 = xSemaphoreCreateBinary();
semphr2 = xSemaphoreCreateBinary();
xTaskCreate(mainTask,"Task",128,NULL,3,&main_Handle);
xTaskCreate(unlockTask,"Task",128,NULL,3,NULL);
xTaskCreate(checkTask,"Task",128,NULL,2,&check_Handle);
xTaskCreate(newNumTask,"Task",128,NULL,1,NULL);
for(int i=0; i < no_rows; i++){ pinMode(rowPins[i],OUTPUT); }
for(int i=0; i < no_cols; i++){ pinMode(colPins[i], INPUT_PULLUP);}
pinMode(6,OUTPUT);
attachInterrupt(digitalPinToInterrupt(2), ISR1,HIGH);
pinMode(4,OUTPUT);
attachInterrupt(digitalPinToInterrupt(3), ISR2,HIGH);
myServo.attach(5);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Click * to Enter");
lcd.setCursor(0, 1);
lcd.print("Click # to Change");
lcd.setCursor(0, 2);
lcd.print("LOCKED");
}
void loop() {}
void mainTask(void* pvParameters){
while(1){
taskENTER_CRITICAL();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter password:");
taskEXIT_CRITICAL();
lcd.setCursor(0,1);
myServo.write(90);
delay(500);
static uint8_t ix=0;
while(ix<4){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(13)== LOW)) {key[ix]='1'; lcd.print("1"); ix++; while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(13)== LOW)) {key[ix]='4';lcd.print("4");ix++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(13)== LOW)) {key[ix]='7';lcd.print("7");ix++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(13)== LOW)) {key[ix]='*';lcd.print("");ix++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&& (digitalRead(12)== LOW)) {key[ix]='2'; lcd.print("2");ix++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&& (digitalRead(12)== LOW)) {key[ix]='5';lcd.print("5");ix++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(12)== LOW)) {key[ix]='8';lcd.print("8");ix++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(12)== LOW)) {key[ix]='0';lcd.print("0");ix++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(11)== LOW)) {key[ix]='3'; lcd.print("3");ix++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(11)== LOW)) {key[ix]='6';lcd.print("6");ix++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(11)== LOW)) {key[ix]='9';lcd.print("9");ix++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(11)== LOW)) {key[ix]='#';lcd.print("#");ix++;while(digitalRead(11)== LOW){};}
}
if(key[0]==Pass[0] && key[1]==Pass[1] && key[2]==Pass[2] && key[3]==Pass[3]){ digitalWrite(2,HIGH);ix=0;vTaskSuspend(NULL);}
if(key[0]==ChangePass[0] && key[1]==ChangePass[1] && key[2]==ChangePass[2] && key[3]==ChangePass[3]){ix=0;digitalWrite(3,HIGH);vTaskSuspend(NULL);}
if (!(key[0]==Pass[0] && key[1]==Pass[1] && key[2]==Pass[2] && key[3]==Pass[3]))
{taskENTER_CRITICAL();
lcd.setCursor(0,0);
lcd.clear();
lcd.setCursor(0,1);
lcd.clear();
lcd.print("Wrong Password!!");
Alarm();
taskEXIT_CRITICAL();
delay(2000);
ix=0; } } }
void ISR1(){
digitalWrite(2,LOW);
xSemaphoreGiveFromISR(semphr1, NULL);
}
void ISR2(){
digitalWrite(3,LOW);
xSemaphoreGiveFromISR(semphr2, NULL);
}
void unlockTask(void *pvParameter){
while(1){
if(xSemaphoreTake(semphr1,portMAX_DELAY)==pdPASS){
taskENTER_CRITICAL();
lcd.clear();
lcd.print("Unlocked!! ");
lcd.setCursor(0,1);
taskEXIT_CRITICAL();
myServo.write(180);
delay(5000);
myServo.write(90);
vTaskResume(main_Handle);
}
} }
void checkTask(void *pvParameters){
while(1){
if(xSemaphoreTake(semphr2,portMAX_DELAY)==pdPASS){
taskENTER_CRITICAL();
lcd.clear();
lcd.print("Current Pass: ");
taskEXIT_CRITICAL();
lcd.setCursor(0,1);
////////////////////
uint8_t z=0;
while(z<4){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(13)== LOW)) {key[z]='1'; lcd.print("1"); z++; while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(13)== LOW)) {key[z]='4';lcd.print("4");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(13)== LOW)) {key[z]='7';lcd.print("7");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(13)== LOW)) {key[z]='*';lcd.print("*");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&& (digitalRead(12)== LOW)) {key[z]='2'; lcd.print("2");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&& (digitalRead(12)== LOW)) {key[z]='5';lcd.print("5");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(12)== LOW)) {key[z]='8';lcd.print("8");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(12)== LOW)) {key[z]='0';lcd.print("0");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(11)== LOW)) {key[z]='3'; lcd.print("3");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(11)== LOW)) {key[z]='6';lcd.print("6");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(11)== LOW)) {key[z]='9';lcd.print("9");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(11)== LOW)) {key[z]='#';lcd.print("#");z++;while(digitalRead(11)== LOW){};}
}
if(key[0]==Pass[0] && key[1]==Pass[1] && key[2]==Pass[2] && key[3]==Pass[3]){ z=0;digitalWrite(3,HIGH);vTaskSuspend(NULL);}
if(!(key[0]==Pass[0] && key[1]==Pass[1] && key[2]==Pass[2] && key[3]==Pass[3])){
taskENTER_CRITICAL();
lcd.clear();
lcd.print("Wrong Password!! ");
Alarm();
taskENTER_CRITICAL();
vTaskResume(main_Handle); }
////////////////////
}
}
}
void newNumTask(void *pvParameter){
while(1){
if(xSemaphoreTake(semphr2,portMAX_DELAY)==pdPASS){
taskENTER_CRITICAL();
lcd.clear();
lcd.print("Enter New Pass: ");
taskEXIT_CRITICAL();
lcd.setCursor(0,1);
/////////////////////
uint8_t z=0;
while(z<4){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(13)== LOW)) {key[z]='1'; lcd.print("1"); z++; while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(13)== LOW)) {key[z]='4';lcd.print("4");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(13)== LOW)) {key[z]='7';lcd.print("7");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(13)== LOW)) {key[z]='*';lcd.print("*");z++;while(digitalRead(13)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&& (digitalRead(12)== LOW)) {key[z]='2'; lcd.print("2");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&& (digitalRead(12)== LOW)) {key[z]='5';lcd.print("5");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(12)== LOW)) {key[z]='8';lcd.print("8");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(12)== LOW)) {key[z]='0';lcd.print("0");z++;while(digitalRead(12)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
if ((digitalRead(7)== LOW)&&(digitalRead(11)== LOW)) {key[z]='3'; lcd.print("3");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(8,LOW);
if ((digitalRead(8)== LOW)&&(digitalRead(11)== LOW)) {key[z]='6';lcd.print("6");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
if ((digitalRead(9)== LOW)&&(digitalRead(11)== LOW)) {key[z]='9';lcd.print("9");z++;while(digitalRead(11)== LOW){};}
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(10,LOW);
if ((digitalRead(10)== LOW)&&(digitalRead(11)== LOW)) {key[z]='#';lcd.print("#");z++;while(digitalRead(11)== LOW){};}
taskENTER_CRITICAL();
Pass[0]=key[0];
Pass[1]=key[1];
Pass[2]=key[2];
Pass[3]=key[3];
taskEXIT_CRITICAL();
}
vTaskResume(check_Handle);
vTaskResume(main_Handle);
////////////////////
}
}
}
void Alarm()
{
for (int i = 0; i < 5; i++)
{
PORTB |= 0b00000110; // digitalWrite(alarmPin, HIGH);
digitalWrite(4,HIGH);
tone(buzzerPin, 900);
vTaskDelay(pdMS_TO_TICKS(250)); // _delay_ms(250);
PORTB &= 0b11111001; // digitalWrite(alarmPin, LOW);
digitalWrite(4,LOW);
noTone(buzzerPin);
vTaskDelay(pdMS_TO_TICKS(250)); // _delay_ms(250);
}
}