Fechadura Eletrica com senha de 4 digitos usando apenas um simples botão
Observando algumas revistas sobre eletrônica , encontrei um artigo chamado originalmente de : Code Lock with One Button , de Zorislav Miljak, usando um microcontrolador PIC 16F84. Foi a inspiração para este projeto.
Pensei: Porque não usar um pequeno PIC12F629 para isto? É bem mais barato (R$ 5,00), pequeno ,tem oscilador interno, e facilmente encontrado no mercado. Aparentemente, seria fácil a adaptação, mas o problema surgiu ao tentar ligar o display de 7 seguimentos. A solução foi implementar uma multiplexação em que se apresentaria os seguimentos do display “c,p,b,a” ou “g,d,e,f”, alternadamente, e usando o sinal do ponto (p) para acionar um transistor BC 547 ,cujo coletor aterraria um rele de potencia para a fechadura elétrica. O pino 7 do Pic é usado como sinal de chaveamento. Quando está em Vcc (1) inibe os seguimentos c,p,b,a , via um transistor BC 547 e quando está em Gnd (0) inibe os seguimentos g,d,f,e, usando diodos tipo 1N 4148 , que desviam a tensão destes seguimentos .
Logicamente, foi preciso começar um programa “.asm” do zero para obter o desejado. O código “.asm”gerado é bem simples de entender, se acompanhar os comentários (Obs. Feito por hobysta, não um programador “expert”). Depois de compilado, foi feito vários testes para acertar os tempos , visto que estamos usando o oscilador interno do PIC visando poupar os raros pinos. Note que foi usado o pino reset (4) como entrada. Não esqueça de acertar a palavra “Config” para este objetivo caso tenha que recompilar o programa asm.
Como a introdução de uma senha é de forma serial, não é bom termos uma senha de muitos dígitos,pois consumiria muito tempo para introduzi-la. Por isto, foi optado por se usar apenas 4 digitos de forma fixa. No programa “.asm” foi definido por linha de código a senha inicial como sendo “7523”. Em uso, altere ela conforme desejar, sendo depois salva na memória EEprom do chip. Caso esqueça a senha que você alterou, deverá apagar o chip e grava-lo novamente, usando a senha “7523”, inicialmente.
Chegou o grande momento. Como usar este dispositivo? Comece apertando o botão, que irá apresentar sequencialmente uma contagem de 0 a “P”. Solte o botão quando aparecer o primeiro numero da senha. Repita com os próximos 3 números. Se a senha for introduzida corretamente aparecerá a letra “L” (liberado) e depois “.” (ponto), ligando o relé da fechadura por 15 segundos e desligando automaticamente. Se a senha for digitada incorretamente aparecerá a letra “F” (falha) piscando 3 vezes. Para mudar a senha, soltar o botão quando aparecer a letra “P”, e ao fazer isto, irá aparecer a letra “O”(Senha antiga) . Em seguida deverá ser digitado a senha atual. Se introduzida de forma correta, aparecerá a letra “N” (Nova Senha). Introduza agora a nova senha de 4 digitos. Irá aparecer em seguida a letra “C” , devendo introduzir de novo a senha nova para confirmar a mudança. Após isto, aparecerá a letra “A” (Alterado) piscando por 3 vezes, indicando o sucesso na alteração.
Para gravar o PIC com arquivo Hex poderá usar um programa como WinPic800 e se desejar alterar o programa “fechadura1sw.asm” use o Mplab da Microchip.
Foi usado um protoboard para realizar uma montagem experimental, não tendo sido feita ainda uma placa de circuito impresso.
Para alimentar o circuito pode-se se usar um pequeno transformador de 110v para 12+12 e um regulador de tensão para 5 volts do tipo 7805 .
Segue o esquema :
Segue codigo asm
;***************************************************************************
; PROJETO : FECHADURA ELETRICA COM SENHA DE 4 DIGITOS USANDO APENAS 1 SÓ BOTÃO (SERIAL)
;****************************************************************************
; ------------------------------------- “fechadura1sw.asm” ------------------------------------------------------
;
; INICIO : 09/01/12 TERM.:
; AUTOR: C. LÁRIOS
; PROCESSADOR: PIC 12F629
; OBJETIVO: ACIONAR SOLENOIDE DE PORTÃO OU COMANDO DE ABRIR /FECHAR PORTÃO AUTOMATICO
;*****************************************************************************
;
#INCLUDE<P12F629.INC> ; ARQUIVO PADRAO
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ;(ATENÇÃO DESLIGADO. FEITO NO CONFIGURE!!!!)
ERRORLEVEL -302
; PAGINACAO DE MEMORIA;
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
; VARIAVEIS
CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA
N0,N1,N2,N3,AUX,DEL4, DEL5,AUX1,TEMP,CONT,SAIDA,NUM,PONT,XW0,XW1,XW2,XW3,W0,W1,W2,W3,C0,C1,C2,FLAG,B0,B1,B2,PASSO
ENDC
;======================DEFINICAO DE BITS E FLAGS==============
#DEFINE SAE GPIO,5 ; SAIDA PARA DISPLAY SEG 'A' E 'E' - PINO 2
#DEFINE SBF GPIO,4 ; SAIDA PARA DISPLAY SEG 'B' E 'F' - PINO 3
#DEFINE SCG GPIO,2 ; SADA PARA DISPLAY SEG 'C' E 'G' - PINO 5
#DEFINE SDP GPIO,1 ; SADA PARA DISPLAY SEG 'D' E '.' - PINO 6
#DEFINE SW GPIO,3 ; ENTRADA DA CHAVE DO CODIGO PINO 4
#DEFINE MUX GPIO,0 ; SAIDA PARA MULTIPLEXAGEM DO DISPLAY PINO 7
LETRA_C EQU .12
LETRA_P EQU .10
LETRA_A EQU .18
LETRA_F EQU .15
LETRA_N EQU .13
LETRA_E EQU .11
LETRA_L EQU .17
LETRA_o EQU .14
LETRA_PONTO EQU .16 ;MOSTRA PONTO E ACIONA
TMAX EQU 0X28 ;TEMPO MAXIMO ENTRE ENTRADA DE NUMERO DA SENHA (15 SEG)
TEMPO_FECHADURA_LIGADO EQU 0X50 ;TEMPO QUE FECHADURA FICA ACIONADA
#DEFINE FLAGTAP FLAG,0
ORG H'2100'
DE 7,3,2,5 ;SENHA INICIAL (ALTERAR)
ORG 0X00
GOTO INICIO
;................................................................................................
; VETOR DE INTERRUPCAO
ORG 0X04
RETFIE
;................................................................................................
TABELA
ADDWF PCL,F
; ABCPEFGD
RETLW B'11101101' ;0
RETLW B'01100000' ;1
RETLW B'11001011' ;2
RETLW B'11100011' ;3
RETLW B'01100110' ;4
RETLW B'10100111' ;5
RETLW B'10101111' ;6
RETLW B'11100000' ;7
RETLW B'11101111' ;8
RETLW B'11100111' ;9
RETLW B'11001110' ;LETRA 'P' =.10
RETLW B'10001111' ;LETRA 'E' =.11
RETLW B'10001101' ;LETRA 'C' =.12
RETLW B'11101100' ;LETRA 'N' =.13
RETLW B'00101011' ;LETRA 'O' =.14
RETLW B'10001110' ;LETRA 'F' =.15
RETLW B'00010000' ;LETRA '.' =.16
RETLW B'00001101' ;LETRA 'L' =.17
RETLW B'11101110' ;LETRA 'A' =.18
RECEBE_SENHA
CLRF PONT
CLRF PCLATH
MOVFW PASSO
ADDWF PCL,F
GOTO TESTA_SENHA ;0-NORMAL - COMPARA SENHA RECEBIDA COM EEPROM
GOTO TESTA_SENHA ;1-MODO TROCA DE SENHA - COMPARA SENHA RECEBIDA COM EEPROM E SEGUE OS PASSOS
GOTO RECEBE_NOVA_SENHA ;2- RECEBE NOVA SENHA
GOTO CONFIRMA_NOVA_SENHA ;3- RECEBE ANOVAMENTE A MESMA NOVA SENHA PARA CONFIRMAÇÃO
RECEBE_NOVA_SENHA
MOVFW N0 ;SALVA SENHA A CONFIRMAR
MOVWF XW0
MOVFW N1
MOVWF XW1
MOVFW N2
MOVWF XW2
MOVFW N3
MOVWF XW3
MOVLW 0X04
CALL DELAYSEG
MOVLW LETRA_C
CALL MOSTRALETRA
MOVLW .3
MOVWF PASSO
GOTO MAIN
TESTA_SENHA
CALL LEEEP
CONFIRMA_NOVA_SENHA
MOVFW XW0
XORWF N0
BTFSS STATUS,Z
GOTO FALHA1
MOVFW XW1
XORWF N1
BTFSS STATUS,Z
GOTO FALHA1
MOVFW XW2
XORWF N2
BTFSS STATUS,Z
GOTO FALHA1
MOVFW XW3
XORWF N3
BTFSS STATUS,Z
GOTO FALHA1
MOVLW .1
XORWF PASSO,W
BTFSC STATUS,Z
GOTO PASSO1 ;MODO 1 - INICIA ALTERAÇÃO DE SENHA
MOVLW .3
XORWF PASSO,W
BTFSC STATUS,Z
GOTO GRAVAR ;MODO 3 - GRAVAR NOVA SENHA NA EEPROM
MOVLW 0X02
CALL DELAYSEG
MOVLW LETRA_L
CALL MOSTRALETRA
CLRF GPIO
BSF GPIO,1 ;LIGA PONTO (SAIDA PARA FECHADURA)
MOVLW TEMPO_FECHADURA_LIGADO
CALL DELAYSEG
VFIM
CLRF N0
CLRF N1
CLRF N2
CLRF N3
CLRF PONT
CLRF GPIO
CLRF PASSO
BCF FLAGTAP
GOTO MAIN
PASSO1
MOVLW 0X02
CALL DELAYSEG
MOVLW LETRA_N
CALL MOSTRALETRA
MOVLW .2
MOVWF PASSO
GOTO MAIN
GRAVAR
CALL VAIEEPROM
MOVLW 0X03
MOVWF AUX
MOVLW 0X04
CALL DELAYSEG
MOVLW LETRA_A
CALL MOSTRALETRA
DECFSZ AUX,F
GOTO $-5
GOTO VFIM
;
;
INICIO
BANK1 ;BANCO 1
MOVLW .0
MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES
MOVLW B'000000' ;SAIDA EM GP0
MOVWF TRISIO ;
BANK0
MOVLW .7 ;DESLIGA O COMPARADOR
MOVWF CMCON ;IDEM
CLRF GPIO
CLRF PONT ;ZERA PONTEIRO
MOVLW TMAX
MOVWF C2
CLRF FLAG
CLRF PASSO
MAIN
BTFSC SW
GOTO VETEMP
DECFSZ B0,F
GOTO MAIN
DECFSZ B1,F
GOTO MAIN
MOVLW TMAX
MOVWF C2
GOTO INITCONT
VETEMP
CLRF B0
CLRF B1
DECFSZ C0,F
GOTO MAIN
DECFSZ C1,F
GOTO MAIN
DECFSZ C2,F
GOTO MAIN
MOVLW TMAX
MOVWF C2
BTFSS FLAGTAP
GOTO NMOSTRAC
CALL FALHA1
NMOSTRAC
CLRF N0
CLRF N1
CLRF N2
CLRF N3
GOTO MAIN
INITCONT
CLRF AUX1
MOVLW .0
MOVWF NUM
CALL TABELA
MOVWF SAIDA
APRMESMO
CALL MS1
CALL DELAYT
ADDLW .0
BTFSS STATUS,Z
GOTO PEGAN
CALL MS2
CALL DELAYT
ADDLW .0
BTFSS STATUS,Z
GOTO PEGAN
DECFSZ AUX1,F
GOTO APRMESMO
INCF NUM,F
MOVFW NUM
CALL TABELA
MOVWF SAIDA
MOVFW NUM
SUBLW .11
BTFSC STATUS,Z
GOTO INITCONT
GOTO APRMESMO
PEGAN
MOVFW NUM
SUBLW .10 ;TESTA SE É LETRA 'A' DE ALTERAR SENHA
BTFSC STATUS,Z
GOTO ALTERA_SENHA ;VAI PARA ALTERAR SENHA
BSF FLAGTAP ;FLAG PARA APRESENTAÇÃO DE 'F'
MOVFW PONT
ADDLW 0X20
MOVWF FSR
MOVFW NUM
MOVWF INDF
INCF PONT,F
MOVFW PONT
SUBLW .4
BTFSC STATUS,Z
GOTO RECEBE_SENHA
GOTO MAIN
ALTERA_SENHA
MOVLW .1;SINALIZA QUE HÁ ALTERAÇÃO DE SENHA
MOVWF PASSO
MOVLW 0X04
CALL DELAYSEG
MOVLW LETRA_o ;MOSTRA LETRA 'O' DE OLD (VELHA SENHA)
CALL MOSTRALETRA
GOTO MAIN
FALHA1 MOVLW .3 ;3 VEZES PISCA E APARECE A LETRA 'F'
MOVWF AUX
MOVLW 0X04
CALL DELAYSEG
MOVLW LETRA_F
CALL MOSTRALETRA
DECFSZ AUX,F
GOTO $-5
GOTO VFIM
MOSTRALETRA
CLRF AUX1
CALL TABELA
MOVWF SAIDA
X1
CALL MS1
CALL DELAY
CALL MS2
CALL DELAY
DECFSZ AUX1,F
GOTO X1
CLRF GPIO
RETURN
MS1
CLRF GPIO
BTFSC SAIDA,7
BSF GPIO,5
BTFSC SAIDA,6
BSF GPIO,4
BTFSC SAIDA,5
BSF GPIO,2
BTFSC SAIDA,4
BSF GPIO,1
BCF GPIO,0
RETURN
MS2
CLRF GPIO
BTFSC SAIDA,3
BSF GPIO,5
BTFSC SAIDA,2
BSF GPIO,4
BTFSC SAIDA,1
BSF GPIO,2
BTFSC SAIDA,0
BSF GPIO,1
BSF GPIO,0
RETURN
;------------------------------------------------------------------------------------------
DELAY
MOVLW 0XFF
MOVWF DEL5
NOP
NOP
NOP
NOP
DECFSZ DEL5,F
GOTO $-5
RETURN
DELAYT
MOVLW 0XFF
MOVWF DEL5
NOP
BTFSC SW
GOTO DBNCE
NOP
NOP
VT1 DECFSZ DEL5,F
GOTO $-5
CLRF GPIO
RETLW .0
DBNCE
CALL DELAY
BTFSS SW
GOTO VT1
CLRF GPIO
RETLW .1
; ...........SUB-ROTINA DE ESCRITA NA E2PROM............
ESCR_E2PROM
BANK1
MOVWF EEDATA
BCF INTCON,GIE
BSF EECON1,WREN
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
BCF EECON1,WREN
; BTFSC EECON1,WRERR ; * HOUVE ERRO?( * OPCIONAL ESTA LINHA E A PROXIMA)
; GOTO ESCR_E2PROM ; * TENTA NOVAMENTE SEM AFETAR EEDATA
BTFSC EECON1,WR
GOTO $ - 1
BANK0
RETURN
VAIEEPROM ; ESCREVE NA E2PROM
MOVLW .0
BANK1
MOVWF EEADR
BANK0
MOVFW XW0 ;DADO DO TMR1H N.OVERFLOW
CALL ESCR_E2PROM
MOVLW .1
BANK1
MOVWF EEADR
BANK0
MOVFW XW1 ;DADO DO TMR1H
CALL ESCR_E2PROM
MOVLW .2 ;AINDA NÃO
BANK1
MOVWF EEADR
BANK0
MOVFW XW2 ;DADO DO TMR1L
CALL ESCR_E2PROM
MOVLW .3 ;AINDA NÃO
BANK1
MOVWF EEADR
BANK0
MOVFW XW3 ;DADO DO TMR1L
CALL ESCR_E2PROM
LEEEP MOVLW .0 ;VALOR PARA NUMERO 0
BANK1
MOVWF EEADR ;CARREGA ENDERECO
CALL LE_E2PROM ;SUBROTINA PARA LEITURA
MOVWF XW0 ;CARREGA PRIMEIRO NUMERO
MOVLW .1 ;VALOR PARA NUMERO 0
BANK1
MOVWF EEADR ;CARREGA ENDERECO
CALL LE_E2PROM ;SUBROTINA PARA LEITURA
MOVWF XW1 ;CARREGA PRIMEIRO NUMERO
MOVLW .2 ;VALOR PARA NUMERO 0
BANK1
MOVWF EEADR ;CARREGA ENDERECO
CALL LE_E2PROM ;SUBROTINA PARA LEITURA
MOVWF XW2 ;CARREGA PRIMEIRO NUMERO
MOVLW .3 ;VALOR PARA NUMERO 0
BANK1
MOVWF EEADR ;CARREGA ENDERECO
CALL LE_E2PROM ;SUBROTINA PARA LEITURA
MOVWF XW3 ;CARREGA PRIMEIRO NUMERO
RETURN
LE_E2PROM BANK1 ;SUB-ROTINA DE LEITURA DE E2PROM
BSF EECON1,RD ;
MOVF EEDATA,W ;
BANK0 ;
RETURN
DELAYSEG
MOVWF C2
DECFSZ C0,F
GOTO $-1
DECFSZ C1,F
GOTO $-3
DECFSZ C2,F
GOTO $-5
RETURN
END
Segue o código “fechadura1sw.hex”:
:020000040000FA
:020000006B286B
:0800080009008207ED346034A9
:10001000CB34E3346634A734AF34E034EF34E73420
:10002000CE348F348D34EC342B348E3410340D3484
:10003000EE34AC018A013C088207302830282128A0
:1000400031282008AD002108AE002208AF002308A7
:10005000B000043048210C30CE200330BC00792899
:100060002E212D08A006031DC5282E08A106031D5C
:10007000C5282F08A206031DC5283008A306031DA6
:10008000C52801303C0603195A2803303C060319E1
:100090006128023048211130CE208501851450306E
:1000A0004821A001A101A201A301AC018501BC016D
:1000B00038107928023048210D30CE200230BC00A3
:1000C000792816210330A400043048211230CE20B4
:1000D000A40B64285128831600308B000030850063
:1000E0008312073099008501AC012830B700B801B0
:1000F000BC0185198228B90B7928BA0B79282830D8
:10010000B7009428B901BA01B50B7928B60B792844
:10011000B70B79282830B700381C8F28C520A001DC
:10012000A101A201A3017928A7010030AB0005209D
:10013000AA00D920F820003E031DAE28E420F820B4
:10014000003E031DAE28A70B9928AB0A2B080520FB
:10015000AA002B080B3C0319942899282B080A3C69
:100160000319BE2838142C08203E84002B08800078
:10017000AC0A2C08043C0319192879280130BC006A
:10018000043048210E30CE2079280330A4000430FA
:1001900048210F30CE20A40BC7285128A7010520E5
:1001A000AA00D920EF20E420EF20A70BD128850159
:1001B00008008501AA1B85162A1B0516AA1A051513
:1001C0002A1A8514051008008501AA1985162A190E
:1001D0000516AA1805152A18851405140800FF30FD
:1001E000A6000000000000000000A60BF128080097
:1001F000FF30A60000008519032900000000A60BAF
:10020000FB2885010034EF20851DFF28850101347E
:1002100083169A008B131C1555309D00AA309D0043
:100220009C141C119C18122983120800003083169C
:100230009B0083122D080821013083169B00831236
:100240002E080821023083169B0083122F080821F4
:10025000033083169B008312300808210030831678
:100260009B004321AD00013083169B004321AE006B
:10027000023083169B004321AF00033083169B009E
:100280004321B000080083161C141A0883120800CA
:10029000B700B50B4929B60B4929B70B4929080006
:02400E00C43FAD
:084200000700030002000500A5
:00000001FF
Curiosidades:
Universo cheio de surpresas
Universo – obra do acaso?
Nosso inigualável sistema solar
Mapeamento do céu
Qual a origem do universo e a vida?
Outros assuntos:
Quatro dicas para lidar com problemas financeiros e dívidas
Como lidar com sucesso com os sogros
Como reagir a um assédio sexual
Como parar de adiar as coisas
Até o próximo artigo!!!!
boa noite amigo!
parabéns pelo conteúdo do site, realmente muito bom!
bom, agora vem a pergunta rsrsrsrs.
sabe, estou estudando um pouco de programação pic, porém em linguagem c, gostei do projeto e como esta em assembler não consigo entender o código.
como vi que você programa também em c, resolvi perguntar, seria muito difícil traduzir esse código para linguagem c, pois gosto muito de estudar os códigos para tentar entender as configurações e logicas usadas.
obrigado pela atenção e parabéns pelo trabalho que vem desenvolvendo!
Olá Marcio!
Obrigado por seu comentário de apreço pelo conteúdo do blog! Quanto ao alterar para “C” não é algo rápido de se fazer, no tempo limitado que tenho. Quem sabe mais para frente eu possa fazer isto, mas não prometo. Se você gosta de programação, creio que terá que ‘engulir’ o ASM, e aprender a gostar dele. Ele é muito necessário mesmo ao usar o “C” em rotinas críticas que não tem jeito de ser feitas senão em assembly. Também o compilador C gera o arquivo ‘List” para o programador verificar se está sendo montado do jeito que ele deseja e descobrir bugs mais facilmente.
Então….
Claudio
Boa noite claudio, desculpe a minha ignorancia mais nesse circuito onde eu coloco os fios da trava ?
Olá Fernando!
Obrigado por seu comentário. Ninguém deve se sentir intimidado em perguntar quando não conhecer um assunto, especialmente se desejar realmente saber.
Você deverá ligar através dos contatos do rele, identificados no esquema no canto superior direito como ‘ p/ solenóide’ ou seja, a bobina da trava elétrica do portão.
Se sua trava for de 12 volts, poderá usar do próprio circuito. Ligue o +12v ao contato e no outro contato do rele, ligue com um fio até a fechadura e dela deverá retornar outro fio que será ligado ao gnd. Não esqueça de colocar um diodo 1N4007 em paralelo com esta bobina (sentido de não condução, ou seja, com o catodo para o +12v), com o objetivo de eliminar tensões geradas ao se desligar, que poderiam afetar o funcionamento do PIC. Se for outras tensões na fechadura, deverá ter um transformador apropriado.
Claudio
pensei no uso do conversor para economizar pinos pois preciso acionar o rele e manter e teria que ser uma senha de 4 numeros teria como fazer , sobre o botão pensei no teclado de telefone , mas seria complexo demais , talves o idela seria usar o pic16f628 né
amigo no meu caso precisaria de uma senha de 4 digitos mas o relê no modo retenção a senha ligaria o rele e manteria até o reset ou desligamento do cirucito , mas peseni não teria como usar um conversor de 7 seguentos contator binario , assim usando 4 pinos este proejto serveria pra ligar uma ignição de um carro , assim seria um sistema de trava de veiculo com senha .
Olá Liliano! Não entendi bem o uso do conversor de 7 seguimentos. Ainda usaria apenas um digito? Seria com um só botão?
Claudio