Ola,

Preciso saber como boquear o "loop" por um determinado tempo quando der 3 vezes senha incorreta no arduino.

Att.

Douglas M.

código:

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

LiquidCrystal_I2C lcd(0x27,16,2);// declara LCD, endereço e tipo

// declarção de variáveis
int contador = 0;
int count = 0;
char passMaster [4] = {'2', '5', '4' ,'6'};
char pass [4] = {'1', '2', '3', '4'}; // senha padrão

const int buttonPin = 16;
const int relePin = 14;
const int yellowPin = 12;
const int redPin = 11;
const int greenPin = 10;
const int audioPin = 9;
const int duration = 200;
const byte ROWS = 4; //Quatro linhas
const byte COLS = 3; //Três colunas

int buttonState = 1;

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.init(); // inicializa o LCD
lcd.backlight(); // com backlight
Serial.begin(9600); // inicializa serial
// modo dos pinos de audio e LEDs
pinMode(buttonPin, INPUT);
pinMode(audioPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(relePin, OUTPUT);


key_init();// inicializa processo
}

void loop(){

buttonState = digitalRead(buttonPin);

char key = keypad.getKey(); // obtém informação do teclado
if (key != NO_KEY){ // se foi teclado algo
lcd.setCursor(0,1);
lcd.print("*");
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 < 4 ){ // 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 == 4 ){
unlocked(); // chegou a 4 digitos corretos, libera acesso
key_init();// inicializa
break;
}else if(entrada == 4) { // chegou 4 digitos errados, bloqueia o acesso
contador += 1;
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);
}
for(int i=0; i > 3; i++){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema Bloqueado");
lcd.setCursor(0,1);
lcd.print(" Aguarde!!!");
}
key_init();// inicializa
break;// interrompe loop

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

}
}
}
}
}

void get_new_pass(){
new_pass_entry(); // mensagem, som e LED
int entrada = 0; // inicializa entrada
while(count < 4){ // 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 == 4) break; // chegou a 4 digitos, interrompe loop
if((key == '*') || (entrada == 4)){// 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_passMaster_check(){
// mensagem no display
lcd.clear();
lcd.print(" Senha Mestre?");
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(" Bem vindo...");
lcd.setCursor(0,1);
lcd.print(" Tecle: # ou *");
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("Acesso Liberado!");
// somente LED verde aceso
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
// 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);
}
digitalWrite(relePin, HIGH);
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" Fecho Aberto");
delay(2000);
digitalWrite(relePin, LOW);
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" Fecho Lacrado");
delay(2000);

}

Exibições: 1325

Responder esta

Respostas a este tópico

Vi que dentro do IF que verifica se entrada==4 você definiu que a variavel contador recebe contador+1 e depois não utilizou mais essa variavel, portanto vamos utiliza-la.

Eu tiraria essa parte do codigo de dentro do IF

for(int i=0; i > 3; i++){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema Bloqueado");
lcd.setCursor(0,1);
lcd.print(" Aguarde!!!");
}

e criaria um novo IF que verifica se contador==3 e bloqueia o sistema prendendo-o em um while (para isso cria-se uma variavel auxiliar do tipo long, vamos chama-la de 'bloqueio', e uma variavel do tipo int para guardar o tempo que o sistema deve ficar bloqueado em ms, vamos chama-la de tempo_bloqueado) da seguinte forma

if(contador==3)

{

bloqueio=millis()

while(millis-bloqueio<=tempo_bloqueado)

{

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema Bloqueado");
lcd.setCursor(0,1);
lcd.print(" Aguarde!!!");
}

}

contador=0;

}

Dessa forma ao errar a senha 3 vezes a variavel contador vai estar contendo o valor igual 3 e habilitará a entrada no IF, o while irá entrar em loop 'prendendo o sistema' por um tempo definido em templo_bloqueado. Ao passar esse tempo a variavel contador recebe o valor 0 para o sistema voltar a operaçao normal.

Eu não testei esse codigo mas acredito que deva funcionar.

Qualquer duvida estou a disposição

Obs.: eu ainda não tinha pensado nisso mas gostei da ideia do bloqueio, de tarde eu foi implementar essa função na minha fechadura.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço