Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

Projeto 21: Tranca Eletrônica

Share:

Tranca Eletrônica utilizando o PIC16F877A






A fechadura elétrica (usada nos portões eletrônicos) será aberta caso o usuário digitar a senha correta. A senha é um número entre 0 e 999999. O usuário possuirá um número limitado de tentativas (3 tentativas), e após o sistema irá entrar em bloqueio( led vermelho acenderá). A senha terá que ser definida na primeira vez. Pressione o botão S1, digite a senha e aperte a tecla ENTER. Você poderá alterar a senha quantas vezes quiser.

A fechadura é chaveada pelo relê.

A tecla C do teclado é usado para limpar os dígitos do display.

Nesse projeto utilizou-se um teclado 4x3, um display LCD 20x2 e para o microcontrolador foi utilizado um clock de 4Mhz.




DOWNLOAD:

CóDIGO-FONTE: (Compilador MikroC PRO PIC)
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;

char keypadPort at PORTD;

char kp;
char cliques = 0;
char tentativas = 0;
char *senha = "000000";
char *textos[6] = {"      Senha OK      ",
                   "    Senha Errada    ",
                   "   Nova Senha OK    ",
                   "   Digite a senha   ",
                   " Digite a nova senha",
                   "         Fim        "};
                   
char *Ptr1, *Ptr2;

char CompararSenha()
{
char i = 0;
  for(i=0; i < 6; i++)
  {
   if(senha[i] != Eeprom_Read(i)) return(0);
  }
  
  return (1);
}

void GravarSenhaNaEeprom()
{
char i;
 for(i=0; i < 6; i++)
 {
    Eeprom_Write(i, senha[i]);
 }
}

void LimparSenha()
{
 char i;
 for(i=0; i < 6; i++)
 {
   senha[i] = '0';
 }
}

void main()
{
char i;
TRISB=0b10000000;
PORTB=0;

Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Ptr2 = textos[3];
Lcd_Out(1, 1, Ptr2);

while(1)
{

if(tentativas < 3)
{
 kp = Keypad_Key_Click();
 
 if(kp)
 {
    if(kp % 4 == 0)
    {
       //Faz Nada
    }
    else if(kp == 13) //Limpar
    {
       LimparSenha();
       cliques = 0;
    }
    else if(kp == 15) //Enter
    {
      cliques = 0;
      if(PORTB.F7 == 1) //Verificar entrada da senha
      {
        if(CompararSenha()) //Sucesso
        {
          PORTB.F0 = ~PORTB.F0;
          Ptr1 = textos[0];
          LimparSenha();
        }
        else    //Senha errada
        {
          tentativas++;
          Ptr1 = textos[1];
          LimparSenha();
        }
      }
      else  //Gravar nova senha
      {
          GravarSenhaNaEeprom();
          Ptr1 = textos[2];
          LimparSenha();
      }
      
      Lcd_Out(1, 1, Ptr1);
      Delay_ms(2000);
    }
    else  //Numeros
    {
       switch(kp)
       {
        case 1: kp = 49; break; //1
        case 2: kp = 50; break; //2
        case 3: kp = 51; break; //3
        case 5: kp = 52; break; //4
        case 6: kp = 53; break; //5
        case 7: kp = 54; break; //6
        case 9: kp = 55; break; //7
        case 10: kp = 56; break;//8
        case 11: kp = 57; break;//9
        case 14: kp = 48; break;//0
       }
       
       if(cliques < 6)
       {
           //Digitando a senha
           for(i=0; i < 5; i++)
              senha[i] = senha[i+1];
           senha[5] = kp;
       }
       
     }
 }
 else
 {
     if(PORTB.F7) Ptr2 = textos[3];
     else Ptr2 = textos[4];
 }
}
else
{
  Ptr2 = textos[5];
  PORTB.F1 = 1;
}

 Lcd_Out(1,1, Ptr2);
 Lcd_Out(2,8, senha);

 Delay_ms(100);
 
}
}

46 comentários:

  1. Boa noite Tiago, você tem um projeto de central alarme com senha.
    obrigado.

    ResponderExcluir
    Respostas
    1. Sinto muito, mas não tenho!
      Caso eu tiver algum tempo de sobra, posso tentar fazer esse projeto.

      Excluir
  2. Tiago Henrique parabéns cara,seus projetos contribuem muito para aqueles que amam eletrônica como eu.
    Olha só pelo visto vc domina bem o assunto.
    Poderia desenvolver um projeto sobre como decodificar o ht6p20b da holtek
    para que pudessemos fazer um simples controle remoto de 433MHZ.
    Eu programo em c usando hi-tech mas tenho um pouco de dificuldade com decodificação de dados serialmente.
    Quando tiver um tempo faz este projeto pra gente.
    Um abraço.

    ResponderExcluir
  3. EXCELENTE ........ EXCEPCIONAL. PARABÉNS. CARA

    VÇ PODERIA FAZER ISSO USANDO PIC 16F628, O CUSTO SERIA MENOR CONCORDA.

    VÇ PODERIA FAZER AGUARDO MESTRE .

    alextecx@gmail.ocm

    ResponderExcluir
    Respostas
    1. O custo seria menor sim, mas para esse projeto nao daria pra utilizar o pic16f628a, porque iria falta alguns pinos.

      Excluir
  4. gostaria de saber um jeito de fazer ao invés de aparecer zeros aparecer apenas o cursor

    ResponderExcluir
    Respostas
    1. voce pode escrever um "espaço" no lugar do zero, habilitar o cursor do LCD e posiciona-lo.

      Excluir
  5. legal o projeto, estou tentando criar algo parecido, mas vi na simulação que para a alterar a senha, ele nao compara com a senha antiga, ou seja, caso alguem nao saiba a senha e mais facil troca-lá, não ? Sou iniciante em C, vou utilizar o CCS ou até mesmo esse mikroC, mas uma duvida que eu tenho, como que eu faço o uC gravar os digitos que eu pressionei (na ordem das teclas pressionadas) para depois comparar com a senha correta ?

    ResponderExcluir
    Respostas
    1. na teoria sim. Mas o botao podia ser um jumper dentro da placa do circuito ou algum botao escondido...
      vou reescrever o codigo, deixando ele mais limpo, aí vc vai entender melhor!!

      Excluir
  6. Meus parabéns Tiago, ótimo projeto .. Só uma duvida, teria como usar esse circuito para comandar 2 armários ?

    ResponderExcluir
  7. Poderia me mostrar ou descrever quais códigos devem mudar ?

    ResponderExcluir
  8. Poderia me mostrar ou descrever quais códigos devem mudar ?

    ResponderExcluir
    Respostas
    1. se for utilizar a mesma senha é so acrescentar mais saidas
      Edite esse trecho de codigo

      if(CompararSenha()) //Sucesso
      {
      PORTB.F0 = ~PORTB.F0; //Armario 1
      PORTB.F1 = ~PORTB.F1; //Armario 2
      PORTB.F2 = ~PORTB.F2; //Armario 3

      Ptr1 = textos[0];
      LimparSenha();
      }

      Excluir
  9. boa tarde, parabens pelo blog. o proteus 7.10 é crakeado?

    ResponderExcluir
  10. Boa tarde Thiago,voce tem a programação desse projeto, se for usado com Arduino?

    ResponderExcluir
  11. No caso eu gostaria de utilizar dois armários com duas senhas diferentes, o que eu preciso modificar no projeto?

    ResponderExcluir
  12. A minha montagem deu erro no pic c copiler

    ResponderExcluir
  13. oi, site muito bom pra aprendermos, parabéns, baseado no seu projeto, fiz um usando pic16f628a,
    lcd + teclado, mas só sobra duas portas abertas.

    ResponderExcluir
  14. Olá Amigo!! Muito bom seu projeto, gostaria de saber, qual a alimentação desse projetos??

    ResponderExcluir
  15. OLá Amigo , qual é a senha padrão ? e onde posso alterar no arquivo c ?
    desde já agradeço

    ResponderExcluir
    Respostas
    1. Pelo que simulei no Proteus, vc faz o seguinte: deixe o push button acionado, vai aparecer no lcd Digite a nova senha, tu colocas 6 numeros de sua escolha, clica em enter, após desaciona o push. Pronto para o uso. lembrando que se desabilitar a simulação terá de repetir os passos ok.

      Excluir
  16. Amigão, o seu projeto ficou show, só que quando fui simular no Proteus após entrar com a nova senha e "abrir a tranca" não deveria ter uns 5 segundos para a tranca voltar a fechar ? Ela fica aberta, somente quando vc insere novamente a senha que ela torna a fechar. Meu email é jose_anascimento@hotmail.com Valeu

    ResponderExcluir
  17. kra otimo projeto ta de parabens mais eu estou gravando o hexa dele em um gravador que comprei do mercado livre ele nao e compatível com o micro c ele da erro no arquivar a senha tem como deixar uma senha fixa se tiver você me mostra o meu e-mail e acirmoro@hotmail.com.br

    ResponderExcluir
  18. A tensão do circuito é a mesma da fechadura?

    ResponderExcluir
  19. Boa tarde !!!
    e possivel utilizar mais de uma senha para abrir a tranca??

    ResponderExcluir
    Respostas
    1. Sim mais teria que mudar a programação, tentarei refazer já que thiago parece está ocupado

      Excluir
  20. ola tinha como me enviar o circuito para que eu possa fazer na placa . obrigado.
    lucasfurusawa_@hotmail.com

    ResponderExcluir
  21. Muito bom o seu projeto,parabéns! Tentei reproduzi no proteus,porém,quando tento três tentativa de erro o led não ascende. Pode me ajuda?

    ResponderExcluir
  22. Montei uma placa com o circuito mas as teclas da coluna 3 do teclado não são lidas. No proteus 7.7 roda tranquilamente. Alguém já teve esse problema?

    ResponderExcluir
  23. Quando se aperta uma tecla da coluna três (3, 6, 9 e #), aparece 5 V nos pinos das linhas correspondentes e, ao se soltar as teclas, esse nível de 5 V não desaparece, como no funcionamento das outras colunas, e o circuito fica travado. Será que existe um problema na rotina do teclado? Se algúem montou o circuito e o mesmo funcionou, entre em contato comigo. Obrigado. mestrelivio@uol.com.br

    ResponderExcluir
  24. Montei o circuito e descobri que o problema da coluna 3 era ruído. Construí uma linha de terra perto do resistor de 10k e tudo funcionou. Queria uma solução para o problema quando se acerta a senha e o relé opera e fica operado (não desarma). mestrelivio@uol.com.br

    ResponderExcluir
  25. boa tarde, primeiramente parabéns belo projeto
    eu queria ajuda pra alterar o projeto para o seguinte, eu queria ativar um laço de 60s quando errar a senha 3 vezes ao invés de fim
    se for possível me ajudar eu vou te agradecer demais, eu tenho que apresentar esse projeto mês que vem, na minha escola, mande no meu e-mail se for possível. vilsonborges98@gmail.com

    ResponderExcluir
  26. Parabens pelo blog, excelente trabalho. me tira uma duvida por gentileza; como posso fazer um projeto semelhante de tranca digital, porém sem a utilização de um microcontrolador,

    Agradeço desde já

    ResponderExcluir
  27. Boa noite
    Gostaria de saber para colocar um display lcd 16x2 a Onde eu preciso alterar o projeto?

    ResponderExcluir
  28. no lugar da push button deve usar uma SPST! ai mano la no esquematico do proteus a chave S1 nao pode ser aquela pq ela é instantanea! nao tem como definir a nova senha se ela nao ficar pressionada

    ResponderExcluir
  29. Mandei um e-mail para vc Tiago!!! tentei reproduzir no protheus sua circuitaria e não conseguir!

    ResponderExcluir
  30. ola, posso usar o pic 18f4550 para fazer esse projeto, se sim posso usar o mesmo código fonte?

    ResponderExcluir