Pessoal,

 

Estive pesquisando uma forma para fazer 5 botões com a função "hold" usando uma porta analogica do Arduino, mas todas que eu encontrei eram muito complicadas, então fiz uma mais simples.

 

Veja como ficou:

 

Esse é o codigo:

 

// incluir a library do LCD
#include <LiquidCrystal.h>

// inicializar a library do LCD com nos pinos
LiquidCrystal lcd(11, 12, 7, 8, 9, 10);
int holdTime = 1500; // tempo do hold (botao pressionado)
int botao = 0; // botao apertado
int hold = 0; // botao pressionado x tempo
long onTime = 0; // conta tempo botao apertado

void setup() {
// Mensagem de abertura.
lcd.begin(16, 2);
lcd.print("5 botoes + hold v1");
lcd.setCursor(0,1);
lcd.print("by Renato Brant");
delay(1000);
lcd.clear();
long onTime = 0;

pinMode (A5, INPUT);
lcd.clear();
}

void loop() {

int valorBotao = analogRead(5); // le valor da tensao causado pelas resistencias dos botoes
int botao = 0; // considera que nenhum botao esta apertado

// vamos definir o valor lido na porta analogica para cada botao
if (valorBotao > 304 && valorBotao < 394) botao = 1; //botao UP
if (valorBotao > 484 && valorBotao < 574) botao = 2; //botao OK
if (valorBotao > 666 && valorBotao < 749) botao = 3; //botao RIGHT
if (valorBotao > 824 && valorBotao < 887) botao = 4; //botao LEFT
if (valorBotao > 938 && valorBotao < 989) botao = 5; //botao DOWN

// agora começa o sistema para fazer o HOLD
// enquanto nenhum botao é apertado, nos guardamos o valor do millis no onTime e deixamos o valor do HOLD zerado
if (valorBotao < 304){
onTime = millis();
hold=0;
}

// quando algum botao for apertado E o tempo que o botao esta apertado for maior que o holdTime, o valor do HOLD vai para 1.
if (valorBotao > 304 && ((millis() - onTime) > holdTime)) hold =1;

//Neste ponto, já temos as duas variaveis que nos interessa:
//botao => retorna o numero do botao que está sendo apertado
//hold => vira 1 se algum botão for apertado por mais de 3 segundos


//Para uma melhor visualização, vamos mandar alguns valores para o LCD

//obs: agora é só "firula"

// vamos visualizar o valor lido pela porta analogica

lcd.clear();

lcd.setCursor(0,0);
lcd.print("V");
lcd.print(valorBotao);

// vamos visualizar o valor de "botao"
lcd.setCursor(5,0);
lcd.print("B");
lcd.print(botao);

// vamos ver quanto tempo algum botao está apertado
lcd.setCursor(8,0);
lcd.print("T");
lcd.print((millis() - onTime)/1000);

// vamos ver se o "hold" está habilitado
lcd.setCursor(11,0);
lcd.print("H");
lcd.print(hold);

// na segunda linha, vamos mostrar o estado de forma escrita
lcd.setCursor(0,1);
if (botao == 0) lcd.print(" ");
else if (botao == 1) lcd.print("UP");
else if (botao == 2) lcd.print("OK");
else if (botao == 3) lcd.print("RIGHT");
else if (botao == 4) lcd.print("LEFT");
else if (botao == 5) lcd.print("DOWN");

if (hold == 1) lcd.print("+HOLD");

delay(250);

}




Aqui estão os esquemas:

Eu ainda não montei fisicamente, mas assim que eu tiver um tempo, eu farei e colocarei o video aqui.

Exibições: 3044

Anexos

Responder esta

Respostas a este tópico

Deve dar para descobrir se tem mais de uma tecla pressionada ao mesmo tempo também.

É possível sim. Talvez como o CKT está montado seja mais difícil perceber isso. Tentei imaginar (sem papel) o CKT com dois botões apertados e achei difícil calcular a queda de tensão.

Talvez se colocasse todos os botões em paralelo um com o outro e cada botão associado com uma resistência diferente seria mais fácil saber. Porém essa solução traz um problema que é utilizar resistores de valores diferente (mas acho que o original já usa). Este problema não é tanto problema assim, mas pensando em grande escala, ficaria mais barato utilizar resistores de valores iguais.

Dá sim.  Seria necessário alterar os valores das resistência de forma que sempre que duas teclas forem apertadas a resistência equivalente não seja igual a nenhuma outra resistência dos botões.

Só não fiz isso, pq para a aplicação que eu estou desenvolvendo, os 5 botões com hold já são suficientes.

Que programa de simulação é esse?

=D

Pelo desenho das coisas é o PROTEUS (VIDEO)

o OUtro dos esquemas com o arduino é o Fritzing

Valeu!

O Renyer está certo.  É o ISIS 7 da PROTEUS.

Para carater informativo, é desse jeito que alguns comandos no volante de veículos funcionam. Dá pra ler esses valores, tratar no arduino (ou PIC/Motorola) e transmitir para a entrada Wired de um rádio, geralmente DVDs.

Exato!

Entao... So descobri que os volantes com controle de radios funcionavam assim depois que comprei o meu hardware... Alguem sabe como deve ser o sinal na entrada wired dos DVDs? Imagino que cada modelo deve ser diferente do outro, mas podemos citar o pioneer como exemplo. Podemos criar um topico DIY para isso... Rs

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço