Duvidas Tranca Arduino

Galera, boa noite.

Estou começando nesse mundo do arduino e cada vez mais estou adorando programar e colocar meus projetos em pratica. Pois bem! Hoje desde as 9 da manha, estou tentando finalizar meu projeto, porem sem exito.

Trata-se de um projeto totalmente baseado num que encontrei na net, que é um controle de acesso via senha. By ARDUINO By Myself: Arduino - Sistema de Segurança, Controle de Acesso.

Com muito custo, consegui colocar um servo motor para servir como "tranca", porem com o loop a tranca abre e logo em seguida ele fecha!

Estou tentando colocar para que apos ele abrir, fique esperando que o usuario tecle novamente qualquer letra, fazendo com que o motor seja acionado, fechando a tranca.

Ai que ta, nao consigo de nenhuma maneira, alguem pode me dar um help?

Segue o codigo:

// inclusão de bilibotecas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// declara LCD, endereço e tipo
const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 9, 10, 11, 12);




// declarção de variáveis
int count = 0;


char pass [6] = {'1', '2', '3', '4', '5', '6' }; // senha padrão



const int yellowPin = A1;
const int redPin = A2;
const int greenPin = A0;
const int audioPin = 13;
const int duration = 200;
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', '#'}
};// deinição do layout do teclado
byte rowPins[ROWS] = {5, 4, 3, 2}; // pinagem para as linhas do teclado
byte colPins[COLS] = {6, 7, 8}; // pinagem para as colunas do teclado
// mapeamento do teclado
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
lcd.begin(16, 2); // inicializa o LCD
lcd.backlight(); // com backlight
Serial.begin(9600); // inicializa serial
// modo dos pinos de audio e LEDs
pinMode(audioPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
lcd.clear();// limpa LCD
key_init();// inicializa processo
myStepper.setSpeed(300); // velocidade do motor

}

void loop() {
char key = keypad.getKey(); // obtém informação do teclado
if (key != NO_KEY) { // se foi teclado algo
  if (key == '#') {// se foi teclado #
    code_entry_init(); // mensagem, som e LED
    int entrada = 0; // variável de apoio; números de entradas feitas via teclado
    while (count < 6 ) { // enquanto não entrou os 4 números necessários para a senha
      char key = keypad.getKey(); // obtém informação do teclado
      if (key != NO_KEY) { // se foi teclado algo
        entrada += 1; // aumenta contrador de entradas
        tone(audioPin, 1080, 100); // sinal audível
        delay(duration);
        noTone(audioPin);
        if (key == pass[count])count += 1; // verifica na sequencia da senha, se correto aumenta contador
        if ( count == 6 ) {
          unlocked(); // chegou a 4 digitos corretos, libera acesso
        }
        if ((key == '#') || (entrada == 6)) { // foi teclado # ou 4 entradas incorretas
          key_init();// inicializa
          break;// interrompe loop




        }
      }
    }
  }
  if (key == '*') { // se foi teclado *
    old_pass_check();// mensagem para entrar a senha antiga
    int entrada = 0;
    while (count < 6 ) {
      char key = keypad.getKey();
      if (key != NO_KEY) {
        entrada += 1;
        tone(audioPin, 1080, 100);
        delay(duration);
        noTone(audioPin);
        if (key == pass[count])count += 1;
        if ( count == 6 ) { // foi teclado a senha antiga corretamente
          get_new_pass();// chama função para entrada da nova senha
        }
        if ((key == '*') || (entrada == 6)) { // foi teclado * ou entrou 4 números errados
          key_init();// inicializa
          break; // interrompe loop
        }
      }
    }
  }
}
}

void locked() {
lcd.clear();
lcd.print("    ACESSO,");
lcd.setCursor(0, 1);
lcd.print("    NEGADO!");
for (int i = 0; i < 11; i++) {
  tone(audioPin, 1080, 100);
  digitalWrite(yellowPin, LOW);
  digitalWrite(redPin, HIGH);
  delay(duration);
  noTone(audioPin);
  digitalWrite(redPin, LOW);
  delay(100);
}
delay(1000);
}



void get_new_pass() {
new_pass_entry(); // mensagem, som e LED
int entrada = 0; // inicializa entrada
while (count < 6) { // enquanto contrador for menor que 4
  char key = keypad.getKey(); // obtem informação do teclado
  if (key != NO_KEY) { // se algo foi teclado
    entrada += 1; // aumenta contador de entrada
    tone(audioPin, 1080, 100); // tom para cada dígito
    delay(duration);
    noTone(audioPin);
    pass[count] = key; // aramazena o novo dígito
    count += 1; // próximo dígito
    if (count == 6) break; // chegou a 4 digitos, interrompe loop
    if ((key == '*') || (entrada == 6)) { // foi telcado * 4 entradas
      key_init();// inicializa sistema
      break; // sai
    }
  }
}
}


