Introduing a 'BackSpace' Key to a KeyPad operated password locking system

Hello Every One,

Here i am having a code for multi-password locking system where i have a reset and enter key as per my requirement

Now i want to add a backspace key for deleting the wrong password or simply deleting the written characters one by one in back order

#include <Keypad.h>
#include <LCD_I2C.h>
#include <SoftwareSerial.h>

//const int RELAY_PIN  = A0; // the Arduino pin, which connects to the IN pin of relay
const int RELAY_PIN  = 12;
const int ROW_NUM    = 4; //four rows
const int COLUMN_NUM = 4; //four columns
char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3', 'A'},
  {'4','5','6', 'B'},
  {'7','8','9', 'C'},
  {'*','0','#', 'D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
LCD_I2C lcd(0x27, 16, 2);
const String password_1 = "1"; // change your password here
const String password_2 = "11"; // change your password here
String input_password;
void setup(){
  Serial.begin(9600);
  input_password.reserve(32);    // maximum input characters is 33, change if needed
  pinMode(RELAY_PIN, OUTPUT);    // initialize pin as an output.
  digitalWrite(RELAY_PIN, LOW); // lock the door
  lcd.begin();                  // initialize the lcd
  lcd.backlight();
}
void loop(){
  lcd.setCursor(0, 0);
  lcd.print("Enter Key Below!");
  char key = keypad.getKey();
  if (key)
  {
    //Serial.println(key);
    if(key == '*')
    {
      input_password = ""; // reset the input password
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Input Password");
      lcd.setCursor(5, 1);
      lcd.print("RESET");
      delay(500);
      lcd.clear();
    } 
    else if(key == '#')  
    {
      lcd.clear();
      if(input_password == password_1) //|| input_password == password_2) // || input_password == password_3) 
      {
        //Serial.println("password is correct");
        lcd.setCursor(3, 0);
        lcd.print("Warning");
        lcd.setCursor(0, 1);
        lcd.print("Kid Opened this Lock");
        digitalWrite(RELAY_PIN, HIGH);  // unlock the door for 20 seconds
        delay(1000);
        digitalWrite(RELAY_PIN, LOW); // lock the door
        //lcd.clear();  
      }      // if(input_password == password_1 || input_password == password_2 || input_password == password_3)
      else if(input_password == password_2) //|| input_password == password_2) // || input_password == password_3) 
      {
        //Serial.println("password is correct");
        lcd.setCursor(4, 0);
        lcd.print("CORRECT!");
        lcd.setCursor(1, 1);
        lcd.print("Lock Opened");
        digitalWrite(RELAY_PIN, HIGH);  // unlock the door for 20 seconds
        delay(3000);
        digitalWrite(RELAY_PIN, LOW); // lock the door
        //lcd.clear();        
      }
      else 
      { 
        //Serial.println("password is incorrect, try again"); 
        lcd.setCursor(0, 0);
        lcd.print("InValid Entry");
        lcd.setCursor(1, 1);
        lcd.print("ACCESS DENIED!");
        delay(2000);
        lcd.clear();
      }
      input_password = ""; // reset the input password
    } // else if end    
    else 
    {
      if(input_password.length() == 0) 
    {
        lcd.clear();
    }
      input_password += key; // append new character to input password string
      lcd.setCursor(input_password.length(), 1); // move cursor to new position
      lcd.print(key);                  // print key showing the character
    }   //  else last
  }   //    if (key) end [Every Thing Resides Under this key]
}   //      void loop end

Please help me in introducing a backspace button as i need it compulsorily for few things or issues i am facing in my project !!!

Thanks to all !

It looks like the "*" key has at least some of the functionality you need - couldn't you repurpose it?
Say, a long press for delete all and a short press for backspace?

Which key do you want to use as backspace ?

You would be much better off using a C style string rather than Strings. This would make it easy to move back by one character on receipt of a backspace by decrementing the index to the array that holds the string and inserting a zero into the array to mark the revised end position

Yeah yeah that will work too :+1:

But as i don't have much idea in deep here so please help me that short script

Thanks Sir !!!!!

I see . . So what script should be introduced there to get this working ?

Start by using an array of chars built from the keypad inputs

Some examples of how to do this

When you have the examples working make modifications to do as I suggested previously

This is what you do when you add a character to the end of 'input_pword":

Just do the opposite when you remove a character:

      lcd.setCursor(input_password.length(), 1); // move cursor to the last added character
      lcd.print(' ');  // Replace it with a blank
      input_password.remove(input_password.length());

O I see . . That way !!!!!!!!!!

Where to add this script actually Sir ?

Where you handle the backspace key. You will add that like you did the '#' key and '*' key. I am guessing you will choose the 'A', 'B', 'C', or 'D' key to be your backspace key.

Ya Sir after '*' & '#' I am planing to define 'B' as backspace key

But what about the tag for backspace key command ?

I don't understand the question. What do you mean by 'tag'?

Oh that's by mistake it was written 'tag'

Its script . . .

Sir here is way i have written the code for B

But its clearing the whole set of numbers at a time but not step by step backspace

 if(key == '*')
    {
      input_password = ""; // reset the input password
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Input Password");
      lcd.setCursor(5, 1);
      lcd.print("RESET");
      delay(500);
      lcd.clear();
    } 



    else if(key == 'B')
    {
      input_password.remove(input_password.length());
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print(' ');  // Replace it with a blank
      delay(100);
      lcd.clear();
    } 

Please Check !!

This is the part YOU added to clear the LCD completely. Twice. These five lines of code do not look like the three lines of code I wrote.

      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print(' ');  // Replace it with a blank
      delay(100);
      lcd.clear();

[/quote]

Ya Sir . . .

This one is removing a single digit only

if(key == '*')
    {
      input_password = ""; // reset the input password
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Input Password");
      lcd.setCursor(5, 1);
      lcd.print("RESET");
      delay(500);
      lcd.clear();
    } 
//*
    else if(key == 'B')
    { 
      lcd.setCursor(input_password.length(), 1); // move cursor to the last added character
      lcd.print(' ');  // Replace it with a blank
      input_password.remove(input_password.length());
    } 

I have written 11111 and press B so many times . . . . .
and result is like :

1111 only (from right side)

Sir have you checked #14 ????

Try this:

    else if(key == 'B')
    {
      if (input_password.length() > 0)
      {
        lcd.setCursor(input_password.length(), 1); // move cursor to the last added character
        lcd.print(' ');  // Replace it with a blank
        input_password.remove(input_password.length() - 1);
      }
    } 

Wowwww Sir !! All Set

Absolutely working . . .Thankssss

Sir, what if i want to introduce something like :

press and hold key 'B' a bit long

Then its going to erase the whole content at once
(as we find this function in most of the gadgets today)

You need to figure out a way to time key presses

Sir what would be the actual script ?

As you can see above that a small backspace function here needs different techniques to get on a final track

That's the reason I am asking for it's scripting and then I get a basic at least

Study the "Keypad -> MultiKey" example.

Do a single-character erase when you get a PRESSED state for kchar=='B' and do a full erase when you get a HOLD state for kchar=='B'.

The default long-press time is 500 milliseconds. You can set a different value with keypad.setHoldTime(milliseconds);