acender led por um botão (PIC)

Discussão em 'Dicas e tutoriais' iniciado por kodo no kami, 25 Janeiro 2017.

  1. kodo no kami
    Online

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    229
    Sexo:
    Masculino
    Avaliações:
    +303 / -0
    e ae galera nesse tutorial vou ensinar acender um led por um botão ligado a um PIC, como sempre vou esta usando o simulador proteus e o compilador mikroC tambem devo lembrar que sei pouca coisa de eletronica o basico do basico, bom para começar vou abrir o proteus

    [​IMG]

    agora selecionamos o PIC que no caso vou usar o mesmo do tutorial anterior que é o 16f84a, tambem buscamos o led e o resistor embora boa parte dos tutorias eu abordo apenas a logica esquecendo um pouco ate da lei de ohms (lembrando que em projetos reais nao pode faltar os resistores se não os demais componentes vão queimar), no caso desse tutorial realmente vamos precisar de um resistor para que o circuito funcione como esperado e nao pelo motivo de queimar o componentes em si (ps: tambem buscamos o botão que eu esqueci kkkk)

    [​IMG]

    a logica desse circuito vai ser bem simples quando apertar o botao vai passar corrente para um dos pinos do microcontrolador que no caso vai ser o RA0, ele vai detectar caso isso aconteça e depois enviar corrente tambem por outro pino que vai ativar o led que no caso vai ser o RB1, quando apertar o botao novamente ele vai desativar aquele o outro pino (RB1) que vai apagar o led ou seja cada vez que apertar o botao vai acender o led caso esteja apagado ou vai apagar caso esteja aceso

    [​IMG]

    a corrente que vai passar pelo botão pode ser externa, pode ser a mesma que alimenta o microcontrolador ou ate mesmo ser gerada por um dos pinos do microcontrolador que é nosso caso ja que vamos usar o pino RB0

    [​IMG]

    o resistor nesse caso vamos usar para pull down, para fazer isso colocamos um resistor mais alto e interligamos em com gnd, com isso quando apertar o botão vai passar corrente com o resistor ali a tendência da corrente é ir para o local mais facil que é o pino (RA0) e não direto para o terra ja que existe uma pequena resistencia naquela direção por outro lado quando soltar o botao o pino RB0 não vai enviar corrente para RA0 e vai ter o terra entre o RA0 ou seja 0v no RA0 com isso o microcontrolador vai ter essa base de 5v e 0v o que não aconteceria sem o pull down (lembrando que em um projeto real tambem ia precisar de um resistor em serie com o led para nao queimar ele)

    [​IMG]

    nosso circuito esta pronto agora falta escrever o programa do PIC para isso vamos usar o mikroC, abrimos ele criamos um projeto novo e selecionamos aquele modelo de PIC

    [​IMG]

    no nosso codigo primeira coisa que vamos especificar qual o pino que vai ser de saida e qual vai ser de entrada, no nosso caso o pino RA0 que vai ser entrada e os de saida vão ser o RB0 e RB1, para facilitar vou especificar todos pinos RA como entrada e todos os RB como saida usando o TRISA e TRISB

    Código (Forge Crash):
    void main() {
      TRISA = 0b11111111;
      TRISB = 0b00000000;
    }
    como o pino RB0 vai sempre enviar corrente entao deixamos ele ativado e o pino RB1 vamos iniciar com ele desligado

    Código (Forge Crash):
    void main() {
      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
    }
    agora criamos um loop infinito para ficar repetindo

    Código (Forge Crash):
    void main() {
      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      }
    }
    dentro do loop usamos a condição if e checamos o pino RA0 se for igual a 1 quer dizer que tem corrente passando por ele

    Código (Forge Crash):
    void main() {
      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      if(PORTA.RA0 == 0x1){
      }
      }
    }
    criamos uma variavel que vai ser para armazenar o estado atual ou seja quando for apertando o botao o que vai definir se vai aceder ou apagar vai ser essa variavel que vou chamar de estado, tambem definimos um valor padrao para começar que no meu caso vai ser o 0 ou seja apagado

    Código (Forge Crash):
    void main() {
      int estado = 0;

      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      if(PORTA.RA0 == 0x1){
      }
      }
    }
    dentro do if basta a gente atribuir a variavel para ela mesmo usando uma negação antes ou seja se o valor dentro dela for 0 vai virar um ou se ele for 1 vai virar 0

    Código (Forge Crash):
    void main() {
      int estado = 0;

      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      if(PORTA.RA0 == 0x1){
      estado = !estado;
      }
      }
    }
    agora basta atribuir essa variavel para o pino RB1

    Código (Forge Crash):
    void main() {
      int estado = 0;

      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      if(PORTA.RA0 == 0x1){
      estado = !estado;
      PORTB.RB1 = estado;
      }
      }
    }
    colocamos um pequeno delay com isso nosso programa esta pronto bastando compilar

    Código (Forge Crash):
    void main() {
      int estado = 0;

      TRISA = 0b11111111;
      TRISB = 0b00000000;
       
      PORTB.RB0 = 0x1;
      PORTB.RB1 = 0x0;
       
      while(1){
      if(PORTA.RA0 == 0x1){
      estado = !estado;
      PORTB.RB1 = estado;
      Delay_ms(200);
      }
      }
    }
    [​IMG]

    depois de compilar basta jogar dentro do PIC e testar se estiver tudo certo quando apertar o botão vai acender o led

    [​IMG]

    se apertar o botão novamente vai apagar o led

    [​IMG]

    bom galera o led foi apenas um exemplo pode ser usado para ativar, desativar ou ate mesmo monitorar qualquer coisa como acender uma lampada, abrir um portão, ligar um motor, ativar o android numero 17 (prefiro a 18 XD )

    by kodo no kami
     
    • Vencedor Vencedor x 3
    • Útil Útil x 3
  2. Agleylson
    Offline

    Agleylson Membro Ativo VIP Industrial

    Afiliado:
    6 Junho 2016
    Mensagens:
    74
    Sexo:
    Masculino
    Avaliações:
    +62 / -0
    Apelido no Minecraft:
    Agley1997
    topper
     
    • Gostei Gostei x 1
  3. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    hmmmmm
    prefiro digitalWrite()
     
    • Concordo Concordo x 1
  4. kodo no kami
    Online

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    229
    Sexo:
    Masculino
    Avaliações:
    +303 / -0
    tambem da para criar um codigo picduino generico e usar o digitalWrite kkkk

    Código (Forge Crash):

    #define pinMode(A,B) A = B
    #define digitalWrite(A,B) A = B
    #define digitalRead(A) A
    #define INPUT 0b11111111
    #define OUTPUT 0b00000000
    #define HIGH 0x1
    #define LOW 0x0

    void main() {
      int estado = 0;

      pinMode(TRISA,INPUT);
      pinMode(TRISB,OUTPUT);

      digitalWrite(PORTB.RB0,HIGH);
      digitalWrite(PORTB.RB1,LOW);

      while(1){
      if(digitalRead(PORTA.RA0) == HIGH){
      estado = !estado;
      digitalWrite(PORTB.RB1,estado);
      Delay_ms(200);
      }
      }
    }
     
    o legal de fazer esse mesmo circuito no arduino que nao precisaria do resistor de pull down ja que o proprio pino do arduino pode ser usado um pulldown internamente \*-*
     
    • Concordo Concordo x 1
  5. natan12_
    Offline

    natan12_ Veterano Veterano VIP Industrial

    Afiliado:
    22 Fevereiro 2014
    Mensagens:
    1,131
    Sexo:
    Masculino
    Avaliações:
    +508 / -0
    Apelido no Minecraft:
    natan12_
    Lembra de colocar () em volta dos usos dos parametros nas macros pra não bugar quando expandir

    Código (C):

    #define pinMode(A,B) (A) = (B)
    #define digitalWrite(A,B) (A) = (B)
    #define digitalRead(A) (A)
    #define INPUT 0b11111111
    #define OUTPUT 0b00000000
    #define HIGH 0x1
    #define LOW 0x0
     
     
    • Gostei Gostei x 1

Compartilhe esta Página