Pessoal preciso de ajuda para montar um menu num LCD 1602 igual ao da figura anexa. São apenas 3 botões, 1 para aumentar, 1 para diminuir e um para pular para o próximo. Os parâmetros estão na figura. Seria legal que ao manter o botão pressionado, os valores forem aumentando automaticamente.

Se alguém puder me ajudar fico muito grato!

Exibições: 1479

Anexos

Responder esta

Respostas a este tópico

q tal usarmos o http://pastebin.com/index

veja :  http://pastebin.com/bi98FhGD   fica a dica ;)

Olá Diego; Obrigado pela dica! muito boa!

Opa agradeço o retorno Enrique, bem li o que você me disse e bolei outro código a partir desse ultimo que você me passou, não sei se vai funcionar como você quer pois seria necessário mais adaptações isso falo na parte do botão pois coloquei um "while", acredito que quando ele fique pressionado o valor da tela só atualiza depois de soltar o botão ou chegar ao valor máximo, ja na questão de piscar o "+-" acredito que funcione bem, claro nada é certeza pois apenas rodei o código na cabeça  e não tenho muita experiencia com lcd ainda(meu material de estudo ta pra chegar) em fim vamos ao que interessa espero que funcione!

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int i=0; //Variável para contagem
int botMODE=12;//entrada botao Mode
int botUp=11;//entrada do botao up
int botDown=10;//entrada do boto down
int mode=0,Hz=30,Us=50,V=70,S=10; // Valores mostrados ao iniciar o estimulador
int cont=250; //Tempo entre mudança de menu
int Tbot=100; //Variável para definir velocidade do botão up e dw
#define t_500 delay(Tbot); //Tempo entre mudança de valor
#define Lcd_ativo lcd.print("+-");delay(400);lcd.print(" ");delay(400);
//maximos
#define Hz_valorUp Pressed_Up; while(bot_Up == LOW&&Hz<120){Hz++;t_500;}//limita a 120
#define Us_valorUp Pressed_Up; while(bot_Up == LOW&&Us<500){Us++;t_500;}//limita a 500
#define V_valorUp Pressed_Up; while(bot_Up == LOW&&V<100){V++;t_500;}//limita a 100
#define S_valorUp Pressed_Up; while(bot_Up == LOW&&S<60){S++;t_500;}//limita a 60
//minimos
#define Hz_valorDow Pressed_Down; while(bot_Dow == LOW&&Hz>1){Hz--;t_500;}//limita a 1
#define Us_valorDow Pressed_Down; while(bot_Dow == LOW&&Us>10){Us--;t_500;}//limita a 10
#define V_valorDow Pressed_Down; while(bot_Dow == LOW&&V>0){V--;t_500;}//limita a 0
#define S_valorDow Pressed_Down; while(bot_Dow == LOW&&S>1){S--;t_500;}//limita a 1
//se for usar botoes com resistor altere a "if(botStats ==LOW)" para HIGH e a INPUT_PULLUP para INPUT
//eu uso nesse modo para liga diretamente o GND na porta do botao
#define Pressed_Mode int bot_Stats = digitalRead(botMODE); if(bot_Stats == LOW){mode++; delay(cont);}if(mode == 4){mode=0;}//4 é o numero maximo de menus
#define Pressed_Up int bot_Up = digitalRead(botUp);
#define Pressed_Down int bot_Dow = digitalRead(botDown);
void setup(){
lcd.begin(16, 2);
pinMode(botMODE,INPUT_PULLUP);
pinMode(botUp,INPUT_PULLUP);
pinMode(botDown,INPUT_PULLUP);
lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
lcd.print("NEUROESTIMULADOR"); //Escreve no LCD
for(i=0;i<=4;i++) //Laço para a o efeito de piscagem da segunda linha
{
lcd.setCursor(0,1); //Posiciona cursor
lcd.print(" "); //Limpa segunda linha
delay(250); //Permanece por 250 milissegundos apagada
lcd.setCursor(0,1); //Posiciona cursor
lcd.print(" *** PACHON ***"); //Escreve na tela do LCD a mensagem "PACHON"
delay(250); //Permanece por 250 milissegundo acesa
}
lcd.clear(); //Limpa LCD
lcd.setCursor(1,1); //Posiciona cursor
lcd.print("Hz uS V S"); //Coloca as unidades
lcd.setCursor(5,0); //Posiciona cursor
lcd.print("50 70 10"); //Valores iniciais
// lcd.print(" ");
}

void loop(){
Pressed_Mode;//verifica qual o menu
if(mode == 0){
lcd.setCursor(12,1); //Coloca +- no menu ativo e recupera o anterior
lcd.print(" S");
lcd.setCursor(1,1);
Lcd_ativo;
Hz_valorUp;
Hz_valorDow;
//resto dp codigo do menu 1
// Rotina para justificar os números
if (Hz<10) { // o Hz tem apenas 1 dígito
lcd.setCursor(0,0); //Posiciona cursor
lcd.print(" "); //limpa as dezenas e centenas
lcd.setCursor(2,0); //Posiciona cursor
lcd.print(Hz); //Coloca a freq
}
if (Hz>9 && Hz<100){ // o Hz tem apenas 2 dígitos
lcd.setCursor(0,0); //Posiciona cursor
lcd.print(" "); //limpa as centenas
lcd.setCursor(1,0); //Posiciona cursor
lcd.print(Hz); //Coloca a freq
}
if (Hz>99){ // o Hz tem 3 dígitos
lcd.setCursor(0,0); //Posiciona cursor
lcd.print(Hz); //Coloca a freq
}

}
if(mode == 1){
lcd.setCursor(1,1); //Coloca +- no menu ativo e recupera o anterior
lcd.print("Hz");
lcd.setCursor(5,1);
Lcd_ativo;
Us_valorUp;
Us_valorDow;
//resto do codigo do menu 2
// Rotina para justificar os números
if (Us<100){ // o PW tem apenas 2 dígitos
lcd.setCursor(4,0); //Posiciona cursor
lcd.print(" "); //limpa as centenas
lcd.setCursor(5,0); //Posiciona cursor
lcd.print(Us); //Coloca o PW
}
if (Us>99){ // o PW tem 3 dígitos
lcd.setCursor(4,0); //Posiciona cursor
lcd.print(Us); //Coloca o PW
}
}
if(mode == 2){
lcd.setCursor(5,1); //Coloca +- no menu ativo e recupera o anterior
lcd.print("uS");
lcd.setCursor(9,1);
Lcd_ativo;
V_valorUp;
V_valorDow;
//resto do codigo do menu 3
// Rotina para justificar os números
if (V<10) { // a V tem apenas 1 dígito
lcd.setCursor(8,0); //Posiciona cursor
lcd.print(" "); //limpa as dezenas
lcd.setCursor(10,0); //Posiciona cursor
lcd.print(V); //Coloca a V
}
if (V>9 && V<100){ // a V tem apenas 2 dígitos
lcd.setCursor(8,0); //Posiciona cursor
lcd.print(" "); //limpa as centenas
lcd.setCursor(9,0); //Posiciona cursor
lcd.print(V); //Coloca a V
}
if (V>99){ // a V tem 3 dígitos
lcd.setCursor(8,0); //Posiciona cursor
lcd.print(V); //Coloca a V
}

}

if(mode == 3){
lcd.setCursor(9,1); //Coloca +- no menu ativo e recupera o anterior
lcd.print(" V");
lcd.setCursor(12,1);
Lcd_ativo;
S_valorUp;
S_valorDow;
//resto do codigo do menu 4
// Rotina para justificar os números
if (S<10) { // o tempo tem apenas 1 dígito
lcd.setCursor(12,0); //Posiciona cursor
lcd.print(" "); //limpa as dezenas
lcd.setCursor(13,0); //Posiciona cursor
lcd.print(S); //Coloca o tempo
}
if (S>9){ // o tempo tem apenas 2 dígitos
lcd.setCursor(12,0); //Posiciona cursor
lcd.print(S); //Coloca o tempo
}
}
}//void loop

Olá Romário! Obrigado de novo, mas desta vez não funcionou. O delay colocado para piscar o (+-) foi acrescentado na rotina do botão e os valores sobem ou descem muuuuiiito devagar. Essa era minha dificuldade quando tentei fazer. Quanto ao While, não tentei pois prefiro ver os valores sendo modificados. Vc não tem um display de LCD? Mande seu endereço que eu envio um pra você como gratidão pela ajuda ok! abraços.

Muito grato amigo, não tenho mais tranquilo precisa não, o fórum é pra isso mesmo, eu  tava mesmo suspeitando que ia dar problema, mais nada é impossível vou refazer o código hoje a noite (que a cabeça funciona melhor rsrs) e se possível mando pela manha ou a noite mesmo se eu terminar cedo e tiver 100% de certeza que da certo rsrs, grato!

Puxa Romário, faço questão cara! O meu aparelho está funcionando devido à sua ajuda. Acrescentei mais um menu ao final. Ele é um estimulador neurológico. Já tinha feito um analógico que funciona muito bem e utilizo em minha tese. Agora quero fazê-lo digital e estou avançando bem graças à ajuda do forum e de gente como vc! Se preferir, mande um e-mail pra mim (epachon@gmail.com) com seu endereço que mando entregar já! Tenho certeza que vou precisar de sua ajuda para terminá-lo! Agora mandei vir um potenciômetro digital para o arduino controlar a saída (que varia entre 0 e 100V). A programação ainda vai longe!  Muito grato!

Enrique modifiquei o código e testei no proteus

o código esta no link http://pastebin.com/aDX7FBeH

Prezado Cabecavil: Muito obrigado pela ajuda. Como já havia modificado o código, não aproveitei o seu totalmente, mas a dica de colocar as unidades para piscarem foi excelente! Essa eu implementei na hora, pois era exatamente o que eu estava procurando!

Muito grato!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço