Projeto - Contador de Apertos 0 até 99 com Display de 7 Segmentos e Botão

    Retornando ao desenvolvimento de circuitos com microcontrolador Arduino, hoje estou trazendo um circuito multiplexador com dois displays de 7 segmentos, botões e dois transistores TIP41. 

    Esse projeto faz parte dos meus estudos com microcontroladores Arduino e, em breve, com outros microcontroladores mais modernos como o STM32.

FUNCIONAMENTO DO PROJETO

    Ao apertar um dos botões, um sinal é enviado para a entrada digital do Arduino, fazendo que ele incremente +1 a variável inteira "contador" e em seguida mostra o valor do "contador" no display de 7 segmentos. É um display para as dezenas e um para as unidades" O multiplexador com os transistores fará com que cada número apareça no display com uma frequência alta o suficiente para que a unidade e dezena de um número aparecereçam. Isso significa que, caso o número 27 esteja no display, a dezena "2" e a unidade "7" estão piscando individualmente no display tão rápido que o usuário entende que o número 27 está contando no display  Caso o usuário queira decrementar o valor que aparece no display, basta apertar o outro botão. 

FUNCIONAMENTO DO CÓDIGO

    O código inicia criando as variáveis globais "estadoAnterior" e "estadoAnterior1". Essas variáveis são responsáveis por guardar o estado dos dois botões do projeto. Elas são necessárias para evitar que, ao manter o botão pressionado, o usuário incremente valores ao contador, o que não faz parte do projeto. 

    Em seguida, em "void setup()", o programa inicializa o microcontrolador informando quais portas serão saídas e entradas por meio do comando "pinMode( número da porta, Entrada (Input) ou saída (OUTPUT)). 

    Para diminuir a quantidade de linhas dentro da execução principal "void loop ()", foram criadas as funções; "void display(int numero)", "displayoff()", "void q1(int s)", "void q2(int b)" e "void DSP(int numero)".

    Sobre "void display(int numero)": Essa função é responsável por fazer os números aparecerem em cada display de 7 segmentos. Caso a variável "numero" assuma um valor entre 0 e 9, o mesmo aparecerá em um dos displays. A função "displayoff()" é chamada para garantir que todas as LED dos 7 segmentos do display estejam apagadas ao iniciar o código.

    Sobre "void q1(int s)" e "void q2(int b): Essas funções é para acionar cada um dos transistores que ligarão ou desligarão os displays de 7 segmentos. Eles são necessários para que as unidades e dezenas apareçam nos displays.

    Sobre "void DSP(int numero)": Essa função é a chave do programa. Ela faz as dezenas e unidades aparecerem no display, piscando e apagando muito rápido. Ela começa chamando um "for()" para que os números apareçam 10 vezes dentro de 1 segundo. Dentro do "for()", a função chama a função "display(numero%10)" para que ela retorne o último dígito de um número. Por exemplo, se numero = 27, o resto da divisão de 27/10 será 7. Então o código aciona o primeiro transistor por meio da função "q1(1)", espera 5 milisegundos e desliga o transistor 1 e 2 por meio das funções "q1(0)" e "q2(0)". Nesse caso é necessário também desligar o segundo transistor para garantir que o mesmo esteja desligado. Em seguida a função chama a função "display(numero/10)" para que ela retorne o primeiro dígito de um número. Por exemplo, se numero = 27, o resultado da divisão de 27/10 será 2,7, mas como o "numero" é inteiro, ele retornará "2" para o display. Em seguida o código aciona o transistor 2 por meio da função "q2(1)", espera 5 milisegundos, e desliga os dois transistores.

    O código principal, "void loop()", começa chamando um "for()" para limitar a contagem do botão de 0 até 99. Em seguida ele faz a leitura das portas 5 e 4 do Arduino e salva o valor nas variáveis "estado1" e "estado". Então ele chama a função "DSP(contador), atribuindo o valor da variável "contador", para que a mesma apareça no display. Em seguida, o código verifica se a variável "estado" é igual a variável "estadoAnterior", pois é necessário saber se o usuário está mantendo ou não o dedo pressionado no botão. Se o "estado" for diferente do "estadoAnterior", o código vai verificar se o "estado" da porta é alto (botão pressionado) ou baixo (botão não pressionado). Caso o botão esteja pressionado, o código incrementa +1 a variável "contador". Em seguida, ele verifica o estado do botão decrementador, por meio do "if(estado1 != estadoAnterior1), além de verificar se o contador é maior que zero, para evitar um bug nos displays de 7 segmentos, por meio de "if(contador>0)" e depois ele verifica o estado do botão decrementador. Se ele estiver pressionado, a variável terá um decremento de -1. Depois disso, o código salva o estado dos botões incrementador e decrementador por meio do "estadoAnterior1 = estado1" e "estadoAnterior = estado". 

