I'm making a project about a "bomb", however I'm having a problem with the part of the code that concerns writing the deactivation code, the part of the code that concerns that is between lines 200 to 227.
The error it's giving me is that when I'm on the code selection screen I can't write any numbers. Can anyone help me?
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x20, 16, 2);
const byte numLinhas = 4;
const byte numColunas = 4;
char teclas[numLinhas][numColunas] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte pinosLinhas[numLinhas] = { 9, 8, 7, 6 };
byte pinosColunas[numColunas] = { 5, 4, 3, 2 };
Keypad meuTeclado = Keypad(makeKeymap(teclas), pinosLinhas, pinosColunas, numLinhas, numColunas);
enum Estado {
MENU,
TEMPO1,
BOMBA_ARMADA_CHAVE,
BOMBA_DESARMADA_CHAVE,
TEMPO2,
BOMBA_ARMADA_BOTAO,
BOMBA_DESARMADA_BOTAO,
CODIGO,
TEMPO3,
BOMBA_ARMADA_CODIGO,
BOMBA_DESARMADA_CODIGO,
BUZZER
};
Estado estadoAtual = MENU;
int modo = 0;
char traco1 = '-';
char traco2 = '-';
char traco3 = '-';
char traco4 = '-';
char digito1 = '-';
char digito2 = '-';
char digito3 = '-';
char digito4 = '-';
char digito5 = '-';
int horas = 0;
int minutos = 0;
int segundos = 0;
int flag = 0;
unsigned long tempoAnterior = 0;
unsigned long tempoAnteriorBuzzer = 0;
const long intervalo = 1000;
const long intervaloBuzzerCurto = 500;
#define CHAVE 10
#define PINO_BUZZER 11
#define BOTAO 12
bool bombaArmada = false;
bool botaoPressionado = false;
bool buzzerAtivo = true; // Inicia com o buzzer ativado
void setup() {
lcd.init();
lcd.clear();
lcd.backlight();
pinMode(CHAVE, INPUT);
pinMode(PINO_BUZZER, OUTPUT);
pinMode(BOTAO, INPUT);
}
void loop() {
unsigned long tempoAtual = millis();
char tecla = meuTeclado.getKey();
if (tecla == '*') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selecione o modo");
modo = 0;
estadoAtual = MENU;
traco1 = '-';
traco2 = '-';
traco3 = '-';
traco4 = '-';
digito1 = '-';
digito2 = '-';
digito3 = '-';
digito4 = '-';
digito5 = '-';
noTone(PINO_BUZZER);
delay(500);
}
if (estadoAtual == MENU) {
lcd.setCursor(0, 0);
lcd.print("Selecione o modo");
if (tecla != NO_KEY) {
if (tecla >= '0' && tecla <= '9') {
modo = modo * 10 + (tecla - '0');
lcd.setCursor(0, 1);
lcd.print(modo); // Exibe imediatamente o número digitado
} else if (tecla == '#') {
lcd.setCursor(0, 1); // Move o cursor para a segunda linha
if (modo == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo: ");
lcd.setCursor(7, 0);
lcd.print(traco1);
lcd.print(traco2);
lcd.print(":");
lcd.print(traco3);
lcd.print(traco4);
estadoAtual = TEMPO1;
} else if (modo == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo: ");
lcd.setCursor(7, 0);
lcd.print(traco1);
lcd.print(traco2);
lcd.print(":");
lcd.print(traco3);
lcd.print(traco4);
estadoAtual = TEMPO2;
} else if (modo == 3) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo: ");
lcd.setCursor(7, 0);
lcd.print(traco1);
lcd.print(traco2);
lcd.print(":");
lcd.print(traco3);
lcd.print(traco4);
estadoAtual = TEMPO3;
} else if (modo == 11) {
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("BUZZER");
lcd.setCursor(2, 1);
lcd.print("1-ON 2-OFF");
estadoAtual = BUZZER;
} else {
// Se o modo for inválido, resetar para o menu
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selecione o modo");
modo = 0;
lcd.setCursor(0, 1);
lcd.print(" ");
}
}
}
} else if (estadoAtual == TEMPO1 || estadoAtual == TEMPO2 || estadoAtual == TEMPO3) {
if (tecla != NO_KEY && tecla >= '0' && tecla <= '9') {
if (traco1 == '-') {
traco1 = tecla;
} else if (traco2 == '-') {
traco2 = tecla;
} else if (traco3 == '-') {
traco3 = tecla;
} else if (traco4 == '-') {
traco4 = tecla;
}
lcd.setCursor(7, 0);
lcd.print(traco1);
lcd.setCursor(8, 0);
lcd.print(traco2);
lcd.setCursor(9, 0);
lcd.print(":");
lcd.setCursor(10, 0);
lcd.print(traco3);
lcd.setCursor(11, 0);
lcd.print(traco4);
} else if (tecla == '#' && estadoAtual == TEMPO1 || estadoAtual == TEMPO2) {
horas = (traco1 - '0') * 10 + (traco2 - '0');
minutos = (traco3 - '0') * 10 + (traco4 - '0');
segundos = 0;
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Bomba armada");
if (estadoAtual == TEMPO1) {
estadoAtual = BOMBA_ARMADA_CHAVE;
} else {
estadoAtual = BOMBA_ARMADA_BOTAO;
}
} else if (tecla == '#' && estadoAtual == TEMPO3) {
if (tecla != NO_KEY && tecla >= '0' && tecla <= '9') {
if (digito1 == '-') {
digito1 = tecla;
} else if (digito2 == '-') {
digito2 = tecla;
} else if (digito3 == '-') {
digito3 = tecla;
} else if (digito4 == '-') {
digito4 = tecla;
} else if (digito5 == '-') {
digito5 = tecla;
}
}
lcd.setCursor(0, 1);
lcd.print("Codigo:");
lcd.setCursor(8, 1);
lcd.print(digito1);
lcd.setCursor(9, 1);
lcd.print(digito2);
lcd.setCursor(10, 1);
lcd.print(digito3);
lcd.setCursor(11, 1);
lcd.print(digito4);
lcd.setCursor(12, 1);
lcd.print(digito5);
estadoAtual = CODIGO;
}
} else if (estadoAtual == BOMBA_ARMADA_CHAVE || estadoAtual == BOMBA_ARMADA_BOTAO) {
bool desativaBomba = false;
if (estadoAtual == BOMBA_ARMADA_CHAVE) {
if (digitalRead(CHAVE) == HIGH) {
desativaBomba = true;
}
} else if (estadoAtual == BOMBA_ARMADA_BOTAO) {
if (digitalRead(BOTAO) == LOW) {
botaoPressionado = true;
}
if (botaoPressionado && digitalRead(BOTAO) == HIGH) {
desativaBomba = true;
}
}
if (desativaBomba) {
if (horas == 0 && minutos == 0 && segundos == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo esgotado!");
delay(2000);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bomba desarmada");
if (estadoAtual == BOMBA_ARMADA_CHAVE) {
estadoAtual = BOMBA_DESARMADA_CHAVE;
} else {
estadoAtual = BOMBA_DESARMADA_BOTAO;
}
if (buzzerAtivo) {
noTone(PINO_BUZZER);
}
delay(500);
}
botaoPressionado = false;
} else {
if (tempoAtual - tempoAnterior >= intervalo) {
tempoAnterior = tempoAtual;
if (segundos > 0) {
segundos--;
} else {
if (minutos > 0) {
minutos--;
segundos = 59;
} else {
if (horas > 0) {
horas--;
minutos = 59;
segundos = 59;
} else {
horas = 0;
minutos = 0;
segundos = 0;
bombaArmada = true;
if (buzzerAtivo) {
tone(PINO_BUZZER, 1000);
}
}
}
}
lcd.setCursor(4, 1);
if (horas < 10) lcd.print('0');
lcd.print(horas);
lcd.print(":");
if (minutos < 10) lcd.print('0');
lcd.print(minutos);
lcd.print(":");
if (segundos < 10) lcd.print('0');
lcd.print(segundos);
}
if (horas == 0 && minutos == 0 && segundos == 0) {
if (buzzerAtivo) {
tone(PINO_BUZZER, 1000);
}
} else if (horas == 0 && minutos < 10) {
if (tempoAtual - tempoAnteriorBuzzer >= intervaloBuzzerCurto) {
tempoAnteriorBuzzer = tempoAtual;
if (buzzerAtivo) {
tone(PINO_BUZZER, 1000);
delay(100);
noTone(PINO_BUZZER);
}
}
} else {
if (tempoAtual - tempoAnteriorBuzzer >= intervalo) {
tempoAnteriorBuzzer = tempoAtual;
if (buzzerAtivo) {
tone(PINO_BUZZER, 1000);
delay(100);
noTone(PINO_BUZZER);
}
}
}
}
} else if (estadoAtual == BOMBA_DESARMADA_CHAVE || estadoAtual == BOMBA_DESARMADA_BOTAO) {
if (tecla == '*') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selecione o modo");
estadoAtual = MENU;
delay(500);
}
} else if (estadoAtual == BUZZER) {
if (tecla == '1') {
buzzerAtivo = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Buzzer ON");
delay(1000);
estadoAtual = MENU;
modo = 0;
} else if (tecla == '2') {
buzzerAtivo = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Buzzer OFF");
delay(1000);
estadoAtual = MENU;
modo = 0;
}
}
}