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:
15>
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
Postar um comentário