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.
Tags:
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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por