void new_pass_entry() {
// mensagem no display
lcd.clear();
lcd.print("   Nova Senha");
count = 0;
lcd.setCursor(0, 1);
lcd.print("    Tecle *");
// gera sinal audível
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
// somente LED amarelo aceso
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
}

void old_pass_check() {
// mensagem no display
lcd.clear();
lcd.print("  Senha antiga?");
count = 0;
lcd.setCursor(0, 1);
lcd.print("    Tecle *");
// gera tom audível
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
// somente LED amarelo aceso
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
}


void key_init () {
// mensagem no display
lcd.clear();
lcd.print("# Digitar Senha");
lcd.setCursor(0, 1);
lcd.print("* Trocar Senha");
count = 0;// contador para zero
// somente LED vermelho aceso
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
// gera tom audível
tone(audioPin, 1080, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 980, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 770, 100);
delay(duration);
noTone(audioPin);
}

void code_entry_init() {
// mensagem no display
lcd.clear();
lcd.print(" Entre a Senha:");
count = 0; // contador para zero
// gera sinal audível
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
tone(audioPin, 1500, 100);
delay(duration);
noTone(audioPin);
// somente LED amarelo aceso
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
}

void unlocked() {
// mensagem no display
lcd.clear();
lcd.print("Carregando...");
// somente LED verde aceso
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
for (int f = 0; f < 32; f++) {
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, HIGH);
  digitalWrite(redPin, HIGH);
  myStepper.step(-16); // sentido horario
  //delay(50);
  digitalWrite(yellowPin, LOW);
  digitalWrite(redPin, LOW);
}
lcd.clear();
lcd.print("Acesso Liberado!");

// pisca LED verde e gera sinal audível
for (int x = 0; x < 5; 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);
}


for (int f = 0; f < 32; f++){
              myStepper.step(16); // sentido horario
              //delay(50);
 
}
}

Viva! Bem-vindo ao fórum. Devia ter lido primeiro as regras antes de postar.

Esta parte:

for (int f = 0; f < 32; f++){
               myStepper.step(16); // sentido horario
               //delay(50);
 
 }

Fecha de novo o trinco do portão. Apenas tem que correr esta parte do programa depois de teclar outra coisa.

PS.: É assim que se posta código aqui no fórum.

Confesso q nao lia as regras, peço desculpas.

Em relacao ao codigo q vc mencionou, eu coloquei ele ja em diversos pontos do codigo, mas aonde ele ja esta, faz o loop inicial fechando a tranca, sem o usuario teclar nada.

Obrigado.

luisilva,

Fiz as alteracoes no post inicial, ficando de acordo com as regras. Obrigado.

Qualquer coisa como isto funcionaria?

// inclusão de bilibotecas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// declara LCD, endereço e tipo
const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 9, 10, 11, 12);


// declarção de variáveis
int count = 0;


char pass [6] = {'1', '2', '3', '4', '5', '6' }; // senha padrão



const int yellowPin = A1;
const int redPin = A2;
const int greenPin = A0;
const int audioPin = 13;
const int duration = 200;
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', '#'}
};// deinição do layout do teclado

byte rowPins[ROWS] = {5, 4, 3, 2}; // pinagem para as linhas do teclado
byte colPins[COLS] = {6, 7, 8}; // pinagem para as colunas do teclado

// mapeamento do teclado
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int unlock=0;

