Tutorial: Dispositivo de identificação de senha com escada de resistores

O vídeo mostra e explica o hardware e software de um sistema de identificação de senha construído com um Arduino, alguns botões, leds e resistores. Abaixo você pode ver o Sketch utilizado no vídeo.

 

O Sketch
#define leitura A0
#define ledVerde 9
#define ledAzul 11
#define ledVerm 13

//Escolhendo a senha
int digitos = 6; //Numeros de digitos da senha
int senha[6] = {1,2,3,4,5,6}; //Colocar novamente o numero dentro dos [] e escrever a senha nos {}
int senha2[6]; //Colocar novamente o numero dentro dos []
int tempoSafe = 5; //Tempo (em minutos) de bloqueio

int botao, valor, resultado = 0, erros = 0, x, z;

void setup() {
  pinMode(9, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {

  //Leitura do que for digitado

  for(x = 0; x < digitos; x++){
    senha2[x] = botoes();
    if(senha2[x] == 10){ x = x - 1; }
    else{
      Serial.print(senha2[x]);
      if(x < digitos - 1){ Serial.print(" - "); }
      delay(500);
    }
    digitalWrite(ledAzul, LOW);
  }

  //Comparacao com a senha escolhida

  for(x = 0; x < digitos; x++){
    if(senha[x] == senha2[x]){ resultado = resultado + 1; }
  }

  //Resultado final

  if(resultado == digitos){
    Serial.println();
    Serial.println("Acertou");
    Serial.println();
    erros = 0;
    digitalWrite(ledVerde, HIGH);
    delay(1000);
    digitalWrite(ledVerde, LOW);
  }

  else{
    Serial.println();
    Serial.println("Errou");
    Serial.println();
    erros = erros + 1;
    digitalWrite(ledVerm, HIGH);
    delay(1000);
    digitalWrite(ledVerm, LOW);
  }

  if(erros == 3){ seguranca(); }
  resultado = 0;

}

//Funcao de leitura dos digitos
int botoes() {
  digitalWrite(11, HIGH);
  valor = analogRead(leitura);
  if(valor > 99 && valor < 105){ botao = 1; }
  else if(valor > 109 && valor < 115){ botao = 2; }
  else if(valor > 124 && valor < 130){ botao = 3; }
  else if(valor > 140 && valor < 148){ botao = 4; }
  else if(valor > 165 && valor < 172){ botao = 5; }
  else if(valor > 200 && valor < 205){ botao = 6; }
  else if(valor > 250 && valor < 255){ botao = 7; }
  else if(valor > 335 && valor < 340){ botao = 8; }
  else if(valor > 507 && valor < 512){ botao = 9; }
  else if(valor > 900){ botao = 0; }
  else if(valor == 0){ botao = 10; }

  return botao;
}

//Bloqueio em caso de muitas tentativas
void seguranca() {
  Serial.print("Bloqueado por ");
  Serial.print(tempoSafe);
  if(tempoSafe == 1){ Serial.println(" minuto"); }
  if(tempoSafe > 1){ Serial.println(" minutos"); }
  Serial.println();
  for(z = 0; z < tempoSafe*60000; z++){
    digitalWrite(ledVerm, HIGH);
    delay(500);
    digitalWrite(ledVerm, LOW);
    delay(500);
  }
  erros = 0;
}

 

O vídeo foi feito por um aluno meu do Colégio Villa Lobos (Amparo - SP). 

Exibições: 6095

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcia Guimaraes em 25 agosto 2015 às 19:52

Código elegante  limpo. Fiz aqui... e ficou show! Muito obrigada !

Comentário de Leonardo Barichello em 22 agosto 2014 às 16:48

Gabriel, são os intervalos em que a variável "valores" está para cada um dos botoes apertados.

Comentário de Gabriel Niquini em 22 agosto 2014 às 14:37

Alguem poderia me explicar o que sao esse valores? :

else if(valor > 109 && valor < 115){ botao = 2; }
  else if(valor > 124 && valor < 130){ botao = 3; }
  else if(valor > 140 && valor < 148){ botao = 4; }
  else if(valor > 165 && valor < 172){ botao = 5; }
  else if(valor > 200 && valor < 205){ botao = 6; }
  else if(valor > 250 && valor < 255){ botao = 7; }
  else if(valor > 335 && valor < 340){ botao = 8; }
  else if(valor > 507 && valor < 512){ botao = 9; }
  else if(valor > 900){ botao = 0; }
  else if(valor == 0){ botao = 10; }

Comentário de Lucas Grob Sponchiado em 21 abril 2014 às 0:41

só testei o código virtualmente com algumas adaptações, mas acho que funcionará na prática

#define leitura A0
#define ledVerde 8
#define ledAzul 10
#define ledVerm 12

int nsenhas, ndigitos, temposeg, nerros, erros, a, b, c, d, e, f=1, g;
int *acertos, *senha2;
int **senha;

void setup() {

Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);

//Ajustes do programa

Serial.print("Quantas senhas deseja programar ? ");
nsenhas = botoes();
Serial.println();

Serial.print("Quantos digitos cada senha tera ? ");
ndigitos = botoes();
Serial.println();

Serial.print("De quanto sera o tempo de bloqueio ? ");
temposeg = botoes();
Serial.println();

Serial.print("Numero de tentativas erradas ? ");
nerros = botoes();

senha = (int**)(malloc(nsenhas*sizeof(int*)));
senha2 = (int *)malloc(ndigitos*sizeof(int));
acertos = (int *)calloc(nsenhas,sizeof(int));

//Gravacao das senhas do programa

for(a = 0; a < nsenhas; a++){
senha[a] = (int*)(malloc(ndigitos*sizeof(int)));
Serial.print("Digite a senha de numero ");
Serial.print(f);
Serial.print(":");
f=f+1;
for(b = 0; b < ndigitos; b++){
c = botoes();
if(c =! 10){
senha[a][b] = c;
if(b < ndigitos - 1){ Serial.print(" - "); }
}
else{ b = b-1; }
}
Serial.println();
}

}

void loop() {

digitalWrite(11, HIGH);

//Coleta da senha a ser comparada

for(a = 0; a < ndigitos; a++){
b = botoes();
if(b =! 10){
senha2[a] = b;
}
else{ a = a-1; }
}

digitalWrite(ledAzul, LOW);

//Comparacao das senhas e execucao da rotina de acertou ou errou

for(a = 0; a < nsenhas; a++){
for(b = 0; b < ndigitos; b++){
if(senha2[b] == senha[a][b]){
acertos[a] = acertos[a] + 1;
}
else{ b = ndigitos; }
}
if(acertos[a] == ndigitos){ g = 1; }
}

if(g == 1){ acertou(); }

else{ errou(); }

if(erros == nerros){ seguranca(); }

}

int botoes(){ //Rotina de leitura dos digitos

int valor, botao;

valor = analogRead(A0);
if(valor > 99 && valor < 105){ botao = 1; }
else if(valor > 109 && valor < 115){ botao = 2; }
else if(valor > 124 && valor < 130){ botao = 3; }
else if(valor > 140 && valor < 148){ botao = 4; }
else if(valor > 165 && valor < 172){ botao = 5; }
else if(valor > 200 && valor < 205){ botao = 6; }
else if(valor > 250 && valor < 255){ botao = 7; }
else if(valor > 335 && valor < 340){ botao = 8; }
else if(valor > 507 && valor < 512){ botao = 9; }
else if(valor > 900){ botao = 0; }
else if(valor == 0){ botao = 10; }

return botao;

}

void seguranca(){ //Rotina de seguranca

Serial.print("Bloqueado por ");
Serial.print(temposeg*60);
if(temposeg == 1){ Serial.println(" minuto"); }
if(temposeg > 1){ Serial.println(" minutos"); }
Serial.println();
for(a = 0; a < temposeg*60; a++){
digitalWrite(ledVerm, HIGH);
delay(500);
digitalWrite(ledVerm, LOW);
delay(500);
}
erros = 0;

}

void acertou(){ //Rotina de acerto

Serial.println();
Serial.println("Acertou");
Serial.println();
erros = 0;
for(a = 0; a < 5; a++){
digitalWrite(ledVerde, HIGH);
delay(100);
digitalWrite(ledVerde, LOW);
delay(100);
}

}

void errou(){ //Rotina de erro

Serial.println();
Serial.println("Errou");
Serial.println();
erros = erros + 1;
for(a = 0; a < 5; a++){
digitalWrite(ledVerm, HIGH);
delay(100);
digitalWrite(ledVerm, LOW);
delay(100);
}

}

Comentário de railson lisboa martins em 11 abril 2014 às 14:43

meu amigo por favor me de a opção de cologar mais senhas

#define leitura A0
#define ledVerde 9
#define ledAzul 11
#define ledVerm 13

//Escolhendo a senha
int digitos = 6; //Numeros de digitos da senha
int senha[6] = {1,2,3,4,5,6}; //Colocar novamente o numero dentro dos [] e escrever a senha nos {}
int senha2[6]; //Colocar novamente o numero dentro dos []
int tempoSafe = 5; //Tempo (em minutos) de bloqueio

int botao, valor, resultado = 0, erros = 0, x, z;

void setup() {
  pinMode(9, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {

  //Leitura do que for digitado

  for(x = 0; x < digitos; x++){
    senha2[x] = botoes();
    if(senha2[x] == 10){ x = x - 1; }
    else{
      Serial.print(senha2[x]);
      if(x < digitos - 1){ Serial.print(" - "); }
      delay(500);
    }
    digitalWrite(ledAzul, LOW);
  }

  //Comparacao com a senha escolhida

  for(x = 0; x < digitos; x++){
    if(senha[x] == senha2[x]){ resultado = resultado + 1; }
  }

  //Resultado final

  if(resultado == digitos){
    Serial.println();
    Serial.println("Acertou");
    Serial.println();
    erros = 0;
    digitalWrite(ledVerde, HIGH);
    delay(1000);
    digitalWrite(ledVerde, LOW);
  }

  else{
    Serial.println();
    Serial.println("Errou");
    Serial.println();
    erros = erros + 1;
    digitalWrite(ledVerm, HIGH);
    delay(1000);
    digitalWrite(ledVerm, LOW);
  }

  if(erros == 3){ seguranca(); }
  resultado = 0;

}

//Funcao de leitura dos digitos
int botoes() {
  digitalWrite(11, HIGH);
  valor = analogRead(leitura);
  if(valor > 99 && valor < 105){ botao = 1; }
  else if(valor > 109 && valor < 115){ botao = 2; }
  else if(valor > 124 && valor < 130){ botao = 3; }
  else if(valor > 140 && valor < 148){ botao = 4; }
  else if(valor > 165 && valor < 172){ botao = 5; }
  else if(valor > 200 && valor < 205){ botao = 6; }
  else if(valor > 250 && valor < 255){ botao = 7; }
  else if(valor > 335 && valor < 340){ botao = 8; }
  else if(valor > 507 && valor < 512){ botao = 9; }
  else if(valor > 900){ botao = 0; }
  else if(valor == 0){ botao = 10; }

  return botao;
}

//Bloqueio em caso de muitas tentativas
void seguranca() {
  Serial.print("Bloqueado por ");
  Serial.print(tempoSafe);
  if(tempoSafe == 1){ Serial.println(" minuto"); }
  if(tempoSafe > 1){ Serial.println(" minutos"); }
  Serial.println();
  for(z = 0; z < tempoSafe*60000; z++){
    digitalWrite(ledVerm, HIGH);
    delay(500);
    digitalWrite(ledVerm, LOW);
    delay(500);
  }
  erros = 0;
}

Comentário de railson lisboa martins em 11 abril 2014 às 14:38

quando vc vai faser isso amigo

Comentário de railson lisboa martins em 9 abril 2014 às 18:25

amigo vc poderia fase fase para mi estou com dificuldades sobre adicionar mais senhas obrigad...

Comentário de Lucas Grob Sponchiado em 4 abril 2014 às 17:30
Ismael, é possível sim adaptar o programa para um controle remoto, o que você precisará fazer é identificar as freqüências que são emitidas do controle para cada botão e trocar a rotina valor = analogRead(leitura) por uma de leitura de sinal IR, trocando também o valor referente para cada botão (ex: para o botão 1 em vez de valor > 99 ... , você coloca a freqüência referente ao botão que você apertou).
Precisará também declarar a porta do sensor IR.

Railson, eu fui o autor desse projeto, posso incluir sim essa modificação no programa, aliás, vou corrigir umas pequenas falhas e adicionar essa função de múltiplas senhas, assim fica flexível o número de senhas pré-programadas.
Comentário de railson lisboa martins em 4 abril 2014 às 16:05

amigo tem como vc faser esse pedaço de programa, eu temho muita dificuldade, estou presisando muito colocar outra senha, obrigado

Comentário de Leonardo Barichello em 31 março 2014 às 11:12

Railson:

Sim, é possível. No bloco abaixo do comentário "//Comparacao com a senha escolhida" você teria que incluir um if para a segunda senha e um contador "resultado" para ela.

Eduardo:

não tenho aceso a esse tipo de fechadura, infelizmente.

Ismael:

também não vejo dificuldade em adaptar o código para um controle remoto. Veja se a interação com o controle remoto está correta. Sei problema pode ser com ele e não com essa parte do código.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço