LCD + Teclado matricial + Arduino

Quero fazer um projeto de fechadura com senha, porem minha dificuldade e na programação, pois eu fiz um codigo, mas ele nao funciona totalmente certo, quando eu coloco a senha certa aparece a mensagem de “acesso liberado” no display, mas quando eu vou digitar a senha errada antes de terminar ele ja dar “Sist Bloqueado”

o Codigo é esse ai:

#include <Wire.h>
#include <LiquidCrystal.h> //Esta biblioteca tem 2 versões uma está apropriada para o IDEv1.0
#include <Keypad.h>

//Inicialização do Display I2C
LiquidCrystal lcd(13,12, 11, 10, 9, 8);

int count = 0; //Contador de uso geral
char v[5];
char aux[5];
char pass = {’’, ‘8’, ‘1’, ‘0’, ‘0’, '’}; //Senha
/const int yellowPin = 11; //Definição do pino do LED Amarelo
const int redPin = 12; //Definição do pino do LED Vermelho
const int greenPin = 10; //Definição do pino do LED Verde
/
const int audioPin = 9; //Definição do pino do Buzzer
const int duration = 200; //Duração das sons tocados
const byte rows = 4; // quatro linhas
const byte cols = 3; // três colunas
char keys [rows] [cols] = {
{‘1’, ‘2’, ‘3’},
{‘4’, ‘5’, ‘6’},
{‘7’, ‘8’, ‘9’},
{’*’, ‘0’, ‘#’}
};
byte rowPins [rows] = {2, 3, 4, 5}; // conectar aos pinos de linha do teclado
byte colPins [cols] = {6, 7, A0}; // conectar aos pinouts da coluna do teclado
Keypad Teclado = Keypad (makeKeymap (keys), rowPins, colPins, rows, cols);

void setup(){
lcd.begin(16, 2); //Inicializa o LCD //Com Backlight
Serial.begin(9600); //Inicializa a comunicação serial a 9600 bps

//Deifinição de modo dos pinos
pinMode(audioPin, OUTPUT);
/pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
/
//Limpa LCD
key_init(); //Inicializa o sistema
}

//Loop Principal do Programa
void loop(){
char key = Teclado.getKey();
if(key != NO_KEY){ //Se foi pressionada uma tecla:
if (key == ‘#’) { //Se a tecla é ‘#’
code_entry_init(); //Então espera que seja inserida uma senha
int entrada = 0;
while (count <= 6 ){ //Conta 5 entradas/teclas
char key = Teclado.getKey(); //Obtém tecla pressionada
if (key != NO_KEY){ //Se foi pressionada uma tecla:
entrada++; //Faz entrada = entrada + 1
tone(audioPin, 1080, 100); //Para cada dígito emite um som de indicação
delay(duration); //Duração do som
noTone(audioPin); //Para de emitir som
if (key == pass[count]){
count += 1; //Se a tecla pressionada corresponde ao dígito

v[count];
}
else{
char num = Teclado.getKey();
num = aux;
if(aux != pass){
lcd.setCursor(0,0);
lcd.print("!Sist Bloqueado");
}

if(count == 6){
locked();
//Se contador chegou a 4 e com dígitos corretos,
if ((key == ‘#’) || (entrada == 6)){ //Se foi pressionada a tecla "#’ ou foram feitas
//4 entradas,
key_init(); //Inicializa o sistema
break; //Para o sistema e espera por uma tecla
} //desbloqueia siatema

}

}

if(count == 6){
unlocked();
//Se contador chegou a 4 e com dígitos corretos,
if ((key == ‘#’) || (entrada == 6)){ //Se foi pressionada a tecla "#’ ou foram feitas
//4 entradas,
key_init(); //Inicializa o sistema
break; //Para o sistema e espera por uma tecla
} //desbloqueia siatema

}

}
}
}
}

}

//Inicializar o Sistema
void key_init(){
lcd.clear(); //Limpa o LCD
lcd.print(“Aguardando…”); //Emite mensagem
lcd.setCursor(0,1); //Muda de linha
lcd.print(“Tecle #”); //Emite mensagem

count = 0; //Variável count é zero na inicialização

//Emite som e acende LED Vermelho, indicando Sistema Iniciado
/digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
tone(audioPin, 1080, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 980, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 770, 100);
delay(duration);
noTone(audioPin);
/
}

//Subrotina de Entrada da Senha
void code_entry_init(){
lcd.clear(); //Limpa LCD
lcd.print(“Entre a Senha:”); //Emite mensagem

count = 0; //Variável count é zero na entrada de senha

//Emite som e acende LEDs
/tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
digitalWrite(redPin, LOW); //Apaga LED Vermelho
digitalWrite(yellowPin, HIGH); //Acende LED Amarelo
digitalWrite(greenPin, LOW); //Apaga LED Verde
/
}

//Subrotina para Acesso Liberado
void unlocked(){
lcd.clear(); //Limpa LCD
lcd.print(“Acesso Liberado!”); //Emite mensagem
delay(5000);
/*digitalWrite(redPin, LOW); //Apaga LED Vermelho
//digitalWrite(yellowPin, LOW); //Apaga LED Amarelo

//Executa 20 vezes ± 5 segundos, emite som e pisca LED verde
for (int x = 0; x < 20; x++){
digitalWrite(greenPin, HIGH);
tone(audioPin, 2000, 100);
delay(duration);
noTone(audioPin);
digitalWrite(greenPin, LOW);
tone(audioPin, 2000, 100);
delay(duration);
noTone(audioPin);
delay(250);
}*/
}

Eu quero que apos eu digitar se a senha tiver errada apareça a mensagem e nao durante.

Boa noite amigo,
Você diz ao programa para a cada tecla apertada, verificar se o código está correto, exemplo:
Se vc digitar *,8,1,0,9 o erro só acontecerá quando você digitar o 9, mas se você digita *,7 o erro dará quando você digitar o 7, a mensagem de erro aparecerá assim que você digitar o primeiro digito errado.
Tenta fazer a comparação do código digitado com a senha só depois que o usuário digitar caracteres necessários!

    while (count <= 6 ){                                  //Conta 5 entradas/teclas
       char key = Teclado.getKey();                //Obtém tecla pressionada
       
       if (key != NO_KEY){                          //Verifica se alguma tecla foi presionada
          entrada++;                                   
          tone(audioPin, 1080, 100);                 
          delay(duration);                           
          noTone(audioPin);                          
          
         if (key == pass[count]){    <--- Aqui que verifica se a tecla corresponde a senha!
            count += 1;                     
          
          v[count];
         } 
         
         else{ <-------------  se a tecla não for igual ele roda essa parte
             
            char num = Teclado.getKey();
            num = aux;
            
            if(aux != pass){  <-------------- como são diferentes ele roda isso 
              lcd.setCursor(0,0);
              lcd.print("!Sist Bloqueado");
            }

Um conselho, escreva melhor seus códigos, demorei muito até entender todos esses IF, WHILE, ELSE.

Código da internet:

/*
 Sistema de trava para porta usando keypad 3x4 e LCD
 Leandro Blanes
 */

#include <LiquidCrystal.h>
#include <Keypad.h>
#include <EEPROM.h>

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {11, 6, 7, 9}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {10, 12, 8}; //connect to the column pinouts of the keypad

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

const int RELE = 13;

void setup() {
  lcd.begin(16, 2);
  lcd.print("Blanestech");
  inicializar();
  
  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, 0);

  keypad.addEventListener(keypadEvent);
}

void loop() {
  String senha = aguardarSenha();

  if (senha == lerSenhaEEPROM())
  {
    destravar();
    inicializar();
  }
  else
  {
    exibirLCD("Senha incorreta!");
    delay(1000);
    inicializar();
  }
}

String lerSenhaEEPROM()
{
  String senha = "";
  boolean temSenha = false;
  
  for(int pos = 0; pos < 20; pos++)
  {
    char c = EEPROM.read(pos);
    if (c == '#')
    {
      temSenha = true;
      break;
    }
      
    senha += c;
  }
  
  if (!temSenha)
    senha = "1234";

  return senha;
}

void gravarSenhaEEPROM(String novaSenha)
{
  for(int pos = 0; pos < novaSenha.length(); pos++)
  {
    EEPROM.write(pos, novaSenha[pos]);
  }
  EEPROM.write(novaSenha.length(), (int)'#');
}

String aguardarSenha()
{
  String senha = "";
  while(true)
  {
    char key = keypad.getKey();
  
    if (key){
      if (key == '#')
        return senha;
      if (key == '*')
        senha = "";
      else
        senha += key;
    }
  }
}

void exibirLCD(String mensagem)
{
  lcd.setCursor(0,1);
  lcd.print(mensagem + "                ");
}

void inicializar()
{
  exibirLCD("Digite a senha:");
}

void destravar()
{
  digitalWrite(RELE, HIGH);
  exibirLCD("Destravando...");
  delay(2000);
  digitalWrite(RELE, LOW);
}

void keypadEvent(KeypadEvent key)
{
  if (keypad.getState() == HOLD)
  {
    if (key == '*')
      alterarSenha();
  }
}

void alterarSenha()
{
  exibirLCD("Alterar Senha");
  delay(1000);

  exibirLCD("Senha Atual:");
  String senha = aguardarSenha();
  
  if (senha == lerSenhaEEPROM())
  {
    exibirLCD("Nova Senha:");
    String novaSenha = aguardarSenha();
    
    exibirLCD("Repita a Senha:");
    String confirmacaoNovaSenha = aguardarSenha();
    
    if (novaSenha == confirmacaoNovaSenha)
    {
      gravarSenhaEEPROM(novaSenha);
      exibirLCD("Senha alterada!");
      delay(1000);
    }
    else
    {
      exibirLCD("Erro! Tente novamente");
      delay(1000);
    }
  }
  else
  {
    exibirLCD("Senha incorreta!");
    delay(1000);
  }

  inicializar();
}