void setup() {
  lcd.begin(16, 2); // inicializa o LCD
  lcd.backlight(); // com backlight
  Serial.begin(9600); // inicializa serial
  // modo dos pinos de audio e LEDs
  pinMode(audioPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  lcd.clear();// limpa LCD
  key_init();// inicializa processo
  myStepper.setSpeed(300); // velocidade do motor

}

void loop() {
  char key = keypad.getKey(); // obtém informação do teclado
  if (key != NO_KEY) { // se foi teclado algo
    if (unlock == 0) {
      if (key == '#') {// se foi teclado #
        code_entry_init(); // mensagem, som e LED
        int entrada = 0; // variável de apoio; números de entradas feitas via teclado
        while (count < 6 ) { // enquanto não entrou os 4 números necessários para a senha
          char key = keypad.getKey(); // obtém informação do teclado
          if (key != NO_KEY) { // se foi teclado algo
            entrada += 1; // aumenta contrador de entradas
            tone(audioPin, 1080, 100); // sinal audível
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1; // verifica na sequencia da senha, se correto aumenta contador
            if ( count == 6 ) {
              unlocked(); // chegou a 4 digitos corretos, libera acesso
            }
            if ((key == '#') || (entrada == 6)) { // foi teclado # ou 4 entradas incorretas
              key_init();// inicializa
              break;// interrompe loop
            }
          }
        }
      }
      if (key == '*') { // se foi teclado *
        old_pass_check();// mensagem para entrar a senha antiga
        int entrada = 0;
        while (count < 6 ) {
          char key = keypad.getKey();
          if (key != NO_KEY) {
            entrada += 1;
            tone(audioPin, 1080, 100);
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1;
            if ( count == 6 ) { // foi teclado a senha antiga corretamente
              get_new_pass();// chama função para entrada da nova senha
            }
            if ((key == '*') || (entrada == 6)) { // foi teclado * ou entrou 4 números errados
              key_init();// inicializa
              break; // interrompe loop
            }
          }
        }
      }
    }
    else {
      locked();
    }
  }
}


void locked() {
  lcd.clear();
  lcd.print("    ACESSO,");
  lcd.setCursor(0, 1);
  lcd.print("    NEGADO!");
  for (int i = 0; i < 11; i++) {
    tone(audioPin, 1080, 100);
    digitalWrite(yellowPin, LOW);
    digitalWrite(redPin, HIGH);
    delay(duration);
    noTone(audioPin);
    digitalWrite(redPin, LOW);
    delay(100);
  }
  delay(1000);
}



void get_new_pass() {
  new_pass_entry(); // mensagem, som e LED
  int entrada = 0; // inicializa entrada
  while (count < 6) { // enquanto contrador for menor que 4
    char key = keypad.getKey(); // obtem informação do teclado
    if (key != NO_KEY) { // se algo foi teclado
      entrada += 1; // aumenta contador de entrada
      tone(audioPin, 1080, 100); // tom para cada dígito
      delay(duration);
      noTone(audioPin);
      pass[count] = key; // aramazena o novo dígito
      count += 1; // próximo dígito
      if (count == 6) break; // chegou a 4 digitos, interrompe loop
      if ((key == '*') || (entrada == 6)) { // foi telcado * 4 entradas
        key_init();// inicializa sistema
        break; // sai
      }
    }
  }
}


void new_pass_entry() {
  // mensagem no display
  lcd.clear();
  lcd.print("   Nova Senha");
  count = 0;
  lcd.setCursor(0, 1);
  lcd.print("    Tecle *");
  // gera sinal audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void old_pass_check() {
  // mensagem no display
  lcd.clear();
  lcd.print("  Senha antiga?");
  count = 0;
  lcd.setCursor(0, 1);
  lcd.print("    Tecle *");
  // gera tom audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void key_init () {
  // mensagem no display
  lcd.clear();
  lcd.print("# Digitar Senha");
  lcd.setCursor(0, 1);
  lcd.print("* Trocar Senha");
  count = 0;// contador para zero
  // somente LED vermelho aceso
  digitalWrite(redPin, HIGH);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  // gera tom audível
  tone(audioPin, 1080, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 980, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 770, 100);
  delay(duration);
  noTone(audioPin);
}


void code_entry_init() {
  // mensagem no display
  lcd.clear();
  lcd.print(" Entre a Senha:");
  count = 0; // contador para zero
  // gera sinal audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void unlocked() {
  // mensagem no display
  lcd.clear();
  lcd.print("Carregando...");
  // somente LED verde aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  for (int f = 0; f < 32; f++) {
    digitalWrite(yellowPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(redPin, HIGH);
    myStepper.step(-16); // sentido horario
    //delay(50);
    digitalWrite(yellowPin, LOW);
    digitalWrite(redPin, LOW);
  }
  lcd.clear();
  lcd.print("Acesso Liberado!");

  // pisca LED verde e gera sinal audível
  for (int x = 0; x < 5; 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);
  }

  unlock = 1;
}

void locked() {
  unlock = 0;

  for (int f = 0; f < 32; f++){
    myStepper.step(16);
    //delay(50);
  }
}

luisilva, boa tarde.

So tenho a agradecer sua paciencia, mas infelizmente nao deu certo, ate pq ao compilar da um erro mencionando que a void locked ja existe anteriormente.

Nao consigui.....

// inclusão de bilibotecas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// declara LCD, endereço e tipo
const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 9, 10, 11, 12);


// declarção de variáveis
int count = 0;


char pass [6] = {'1', '2', '3', '4', '5', '6' }; // senha padrão



