Smart intercom using GSM shield help me improve program !!!!

Hi guys as the title says i am currently working on the project to make the smart intercom , The main components i am using for this project are Arduino Mega 2560, GSM SHIELD, JHD 162A LCD Screen 8pin 4x4 Hex keypad, electric magnet , and some push buttons.

The project should work as follows

1: when i press the button it should call the number .
2: when i send the sms to GSM shield character 1 it should switch off the magnet
3: when i enter password in keypad it should also switch off the magnet
4: when i press the other push button it should also switch off the magnet

The problem i have is that the system works sometime well and some times some functions lag like lcd prints screen too late or some times when i press the button it does not initiate phone call what i am looking for is the improvement of the Code i am using below would really appreciate :slight_smile: ...

Below is the program i use:

#include <GSM.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Password.h>
Password password = Password( "1234" );
// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSMVoiceCall vcs;
GSM_SMS sms;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(33, 31, 29, 27, 25, 23);

char charbuffer[20];
char senderNumber[20];
int callbutton = 35 ;
int indoorbutton = 37 ;
int magnet = 39 ;
int xyz = 0;
const byte ROWS = 4; //four rows
const byte COLS = 4; // four columns
char keys[ROWS][COLS] = {
{'1','2','3','F'},
{'4','5','6','E'},
{'7','8','9','D'},
{'A','0','B','C'}
};
byte rowPins[ROWS] = {28, 26, 24, 22}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {36, 34, 32,30}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{

// initialize serial communications
Serial.begin(38400);
keypad.addEventListener(keypadEvent);
lcd.begin(16, 2);
pinMode(callbutton,INPUT);
pinMode(magnet,OUTPUT);
digitalWrite(magnet,HIGH);
digitalWrite(indoorbutton,HIGH);///// active low
digitalWrite(callbutton,HIGH); //// Active LOW
pinMode(indoorbutton,INPUT);
// connection state
boolean notConnected = true;

// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
vcs.hangCall(); // This makes sure the modem notifies correctly incoming events
Serial.println("GSM initialized.");
}
void loop()
{
//we put all read buttons here !!!!!!
callbutton = digitalRead(35) ;
indoorbutton = digitalRead(37);
keypad.getKey();

if (xyz == 0){

lcd.setCursor(0,0);
lcd.print("Press the button");
lcd.setCursor(0, 1);
lcd.print("to call owner");
}

if (xyz == 1) {
lcd.setCursor(0, 0); /////////// put timer here would look cooler
lcd.print("Call established");

}

if (callbutton == LOW){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Calling Owner");
vcs.voiceCall("0555566340");
}
xyz = 0;
switch (vcs.getvoiceCallStatus())
{
case IDLE_CALL:
break ;
case CALLING:
break ;
case TALKING:
xyz = 1;
break ;
case RECEIVINGCALL:
vcs.answerCall();
break;

}

////////////////////// SMS program

char c;

// If there are any SMSs available()
if (sms.available())
{
Serial.println("Message received from:");

// Get remote number
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

// An example of message disposal
// Any messages starting with # should be discarded
if (sms.peek() == '#')
{
Serial.println("Discarded SMS");
sms.flush();
}
// Read message bytes and print them
while (c = sms.read())
{
Serial.println(c);
if(c == '1'){
digitalWrite(magnet,LOW);
delay(6000);
digitalWrite(magnet,HIGH); }

Serial.println("END OF MESSAGE");

// Delete message from modem memory
sms.flush();
Serial.println("MESSAGE DELETED");

}
delay(1000);

}
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){

switch (keypad.getState()){
case m_key::PRESSED :
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey){
case 'A': checkPassword(); break;
case 'C': password.reset(); break;
default: password.append(eKey);
}
}
}

void checkPassword(){
if (password.evaluate()){
Serial.println("Success");
digitalWrite(magnet,LOW);
delay(6000);
digitalWrite(magnet,HIGH);

}else{
Serial.println("Wrong");
//add code to run if it did not work
}
if(indoorbutton == LOW)
{
digitalWrite(magnet,LOW);
delay(6000);
digitalWrite(magnet,HIGH);
}

}