Estou montando um projeto de um temporizador programável com desativação por senha.

Preciso montar um menu para configuração de tempo e senha, porém esse menu deve ser acessado ao pressionar a tecla asterisco do teclado matricial 4x4 em um tempo programado, no caso 5 segundos.

Caso o arduino seja ligado, e passar os 5 segundos, o temporizador inicia com os padrões pré-programados.

Caso o arduino seja ligado, e em menos de 5 segundos a tecla asterisco do teclado matricial seja pressionada, ela entra em modo de programação, mais ou menos como um computador ao pressionar DEL para entrar na BIOS.

Ja tentei de várias maneiras, acabei apagando o código que havia escrito, senão, postaria aqui.

OBS.: uso um teclado matricial 4x4 ligado nas saídas SDA e SCL utilizando um PCF8574. O teclado funciona normalmente, ele lê todas as teclas e imprime em serial ou no lcd.

Exibições: 393

Responder esta

Respostas a este tópico

Oi BR, boa noite.

Achei confusa a sua descrição do projeto.

Procure fazer uma descrição com frases curtas, simples e sequencial, quase como um fluxograma.

Assim terá melhor chance dos amigos daqui ajudar.

Rui

Ok Rui,

Fiz alterações, agora ficou mais claro!

Obrigado!

Você pode criar duas funções em seu código sendo uma função responsável pelo 'menu' e a outra pelas instruções que você já tem. Ao iniciar seu código (inicio do loop) salve o tempo de execução atual em uma variável que pode ser essa boot_time e entre em um loop while enquanto o tempo de execução for menor que a variável + 5000 ou uma variável auxiliar for igual a um, representando que o botão foi pressionado e em seguida verifique por que seu programa saiu do while (tempo ou botão pressionado) e chama a função correspondente. Algo mais ou menos desse jeito

aux = 0;

boot_time = millis() + 5000;

while((millis() <= boot_time) && (aux == 0){

    if(digitalRead(buttonPin) == HIGH) aux = 1;

}

if(aux == 1){

   chama_menu();

}else{

   chama_instrucoes();

}

Não testei esse código e acho que ele ainda pode ser otimizado, mas já é um começo para você se guiar.

Para teste fiz saída dos dados em serial, e aparentemente funcionou perfeitamente, agora preciso adicionar ao meu projeto, mais ficara para semana que vem, segue o código de testes:

#include <Wire.h>
#include <Keypad.h>
#include <Keypad_I2C.h>
#include <LiquidCrystal_I2C.h>

#define I2CADDR 0x20

const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'a'},
  {'4', '5', '6', 'b'},
  {'7', '8', '9', 'c'},
  {'*', '0', '#', 'd'}
};
byte rowPins[ROWS] = {0, 1, 2, 3};
byte colPins[COLS] = {4, 5, 6, 7};

Keypad_I2C customKeypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR);

LiquidCrystal_I2C lcd(0x3F, 20, 4);

int boot_time = millis() + 5000;
char aux = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.clear();
  customKeypad.begin();
  Serial.begin(9600);
  lcd.setCursor(0, 0);
}

void loop() {
  char customKey = customKeypad.getKey();
 
  while((millis()<=boot_time)&&(aux==0)){
    if (customKey == '*'){
      aux = '1';
    }
  }
  if(aux == '1'){
    Serial.println("MENU");
    delay(1000);
  }
  else{
    Serial.println("CONTAGEM");
    delay(1000);
  }
   
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço