Ir ao conteúdo
  • Cadastre-se

Cofre PIC/Mplab


Posts recomendados

@MatheusLPS

 

Sim percebi, mudei e continua dando o mesmo resultado, testei na prática e mesma coisa, não entendo como pode estar dando senha

correta e liberando cofre toda vez que aperto o botão, de repente me fugiu algum detalhe, portanto, deixarei todo código abaixo. Depois que declaro; output_low(tranca); ta tudo certo, a tranca fecha e fica nisso, mas quando acrescento abre_cofre == 1 , acontece esses problemas.

 

 

#include <18f4550.h>  
 
#FUSES NOWDT         
#FUSES XT           
#FUSES PUT           
#FUSES NOPROTECT     
#FUSES NODEBUG      
#FUSES NOBROWNOUT   
#FUSES NOLVP         
#FUSES NOCPD         
#FUSES NOWRT
 
#use delay(clock=4000000) 
 
#define WireTX PIN_C6         
#define WireRX PIN_C7      
#define led_circuito pin_b2
#define led_tranca pin_b4
#define buzzer pin_b3
#define tranca pin_b5
#define botao_tranca pin_b1
 
 
#use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial)
 
#include <kbd_flex.c>   
 
char senha[6] = { 1 , 1 , 1 , 1, 1, 1 };     
char ler_senha[6] = { 0 , 0 , 0, 0, 0, 0};   
 
int n = 0;                   
int abre_cofre = 1;
char digito;
int8 senha_ok = 0;
void digita_senha();
void botao();
void programa();
 
  
void main()
{
   
   output_high(led_circuito);        
   
   while(true)
   {
   
   if (abre_cofre == 1)
   {
   
   kbd_init();
 
   printf("Digite a senha...\r\n");
   
      
   digita_senha();                                            
                                       
                                       
                                       
                                       
                                       
   for (n=0;n<=5;n++)                  
   {                                         
      if (senha[n] + 0x30 != ler_senha[n])   
      break;                                 
   }                                         
                                             
   
   if (n != 6) 
   {          
      senha_ok = 0;
      n = 0;      
      printf ("\n\rSenha errada!");
      delay_ms (75);
      output_toggle (buzzer);
      delay_ms (100);
      output_toggle (buzzer);
      delay_ms (100);
      output_toggle (buzzer);
      delay_ms (100);
      output_toggle (buzzer);
      delay_ms (100);
      output_toggle (buzzer);
      delay_ms (100);
      output_toggle (buzzer);
      delay_ms (100);
      printf ("\n\rDigite a senha:\r\n");
      digita_senha();
   }
   
   else if (n == 6)          
      {
         printf ("\n\rSenha Correta!");         
         output_high(tranca);
         output_high(led_tranca);
         abre_cofre = 0;
      }
   }
  
  else if(abre_cofre == 0)
  {
      while(input(botao_tranca)){
         output_low(tranca);
         output_low(led_tranca);
         abre_cofre = 1;  
         delay_ms(75);
      }
   }      
 }
}
 
void digita_senha()                 
{
   while (senha_ok == 0)            
   {                                
      digito = kbd_getc();         
      
      if (digito == '0')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '1')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '2')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '3')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '4')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '5')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }      
      if (digito == '6')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }      
      if (digito == '7')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }      
      if (digito == '8')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }      
      if (digito == '9')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      if (digito == '*')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }      
      if (digito == '#')
      {
         output_toggle (buzzer);
         delay_ms (100);
         output_toggle (buzzer);
      }
      
      if (digito!=0)                
      {                            
         ler_senha[n] = digito;     
         printf("*");                       
         n++;                      
                                    
         if (n > 5)                 
         {                          
            senha_ok = 1;           
            n = 0;                  
         }                          
         
         delay_ms (50);             
      }
   }
}
Link para o comentário
Compartilhar em outros sites

Achei o problema!

 

Seguinte. Veja quando você entra na funcao de digitar a senha. Tem uma linha asssim:

while (senha_ok == 0)

Ou seja, digite a senha enquanto não tiver digitado 6 algarismos.

 

Quando você digita seis diígitos, na mesma rotina tem isso:

senha_ok = 1;

Ou seja, foi digitado 6 dígitos e podemos sair da rotina de digitação e ir para a que confere a senha. Certo?

 

Aí lá no começo do código, conferimos a senha com o for.

 

Se a senha estiver errada, olha só a linha que tem:

senha_ok = 0;

Ou seja, se a senha estiver errada, o código não faz mais nada e volta para digitar a senha novamente.

 

MAS, quando você diz que a senha está correta, você não coloca essa linha acima que acabei de dizer. Ou seja. você diz que a senha está correta, o código continua, mas quando você tranca o cofre, o código volta no início e assume que a senha continua certa pois você não zerou ela. Olha o pequeno erro aí.

 

Para funcionar, depois de ter dito que a senha está correta, zere a senha com 1 for. E coloque a linha:

 

senha_ok = 0;

 

Logo em seguida para qu o programa peça ela quando você trancar o cofre.

 

Na parte onde tem o botão para trancar o cofre, use conforme abaixo:

 

while(input(botao_tranca)) --> Se estiver usando resistor de pull-up

while(!input(botao_tranca)) --> Se estiver usando resistor de pull-down.

 

Falou

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...