Link do Funcionamento: https://youtube.com/shorts/lWv48vV-N-Q?feature=share










int estadoAnterior;

int estadoAnterior1;

void setup() {

pinMode(5, INPUT);

pinMode(4, INPUT);

pinMode(13, OUTPUT);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

pinMode(8, OUTPUT);

pinMode(7, OUTPUT);

pinMode(6, OUTPUT);

}

void display(int numero){

      displayoff();

      if(numero == 0)

  {

    digitalWrite(7, HIGH);

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(11, HIGH);

    digitalWrite(10, HIGH);

  }

  if(numero == 1)

  {

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);  

  }

  if(numero == 2)

  {

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(6, HIGH);

    digitalWrite(10, HIGH);

    digitalWrite(11, HIGH);

  }

  if(numero == 3)

  {

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(6, HIGH);

    digitalWrite(11, HIGH);

  }

  if(numero == 4)

  {

    digitalWrite(7, HIGH);

    digitalWrite(6, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);

  }

  if(numero == 5)

  {

    digitalWrite(6, HIGH);

    digitalWrite(7, HIGH);

    digitalWrite(9, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(11, HIGH);

  }

  if(numero == 6)

  {

    digitalWrite(9, HIGH);

    digitalWrite(7, HIGH);

    digitalWrite(6, HIGH);

    digitalWrite(11, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(10, HIGH);

  }

  if(numero == 7)

  {

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);

  }

  if(numero == 8)

  {

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(11, HIGH);

    digitalWrite(10, HIGH);

    digitalWrite(7, HIGH);

    digitalWrite(6, HIGH);

  }

  if(numero == 9)

  {

    digitalWrite(9, HIGH);

    digitalWrite(8, HIGH);

    digitalWrite(6, HIGH);

    digitalWrite(7, HIGH);

    digitalWrite(12, HIGH);

    digitalWrite(11, HIGH);

  }

}

void displayoff(){

    digitalWrite(9, LOW);

    digitalWrite(8, LOW);

    digitalWrite(7, LOW);

    digitalWrite(6, LOW);

    digitalWrite(10, LOW);

    digitalWrite(11, LOW);

    digitalWrite(12, LOW);

    digitalWrite(13, LOW);

}

void q1(int s){

  if (s == 1){

    digitalWrite(2, HIGH);

  } else {

    digitalWrite(2, LOW);

  }

}

void q2(int b){

  if (b == 1){

    digitalWrite(3, HIGH);

  } else {

    digitalWrite(3, LOW);

  }

}

void loop() {

  for(int contador = 0; contador <= 99;){

    int estado = digitalRead(5);

    int estado1 = digitalRead(4);

    DSP(contador);

    if(estado != estadoAnterior){

        if(estado == HIGH){

        contador++;

        }

    }

    if(estado1 != estadoAnterior1){

      if(contador > 0){

        if(estado1 == HIGH){

          contador--;

        }

      }

    }

    estadoAnterior1 = estado1;

    estadoAnterior = estado;

  }

}

void DSP(int numero)

{

  for(int i=0; i<10; i++)

  {

    display(numero%10);

    q1(1);

    _delay_ms(5);

    q1(0);q2(0);

    display(numero/10);

    q2(1);

    _delay_ms(5);

    q1(0);q2(0);

  }

}

Comentários

Postagens mais visitadas