Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  

Recommended Posts

Olá,

Estou tentando projetar um cofre, que contenha uma senha de 6 dígitos.

Não estou encontrando uma biblioteca que tenha a função password/senha por exemplo.

Para o teclado matricial existe a biblioteca keypad que auxilia bastante. Alguém sabe

uma biblioteca direcionada a isso? comparar as teclas digitadas e ver se confere com a denominada 

na programação?

 

Estou utilizando Mplab V2.10 , compilador c18, microcontrolador PIC18F4550.

 

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@marcelovillar

 

Tente algo do tipo:

 

1 - Crie uma variável do tipo vetor. Exemplo: int senha[6];

 

2 - Leia 01 tecla através dessa lib keypad.

 

3- Guarde o valor lido dentro do vetor senha. Exemplo:

senha[i] = keypad(); //imagino que a lib te retorna apenas um caracter, seja ele do tipo char, int ou que seja...

4 - Você coloca esse pedaço de código acima dentro de um LOOP como o for por exemplo.

 

5 - Depois que leu os 6 dígitos, você compara com a sua senha correta.Há diversas formas de fazer isso. Ou você pega o seu vetor lido (senha[6]) e transforma isso em uma string e compara com sua senha previamente armazenada. Ou você compara posição com posição. Exemplo:

int8 senha_certa[6]= {1, 2, 3, 4, 5, 6}; //aqui cada algarismo da senha está em uma posição

Depois você compara com a senha digitada. Algo do tipo:

 

senha == senha_certa ?

 

Coloca em um loop de novo e pronto.

 

Tenho algo do tipo pronto em casa. Mas á para o CCS. Só você traduzir para o C18. O que vale é a ideia.

 

Falou

Editado por MatheusLPS
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Entendi, você poderia me disponibilizar esta programação?

     

    meu email é; marcelovillar@hotmail.com , ou então se puder colar aqui ela, seria de grande ajuda. valeu

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Pega aí mano

     

    Código:

    //Aqui incluo o PIC a ser usado.#include <16f877A.h> //Aqui descrevo os FUSES usados#FUSES NOWDT#FUSES XT#FUSES PUT#FUSES NOPROTECT#FUSES NODEBUG#FUSES NOBROWNOUT#FUSES NOLVP#FUSES NOCPD#FUSES NOWRT #use delay(clock=4000000)     //Declarando o cristal usado #define WireTX PIN_C6         //Pino usado na RS232, opcional#define WireRX PIN_C7          //Pino usado na RS232, opcional //Configurar a RS232. Pode usar um LCD no lugar.#use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial) #include <kbd_flex.c>      //Usando a LIB de teclado matricial modificada char senha[6] = { 1 , 2 , 3 , 4, 5, 6 };     //A senha gravadachar ler_senha[6] = { 0 , 0 , 0, 0, 0, 0};   //A senha a ser lida int n = 0;                    //Variáveis diversaschar digito;int8 senha_ok = 0;void digita_senha(); void main(){   kbd_init();             //Iniciar a biblioteca do teclado    printf("Digite a senha...\r\n");    //Mensagem ao usuário      digita_senha();                     //Vamos chamar essa função. Depois de                                       //executar a mesma, voltamos a partir daqui.                                       //Então vá lá no final do código, a função                                       //está lá.                                                                                                                                                          //Senha preenchida, vamos testar seus valores                                       //com a senha gravada.                                          for (n=0;n<=5;n++)                     {                                         //Pulo do gato o +0x30. Ess LIB me retona strings      if (senha[n] + 0x30 != ler_senha[n])   //mas minha senha é int. Fiz assim. Nada impede      break;                                 //de salvar a senha em forma de string para evitar isso.   }                                         //Esse break evita que eu tenha que verificar todo                                             //o vetor. Na primeira errada, ele já sai do loop.      if (n != 6) //Com o teste acima, espero que tenha 6 posições corretas, se    {           //não tiver, a senha está errada.      senha_ok = 0;      n = 0;            printf ("\n\rSenha errada!");      delay_ms (2000);      printf ("\n\rDigite a senha:\r\n");      digita_senha();   }      else if (n == 6)           //Se tenho 6 posições corretas, senha certa!   {      printf ("\n\rSenha Correta!");         //FIM!   }    while (TRUE);} void digita_senha()                 //Digitando a senha{   while (senha_ok == 0)            //Partimos do pressuposto que a senha está errada   {                                //O código fica preso enquanto não digitar algo.      digito = kbd_getc();          //Colocando o dígito apertado no teclaod nessa variável            if (digito!=0)                //Esse LIB sempre me retorna 0 se eu não digitar nada      {                             //Então, somente se o valor retornado for diferente de zero, prosseguimos         ler_senha[n] = digito;     //Guarda esse dígito lido em nosso vetor de 6 posições         printf("*");               //Imprimi esse símbolo na tela                  n++;                       //Variável auxiliar, apenas incrementa a                                    //posição do vetor.         if (n > 5)                 //Se já digitamos mais que 6 dígios, a senha está         {                          //completa. O vetor começa em 0 e vai até 5 (6 posições)            senha_ok = 1;           //Nesse caso, a senha está OK (preenchida apenas)            n = 0;                  //Auxiliar volta a zero.         }                          //Se chegou até aqui, volta lá no início do código.                  delay_ms (50);             //delayzin básico.      }   }}
     
    Teste:
     
    post-543152-0-07418200-1401311371_thumb.
     
    Falou
    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Cara, muito obrigado, me adiantou algumas horas de estudo, valeu mesmo, abraços.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar,

    Se for um uso profissional, tem de implementar rotinas para armazenar senha em eeprom, cuidando de problemas por bateria fraca, e implementar uma filtragem melhor a ruidos proveniente da trava ( solenóide ) . E tem de checar a integridade dos dados em eeprom por algum meio de checksum, e caso esteja corrompido, aceitar uma senha padrão definida pelo fabricante.

    Senão pode vender junto com o cofre uma marreta kkkkkk !

    Paulo

    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @aphawk,

     

    Não é para vendas etc. Tem um cofre aqui no meu trabalho que estragou e o microcontrolador dele esta danificado.

    O cofre não é utilizado ou relevante aqui no escritório, mas pensei em programar um microcontrolador e simular o que o outro fazia,

    por aprendizado/desafio, até porque também quase nunca programei PIC, pois sempre usava e uso a plataforma Arduino.

     

    Sendo assim, você acredita que ele irá falhar com frequência? Ou que daqui um mês pode causar problemas?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar,

    Não é que vai falhar.... se voce está aproveitando o hardware existente, pelo menos está imune a interferências da tranca.

    Mas tem de pensar em uma maneira de emergência, alguma maneira que possa fazer o cofre abrir, caso os dados tenham sido corrompidos, mesmo que seja para seu próprio uso. Já pensou se por algum problema de alimentação acaba corrompendo a EEPROM ??? Qual a senha que abriria o cofre nesse caso ?

    Não acho que falhe com frequência, mas acho melhor sempre prevenir, porque a chance existe, afinal o aparelho funciona com pilhas que podem descarregar.

    Paulo

    Editado por aphawk
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Segue:

     

    ///////////////////////////////////////////////////////////////////////////////                             KBD.C                                 ////////                  Generic keypad scan driver                       ////////                                                                   ////////  kbd_init()   Must be called before any other function.           ////////                                                                   ////////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////////                   This function should be called frequently so as ////////                   not to miss a key press.                        ////////                                                                   ///////////////////////////////////////////////////////////////////////////////////        (C) Copyright 1996,2003 Custom Computer Services           //////// This source code may only be used by licensed users of the CCS C  //////// compiler.  This source code may only be distributed to other      //////// licensed users of the CCS C compiler.  No other use, reproduction //////// or distribution is permitted without written permission.          //////// Derivative programs created using this software in object code    //////// form are not restricted in any way.                               /////////////////////////////////////////////////////////////////////////////// ////////////////// The following defines the keypad layout on port D // Un-comment the following define to use port B// #define use_portb_kbd TRUE // Make sure the port used has pull-up resistors (or the LCD) on// the column pins #if defined use_portb_kbd   #byte kbd = getenv("SFR:PORTB")#else   #byte kbd = getenv("SFR:PORTD")#endif #if defined use_portb_kbd   #define set_tris_kbd(x) set_tris_b(x)#else   #define set_tris_kbd(x) set_tris_d(x)#endif //Keypad connection:   (for example column 0 is B2)//                Bx: #ifdef blue_keypad  ///////////////////////////////////// For the blue keypad#define COL0 (1 << 2)#define COL1 (1 << 3)#define COL2 (1 << 6) #define ROW0 (1 << 4)#define ROW1 (1 << 7)#define ROW2 (1 << 1)#define ROW3 (1 << 5) #else ////////////////////////////////////////////////// For the black keypad#define COL0 (1 << 5)#define COL1 (1 << 6)#define COL2 (1 << 7) #define ROW0 (1 << 1)#define ROW1 (1 << 2)#define ROW2 (1 << 3)#define ROW3 (1 << 4) #endif #define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2) // Keypad layout:char const KEYS[4][3] = {{'1','2','3'},                         {'4','5','6'},                         {'7','8','9'},                         {'*','0','#'}}; #define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where                                  // n is the number of times you expect                                  // to call kbd_getc each second  void kbd_init() {} char kbd_getc( ) {   static BYTE kbd_call_count;   static int1 kbd_down;   static char last_key;   static BYTE col;    BYTE kchar;   BYTE row;    kchar='\0';   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {       switch (col) {         case 0   : set_tris_kbd(ALL_PINS&~COL0);                    kbd=~COL0&ALL_PINS;                    break;         case 1   : set_tris_kbd(ALL_PINS&~COL1);                    kbd=~COL1&ALL_PINS;                    break;         case 2   : set_tris_kbd(ALL_PINS&~COL2);                    kbd=~COL2&ALL_PINS;                    break;       }        if(kbd_down) {         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {           kbd_down=FALSE;           kchar=last_key;           last_key='\0';         }       } else {          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {             if((kbd & ROW0)==0)               row=0;             else if((kbd & ROW1)==0)               row=1;             else if((kbd & ROW2)==0)               row=2;             else if((kbd & ROW3)==0)               row=3;             last_key =KEYS[row][col];             kbd_down = TRUE;          } else {             ++col;             if(col==3)               col=0;          }       }      kbd_call_count=0;   }  set_tris_kbd(ALL_PINS);  return(kchar);}

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Não é necessário incluir biblioteca do lcd e delay na sua programação? Colei no software e apareceu erro nas linhas relacionadas ao printf e ao

    delay. Ou o printf é apenas uma função para aparecer na tela informações?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Usei a RS232. O printf, nesse caso, envia informações pelo pino TX para alguém poder ler.

     

    SE você usar LCD, terá que adicionar a biblioteca do LCD.

     

    No caso do delay. Já vi esse tipo de problema.

     

    Isso ocorre quando você coloca alguma biblioteca ANTES de declarar o cristal usado. Nesse caso, coloque a biblioteca depois. Algo do tipo:

     

    PIC usado;

    Fuses usados;

    Cristal usado;                         //Se inverter essa linha com a debaixo, dá erro nos delays... Doidera do CCS né....:D

    Bibliotecas usadas;

    Variáveis usadas;

    Protótipo de funções;

    Programa principal (main);

    Funções usadas;

     

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Entendi, o estranho é que eu copiei e colei a sua programação, esta exatamente igual a sua e nas linhas printf e delay, esta com erro.

    Linhas; 37,59,60,61,67,82 e 91.

     

    Unable to resolve identifier printf, 

    Unable to resolve identifier delay_ms

     

    :confused:

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Esqueci de informar que instalei o compilador CCS, estes erros estão dando com o compilador CCS,

    expressões como; output_bit , false, true, também estão dando erro. O false e true substitui por 0 e 1 respectivamente

    e funcionou, mas é muito estranho, pois, vi projetos na mesma versão (CCS 5 Demo) utilizando esta denominação; false, true, output_bit.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    você usou exatamente o mesmo código que eu usei? No CCS 5 Demo?

     

    Estranho, não era para acontecer esse tipo de erro.

     

    Uma coisa que sempre faço é fechar o CCS e abrir o arquivo .c. Nunca abro pelo CCS (Open File). 

     

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Devo ter interpretado errado, o que eu fiz foi o seguinte; abrir o mplab x , fazer um novo projeto, utilizando o compilador CCS e ai colei 

    sua programação. 

     

    Agora eu abri o CCS Demo, colei a programação e não apareceu nenhum erro, mas quando dou Build abre uma aba ao lado do meu 

    projeto, denominada; 18f4550-USB-HID-CRC-IO.c

     

    com erro na linha 32; #include <usb_desc_hid 8-byte.h>   //USB Configuration and Device descriptors for this UBS device

     

    Hoje não é meu dia.


    @MatheusLPS

     

    Por acaso sabe me dizer como posso implementar na programação, um código que todas vez em que eu aperte uma tecla, acione uma denominada saída?

    Pretendo colocar um buzzer. Mas não tenho noção de como posso implementar isso com esta programação, teria que modficar na biblioteca do teclado?


    @Matheus LPS

     

    Instalei em outro computador o CCS e funcionou 100% o código e a compilação,...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Por isso não gosto de usar o MPLAB. Uso somente o CCS.

     

    Para acionar o buzzer com uma tecla do teclado é simples.

     

    Algol do tipo:

     

    digito = kbd_getc(); if (digito == '5'){   output_high (buzzer);   delay_ms (100);   output_low (buzzer);}

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Fiz um projeto no Proteus idêntico ao seu, e com sua programação, porém quando eu ponho para rodar a simulação, o RX

    não recebe nenhum sinal, não fica em vermelho. A janela do Virtual Terminal não aparece nenhuma frase como por exemplo;

    Digite a senha.

     

    Se eu colocar uma chave entre o 27 e o 21, com o resistor de 10K, +5v... vou conseguir simular o botão 1?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Ligou o terminal igual a figura que coloquei lá em cima?

     

    Se fizer a chave do jeito que você falou, você poderá sim simular o botão 1.

     

    Falou

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Putz, cometi um erro grave, coloquei RX com RX, TX com TX  --' .

     

    Porém, as teclas estão anormal, quando digito 3,6,9,# as saídas a,b,c,d respectivamente, ficam em GND,

    E as demais, ficam sempre VCC independente de eu apertar ou não a tecla.

    Editado por marcelovillar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Você pode me dar alguma ideia de como posso implementar um código que depois de digitado a senha e depois de 5 minutos tenha nível lógico 1 em 

    alguma saída, e após apertar um botão, depois de 20 segundos, tenha nível lógico 0 na mesma saída?

     

    Se eu implementar após o printf onde diz que a senha esta correta, por exemplo;

     

    delay de 5 minutos

     

    output_high(PIN_B4);

     

    If(!input(PIN_B5));

    delay de 20 segundos

    output_low(PIN_B4);

     

    volta para o código inicial (digitar senha)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Veja se esse post ajuda:

     

    http://forum.clubedohardware.com.br/topic/812973-qual-a-diferen%C3%A7a-entretimer0timer1timer2timer3timer4/#entry4852461

     

    Nele, mostro como programar um delay de 1 segundo. Você precisa de 5*60 = 300 segundos.

     

    Fique atento ao clock usado.

     

    Deixar você pensar um pouquinho. :D

     

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Obrigado, vou ler sim.

    Nesta biblioteca que você disponibilizou não esta definido os pinos do microcontrolador, não é necessário declarar quais serão usados?

    Eu fiz o mesmo circuito e programação que esta no seu exemplo, aparece no virtual terminal para digitar a senha, mas qualquer digito que 

    eu pressione não acontece nada. Tentei na prática, e também não funcionou. 

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @marcelovillar

     

    Erro meu, te enviei a biblioteca errada.   (_(  (_(  :confused:

     

    A correta é essa:

     

    /////////////////////////////////////////////////////////////////////////// ////                             Flex_KBD.C                            //// ////                  Generic keypad scan driver                       //// ////                                                                   //// ////  kbd_init()   Must be called before any other function.           //// ////                                                                   //// ////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not //// ////                   This function should be called frequently so as //// ////                   not to miss a key press.                        //// ////                                                                   //// ///////////////////////////////////////////////////////////////////////////    //Keypad connection:   #define col0 PIN_D2 #define col1 PIN_D1 #define col2 PIN_D0 #define row0 PIN_D4 #define row1 PIN_D5 #define row2 PIN_D6 #define row3 PIN_D7  // Keypad layout: char const KEYS[4][3] = {{'1','2','3'},                          {'4','5','6'},                          {'7','8','9'},                          {'*','0','#'}};  #define KBD_DEBOUNCE_FACTOR 80    // Set this number to apx n/333 where                                   // n is the number of times you expect                                   // to call kbd_getc each second    void kbd_init() { }   short int ALL_ROWS (void) {    if (input (row0) & input (row1) & input (row2) & input (row3))       return (0);    else       return (1); }    char kbd_getc( ) {    static byte kbd_call_count;    static short int kbd_down;    static char last_key;    static byte col;     byte kchar;    byte row;     kchar='\0';    if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {        switch (col) {          case 0   : output_low(col0);                output_high(col1);                output_high(col2);                     break;          case 1   : output_high(col0);                output_low(col1);                output_high(col2);                     break;          case 2   : output_high(col0);                output_high(col1);                output_low(col2);                     break;        }         if(kbd_down) {          if(!ALL_ROWS()) {            kbd_down=false;            kchar=last_key;            last_key='\0';          }        } else {           if(ALL_ROWS()) {              if(!input (row0))                row=0;              else if(!input (row1))                row=1;              else if(!input (row2))                row=2;              else if(!input (row3))                row=3;              last_key =KEYS[row][col];              kbd_down = true;           } else {              ++col;              if(col==3)                col=0;           }        }       kbd_call_count=0;    }   return(kchar); }

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MatheusLPS

     

    Agora funcionou \o/ ,

     

    Depois que a senha esta correta, coloquei para ter sinal lógico 1 em uma saída, e um botão que caso seja pressionado,

    esta saída volte para nível lógico 0, porém não funcionou, segue abaixo;

     

       else if (n == 6)           //Se tenho 6 posições corretas, senha certa!
       {
          printf ("\n\rSenha Correta!");         //FIM!
          output_high(pin_b5);
     
          if(input(pin_b4)){
          delay_ms(3000);
          output_low(pin_b5);
          }
       }
     
    depois desta operação, gostaria de voltar para o estado original, digitar a senha. Para isso eu teria que fazer uma outra função void?
    :confused:
     
     
    eu fiz isto e funcionou o que acha?
     
     
    void botão();
     
       else if (n == 6)           //Se tenho 6 posições corretas, senha certa!
       {
          printf ("\n\rSenha Correta!");         //FIM!
          output_high(pin_b5);
          botão();
       }
     
    void botão()
    {
       while(true)
       {
          if(input(pin_b4)){
          delay_ms(1000);
          output_low(pin_b5);
          delay_ms(50);
          }
       }
    }
    Editado por marcelovillar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×