const int yellowPin = A1;
const int redPin = A2;
const int greenPin = A0;
const int audioPin = 13;
const int duration = 200;
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', '#'}
};// deinição do layout do teclado

byte rowPins[ROWS] = {5, 4, 3, 2}; // pinagem para as linhas do teclado
byte colPins[COLS] = {6, 7, 8}; // pinagem para as colunas do teclado

// mapeamento do teclado
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int unlock=0;

void setup() {
  lcd.begin(16, 2); // inicializa o LCD
  lcd.backlight(); // com backlight
  Serial.begin(9600); // inicializa serial
  // modo dos pinos de audio e LEDs
  pinMode(audioPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  lcd.clear();// limpa LCD
  key_init();// inicializa processo
  myStepper.setSpeed(300); // velocidade do motor

}

void loop() {
  char key = keypad.getKey(); // obtém informação do teclado
  if (key != NO_KEY) { // se foi teclado algo
    if (unlock == 0) {
      if (key == '#') {// se foi teclado #
        code_entry_init(); // mensagem, som e LED
        int entrada = 0; // variável de apoio; números de entradas feitas via teclado
        while (count < 6 ) { // enquanto não entrou os 4 números necessários para a senha
          char key = keypad.getKey(); // obtém informação do teclado
          if (key != NO_KEY) { // se foi teclado algo
            entrada += 1; // aumenta contrador de entradas
            tone(audioPin, 1080, 100); // sinal audível
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1; // verifica na sequencia da senha, se correto aumenta contador
            if ( count == 6 ) {
              unlocked(); // chegou a 4 digitos corretos, libera acesso
            }
            if ((key == '#') || (entrada == 6)) { // foi teclado # ou 4 entradas incorretas
              key_init();// inicializa
              break;// interrompe loop
            }
          }
        }
      }
      if (key == '*') { // se foi teclado *
        old_pass_check();// mensagem para entrar a senha antiga
        int entrada = 0;
        while (count < 6 ) {
          char key = keypad.getKey();
          if (key != NO_KEY) {
            entrada += 1;
            tone(audioPin, 1080, 100);
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1;
            if ( count == 6 ) { // foi teclado a senha antiga corretamente
              get_new_pass();// chama função para entrada da nova senha
            }
            if ((key == '*') || (entrada == 6)) { // foi teclado * ou entrou 4 números errados
              key_init();// inicializa
              break; // interrompe loop
            }
          }
        }
      }
    }
    else {
      lock();
    }
  }
}


void locked() {
  lcd.clear();
  lcd.print("    ACESSO,");
  lcd.setCursor(0, 1);
  lcd.print("    NEGADO!");
  for (int i = 0; i < 11; i++) {
    tone(audioPin, 1080, 100);
    digitalWrite(yellowPin, LOW);
    digitalWrite(redPin, HIGH);
    delay(duration);
    noTone(audioPin);
    digitalWrite(redPin, LOW);
    delay(100);
  }
  delay(1000);
}



void get_new_pass() {
  new_pass_entry(); // mensagem, som e LED
  int entrada = 0; // inicializa entrada
  while (count < 6) { // enquanto contrador for menor que 4
    char key = keypad.getKey(); // obtem informação do teclado
    if (key != NO_KEY) { // se algo foi teclado
      entrada += 1; // aumenta contador de entrada
      tone(audioPin, 1080, 100); // tom para cada dígito
      delay(duration);
      noTone(audioPin);
      pass[count] = key; // aramazena o novo dígito
      count += 1; // próximo dígito
      if (count == 6) break; // chegou a 4 digitos, interrompe loop
      if ((key == '*') || (entrada == 6)) { // foi telcado * 4 entradas
        key_init();// inicializa sistema
        break; // sai
      }
    }
  }
}


void new_pass_entry() {
  // mensagem no display
  lcd.clear();
  lcd.print("   Nova Senha");
  count = 0;
  lcd.setCursor(0, 1);
  lcd.print("    Tecle *");
  // gera sinal audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void old_pass_check() {
  // mensagem no display
  lcd.clear();
  lcd.print("  Senha antiga?");
  count = 0;
  lcd.setCursor(0, 1);
  lcd.print("    Tecle *");
  // gera tom audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void key_init () {
  // mensagem no display
  lcd.clear();
  lcd.print("# Digitar Senha");
  lcd.setCursor(0, 1);
  lcd.print("* Trocar Senha");
  count = 0;// contador para zero
  // somente LED vermelho aceso
  digitalWrite(redPin, HIGH);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  // gera tom audível
  tone(audioPin, 1080, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 980, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 770, 100);
  delay(duration);
  noTone(audioPin);
}


void code_entry_init() {
  // mensagem no display
  lcd.clear();
  lcd.print(" Entre a Senha:");
  count = 0; // contador para zero
  // gera sinal audível
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  tone(audioPin, 1500, 100);
  delay(duration);
  noTone(audioPin);
  // somente LED amarelo aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, HIGH);
  digitalWrite(greenPin, LOW);
}


void unlocked() {
  // mensagem no display
  lcd.clear();
  lcd.print("Carregando...");
  // somente LED verde aceso
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  for (int f = 0; f < 32; f++) {
    digitalWrite(yellowPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(redPin, HIGH);
    myStepper.step(-16); // sentido horario
    //delay(50);
    digitalWrite(yellowPin, LOW);
    digitalWrite(redPin, LOW);
  }
  lcd.clear();
  lcd.print("Acesso Liberado!");

  // pisca LED verde e gera sinal audível
  for (int x = 0; x < 5; 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);
  }

  unlock = 1;
}

void lock() {
  unlock = 0;

  for (int f = 0; f < 32; f++){
    myStepper.step(16);
    //delay(50);
  }
}

No caso, a tranca abre, nao fecha em seguida, OK!

isso pq se ela abriu, locked é igual a 1
como a void lock tem q ser igual a 0 para ser executada, ou seja, para a tranca fechar

entao se eu abri a tranca,em que momento ela ira fechar? nao tem como, pq no caso tem q ser acionado algo para fechar.

Por isso que em nenhum momento a tranca fecha.

e tem um porem, se eu digitar a senha errada ela vai pra lock, q ira ser igual a zero, fazendo com que o servo motor seja acionado trancando......

mas ai no caso ela teria q ter sido aberta para fechar

nesse caso ela estara fechada e ira rotacionar para fechar novamente.

Não percebi. Não tenho como testar isso, mas em princípio deveria funcionar. Quando a senha é digitada o funcionamento é o que já existia, com a excepção da trancar logo a seguir. A única coisa que adicionei, foi uma nova função, em que quando a tranca está aberta e é premida uma tecla qualquer, a tranca é fechada.

Entendi.....

mas qnd eu erro a senha e teclo algo, a tranca se fecha, sendo q n foi aberta.

Não deveria, pois para fechar teria que ter aberto primeiro.
Se a porta estiver fechada o programa faz isto:

    if (unlock == 0) {
      if (key == '#') {// se foi teclado #
        code_entry_init(); // mensagem, som e LED
        int entrada = 0; // variável de apoio; números de entradas feitas via teclado
        while (count < 6 ) { // enquanto não entrou os 4 números necessários para a senha
          char key = keypad.getKey(); // obtém informação do teclado
          if (key != NO_KEY) { // se foi teclado algo
            entrada += 1; // aumenta contrador de entradas
            tone(audioPin, 1080, 100); // sinal audível
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1; // verifica na sequencia da senha, se correto aumenta contador
            if ( count == 6 ) {
              unlocked(); // chegou a 4 digitos corretos, libera acesso
            }
            if ((key == '#') || (entrada == 6)) { // foi teclado # ou 4 entradas incorretas
              key_init();// inicializa
              break;// interrompe loop
            }
          }
        }
      }
      if (key == '*') { // se foi teclado *
        old_pass_check();// mensagem para entrar a senha antiga
        int entrada = 0;
        while (count < 6 ) {
          char key = keypad.getKey();
          if (key != NO_KEY) {
            entrada += 1;
            tone(audioPin, 1080, 100);
            delay(duration);
            noTone(audioPin);
            if (key == pass[count])count += 1;
            if ( count == 6 ) { // foi teclado a senha antiga corretamente
              get_new_pass();// chama função para entrada da nova senha
            }
            if ((key == '*') || (entrada == 6)) { // foi teclado * ou entrou 4 números errados
              key_init();// inicializa
              break; // interrompe loop
            }
          }
        }
      }
    }

Caso contrário, o programa faz isto:

    else {
      lock();
    }

Se errou a senha, está na primeira parte do programa. Como a variável "unlock" não muda de estado, nunca deveria ser corrida a segunda parte do programa.

To entendendo......

vou ver se fiz muita coisa de errado aqui e posto o resultado depois.
De antemão, so tenho a te agradecer.

Abraços

luisilva, boa noite.

cara desculpe pela demora, mas minha semana foi puxada e nem liguei o PC.

Vc estava certo, deu certinho! o sistema volta para o estado inicial e quando é apertado alguma tecla, o motor e acionado, fechando a tranca.

Ficou perfeito, so tenho a agradecer!! Valeu mesmo.