Contar de um em um Arduino + LCD Shield (contando na borda de subida)


Galera!
estou publicando esta postagem pois precisava fazer um contador que contasse toda a vez em que pressionasse um botão do LCD Shield em conjunto com o Arduíno. Pois bem, procurando na internet não encontrei nada relacionado, então decidi por a mão na massa e desenvolvi o código abaixo:

//---------------------inicio------------------------
byte pinBotao = 0;
int valorBotao = 0;
int estado = 0;
int ultimo_estado = 0;
int contador = 0;
int posicao = 0;

//------estados----------
//direita = 1
//cima = 2
//baixo = 3
//esquerda = 4
//enter = 5


#include  

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //RS,E,D4,D5,D6,D7

void desenha_tela(int a, int b)   //desenha_tela(contador,posicao)
{

     lcd.clear();
     lcd.print("Contador: ");
     lcd.print(a);
     lcd.setCursor(b,1);
     lcd.print("O");

}

void menu()
{
   lcd.print("F1 - Contador");
   lcd.setCursor(0,1);
   lcd.print("F2 - Menu 2");
   lcd.setCursor(0,2);
   lcd.print("F3 - Menu 3");


}

void setup() {
    Serial.begin(9600);
    Serial.println("inicio");
    // create a new custom character
    lcd.begin(16, 2);
    lcd.print("Eletronica Tche");
}
void loop() {
    valorBotao = analogRead(pinBotao);

//se for pressionado direita
if(valorBotao >=0 && valorBotao < 50)
{ estado = 1;}

//se for pressionado cima
if(valorBotao >=50 && valorBotao < 150)
{ estado = 2;}

//se for pressionado baixo
if(valorBotao >=150 && valorBotao < 300)
{ estado = 3;}

//se for pressionado esquerda
if(valorBotao >=400 && valorBotao < 550)
{ estado = 4;}

//se for pressionado enter
if(valorBotao >=600 && valorBotao < 750)
{ estado = 5;}

if (estado != ultimo_estado)
{

//------------------ contador------------------
   if (estado==2)
    {
     contador ++;
     desenha_tela(contador,posicao);
     ultimo_estado = estado;
    }

   if (estado==3)
   {
     contador --;
     desenha_tela(contador,posicao);
     ultimo_estado = estado;
    }
//---------------fim contador------------------

//---------------posicao-----------------------
   if (estado==1)
   {
     posicao ++;
     if(posicao>15){posicao = 15;}
     desenha_tela(contador,posicao);
     ultimo_estado = estado;
    }
    if (estado==4)
   {
     posicao --;
     if(posicao < 0){ posicao=0;}
     desenha_tela(contador,posicao);
     ultimo_estado = estado;
    }
//-------------- fim posicao------------------

//-----------enter----------------------------
   if(estado==5)
   {
     contador = 0;
     posicao = 0;
     for(int i=0;i<15;i++){        contador++;
       posicao++;
       desenha_tela(contador,posicao);
       delay(500);
     }
     for(int i=15;i>0;i-- )
     {
       contador--;
       posicao--;
       desenha_tela(contador,posicao);
       delay(500);
     }
   
     ultimo_estado = estado;
 
   }

//-----------fim enter------------------------
}

    if(valorBotao==1023)
    {
     ultimo_estado = 0;
     estado = 0;
    }
    Serial.println(valorBotao);
    delay(50);
}
//-------------------fim----------------------------

   Funciona assim: não vou me deter muito em explicações do Arduíno então como todos sabem o LCD Shield trabalha com os botões na entrada analógica A0*** e que entra no arduino por um conversor analógico/digital:



então quando não estamos pressionando nenhum botão a entrada A0 (pinBotão=0) tem um valor de 1023.
quando pressionamos algum botão como por exemplo o de UP, a entrada A0 recebe um valor entre 50 e 150 (este valor pode variar de um LCD Shield para outro, mas genericamente o código é o mesmo), então quando pressionamos UP a variável estado vai receber 2, com uma comparação entre estado e ultimo_estado é diferente entao vai fazer contador ++ e não vai se repetir pois estado e ultimo_estado vão se tornar iguais (ultimo_estado = estado), ao soltarmos o botão UP a entrada A0 recebe novamente 1023 (quer dizer que soltamos o botão) então estado e ultimo_estado recebem 0 novamente.

da mesma forma se faz com o Down apenas se troca contador++ por contador --


*** O circuito pode ser controlado também por entradas digitais que é bem mais fácil a leitura, usa-se a função digitalRead() e verifica se o pino está em nivel alto ou baixo se está alto conta, se está baixo zera os estados.

Comentários

Postagens mais visitadas deste blog