Ola pessoal, estou trabalhando em um projeto onde a fechadura de uma porta é aberta por uma senha de 6 digitos num teclado 4x3.

Na atual fase do projeto , após digitar a senha errada por 3 vezes , a porta bloqueia impossibilitando o usuario de digitar a senha novamentre, ou seja bloqueia a porta de vez.

Gostaria da ajuda de voces para adicionar um comando onde apos 3 tentativas, a porta ficasse bloqueada por apenas 30 segundos e logo liberasse para mais 3 tentativas, bloqueando novamente quando errar por 30 segundos e assim por diante.

Quem puder me ajudar ficarei muito agradecido. Obrigado desde já.

Segue a programação, ela foi realizada no programa MikroC.

  1. sbit LCD_RS at RC4_bit;
  2. sbit LCD_EN at RC5_bit;
  3. sbit LCD_D4 at RC0_bit;
  4. sbit LCD_D5 at RC1_bit;
  5. sbit LCD_D6 at RC2_bit;
  6. sbit LCD_D7 at RC3_bit;
  7. sbit LCD_RS_Direction at TRISC4_bit;
  8. sbit LCD_EN_Direction at TRISC5_bit;
  9. sbit LCD_D4_Direction at TRISC0_bit;
  10. sbit LCD_D5_Direction at TRISC1_bit;
  11. sbit LCD_D6_Direction at TRISC2_bit;
  12. sbit LCD_D7_Direction at TRISC3_bit;
  13. char keypadPort at PORTD;
  14. char kp;
  15. char cliques = 0;
  16. char tentativas = 0;
  17. char *senha = "000000";
  18. char *textos[6] = {" Senha OK ",
  19. " Senha Errada ",
  20. " Nova Senha OK ",
  21. " Digite a senha ",
  22. " Digite a nova senha",
  23. " Fim "};
  24. char *Ptr1, *Ptr2;
  25. char CompararSenha()
  26. {
  27. char i = 0;
  28. for(i=0; i 6; i++)
  29. {
  30. if(senha[i] !Eeprom_Read(i)) return(0);
  31. }
  32. return (1);
  33. }
  34. void GravarSenhaNaEeprom()
  35. {
  36. char i;
  37. for(i=0; i 6; i++)
  38. {
  39. Eeprom_Write(i, senha[i]);
  40. }
  41. }
  42. void LimparSenha()
  43. {
  44. char i;
  45. for(i=0; i 6; i++)
  46. {
  47. senha[i] = '0';
  48. }
  49. }
  50. void main()
  51. {
  52. char i;
  53. TRISB=0b10000000;
  54. PORTB=0;
  55. Keypad_Init();
  56. Lcd_Init();
  57. Lcd_Cmd(_LCD_CLEAR);
  58. Lcd_Cmd(_LCD_CURSOR_OFF);
  59. Ptr2 = textos[3];
  60. Lcd_Out(11, Ptr2);
  61. while(1)
  62. {
  63. if(tentativas 3)
  64. {
  65. kp = Keypad_Key_Click();
  66. if(kp)
  67. {
  68. if(kp % 4 == 0)
  69. {
  70. //Faz Nada
  71. }
  72. else if(kp == 13//Limpar
  73. {
  74. LimparSenha();
  75. cliques = 0;
  76. }
  77. else if(kp == 15//Enter
  78. {
  79. cliques = 0;
  80. if(PORTB.F7 == 1//Verificar entrada da senha
  81. {
  82. if(CompararSenha()) //Sucesso
  83. {
  84. PORTB.F0 = ~PORTB.F0;
  85. Ptr1 = textos[0];
  86. LimparSenha();
  87. }
  88. else //Senha errada
  89. {
  90. tentativas++;
  91. Ptr1 = textos[1];
  92. LimparSenha();
  93. }
  94. }
  95. else //Gravar nova senha
  96. {
  97. GravarSenhaNaEeprom();
  98. Ptr1 = textos[2];
  99. LimparSenha();
  100. }
  101. Lcd_Out(11, Ptr1);
  102. Delay_ms(2000);
  103. }
  104. else //Numeros
  105. {
  106. switch(kp)
  107. {
  108. case 1: kp = 49break//1
  109. case 2: kp = 50break//2
  110. case 3: kp = 51break//3
  111. case 5: kp = 52break//4
  112. case 6: kp = 53break//5
  113. case 7: kp = 54break//6
  114. case 9: kp = 55break//7
  115. case 10: kp = 56break;//8
  116. case 11: kp = 57break;//9
  117. case 14: kp = 48break;//0
  118. }
  119. if(cliques /span> 6)
  120. {
  121. //Digitando a senha
  122. for(i=0; i 5; i++)
  123. senha[i] = senha[i+1];
  124. senha[5] = kp;
  125. }
  126. }
  127. }
  128. else
  129. {
  130. if(PORTB.F7) Ptr2 = textos[3];
  131. else Ptr2 = textos[4];
  132. }
  133. }
  134. else
  135. {
  136. Ptr2 = textos[5];
  137. PORTB.F1 = 1;
  138. }
  139. Lcd_Out(1,1, Ptr2);
  140. Lcd_Out(2,8, senha);
  141. Delay_ms(100);
  142. }
  143. }

Exibições: 325

Responder esta

Respostas a este tópico

Posso fazer isso em ccs c compiler facilmente e com menos codigo , por que não aderir ao ccs c ?? 

pra quando precisa ??

Não analise o código inteiro, mas a ideia acredito que seja a seguinte.

Você tem o numero de tentativas salvas na variavel 'tentativas', portanto se utilizar o comando

if(tentativas>=3){

delay(30000);

tentativas=0;

}

Você irá "travar" o arduino por 30 segundos e em seguida habilita-lo novamente reiniciando a variável 'tentativas'.

Eu fiquei em duvida se, após passado os 30 segundos do primeiro bloqueio, os bloqueios consecutivos aconteceram com 3 tentativas ou apenas uma. Caso seja com 3, use o código acima mas caso seja com apenas 1, troque tentativas=0; por tentativas=2;

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço