LCD keypad backlight

Boas,

Eu tenho um lcd com botões e queria que após 30 segundos sem mexer nos botões a luz de fundo se apagasse, o problema no meu código que mesmo estando a mexer nos botões passados os 30 segundos o lcd apagasse.

Aqui está o código que estou a utilizar

if (analogRead(keypad_pin) == 1023) {
    if (currentMillis - previousMillis >= 30000) {
      previousMillis = currentMillis;
      digitalWrite(blPin, LOW);
    }
  }
  else {
    digitalWrite(blPin, HIGH);
  }

Queria também que quando pressionasse o botão uma vez a luz de fundo ligava e só depois de pressionar o botão pela segunda vez é que dava para mudar os valores.

Obrigado desde já :slight_smile:

Se o código completo é bastante difícil responder à questão.
O que faz a seguinte linha?

if (analogRead(keypad_pin) == 1023) {

Como são lidas as teclas?

O código completo tem cerca de 1000 linhas por isso não vou postar tudo.

O valor lido na entrada analógica 0 sem estar a pressionar os botões é 1023, depois o valor altera dependendo do botão que se pressiona.

char ReadKeypad()
{

  keypad_value = analogRead(keypad_pin);

  if (keypad_value < 50) return btnRIGHT ;
  else if (keypad_value < 250) return btnUP;
  else if (keypad_value < 450) return btnDOWN;
  else if (keypad_value < 650) return btnLEFT; 
  else if (keypad_value < 850) return btnSELECT;
  else return btnNONE;

}

O código que acrescento não ajuda em nada. Preferia ver a zona do programa que gere os menus (onde são executadas as acções após a pressão das teclas). Se 1023 é o valor que é devolvido quando não existe tecla, não consegue fazer o que pretende com o código que postou originalmente (precisa de ter informação de quando é premida uma tecla para reiniciar a contagem de tempo).
Basicamente, o que precisa de fazer é guardar o valor de millis cada vez que uma tecla é premida. Quando a diferença entre o millis actual e o valor guardado é superior, no seu caso a 30 segundos, o backlight é desligado. Quando prime uma tecla, deve verificar se o backlight está ligado ou não. Caso não esteja, deve acender.

Já consegui resolver o problema.

Obrigado :slight_smile: