#include <TimerOne.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <string.h>
#define LedVermelho 12 //definição pino dos leds
#define LedVerde 13
#define Rele 2
#define Autofalante 3
#define tempo 10 //tempo do som
//SENHA
String senha;
//TEMPO PARA DEFINIR O CONTADOR
int horas;
int minutos;
int segundos;
//TEMPO DA CONTAGEM REGRESSIVA
int time;
//POSIÇÃO DO NUMERO DE ACERTOS
int posicao = 0;
//POSIÇÃO DO DIGITO NA TELA
int codepos = 8;
//FREQUENCIA DO BIP
int freq = 2000;
//DURAÇÃO DO BIP
int dur = 120;
//VARIAVEL PARA LED PISCAR
int estadoled = LOW;
//INTERVALO PARA PISCAR
int intervalo = 1000;
int previousMillis = 0;
//CARACTER ESPECIAL
byte load[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};
/* Display setup */
LiquidCrystal_I2C lcd(0x27, 16, 2);
/* Keypad setup */
byte rowPins[4] = {11, 10, 9, 8};
byte colPins[4] = {7, 6, 5, 4};
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad myKeypad = Keypad(makeKeymap(keys), rowPins, colPins, 4, 4);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(LedVermelho, OUTPUT);
pinMode(LedVerde, OUTPUT);
lcd.createChar(1, load);
lcd.setCursor(6, 0);
lcd.print("ITA");
lcd.setCursor(3, 1);
lcd.print("SORRISO-MT");
delay(2000);
//SETAR SENHA NA PARTIDA
setarSenha();
//CHAMA A FUNÇÃO QUE SOLICITA O TEMPO DE BOMBA ARMADA
inputTempo();
lcd.setCursor(0, 0);
lcd.print("SENHA: [_______]");
lcd.setCursor(2, 1);
lcd.print("ARME A BOMBA");
}
void loop() {
//CHAMA A FUNÇÃO QUE LE E FILTRA O TECLADO
keyget();
//SE A SENHA FOR IGUAL A DEFINIDA (ARME)
if (posicao == senha.length()) {
//TELA DE ARMANDO BOMBA
lcd.setCursor(0, 0);
lcd.print(" ARMANDO BOMBA! ");
//TEMPO EM MILISEGUNDOS, MULTIPLICAR POR 10 PARA FAZER O TEMPO DE ARMAR
carregamento(1000);
//INICIA O CONTADOR
contador((millis()) / 1000);
}
delay(100);
}
//BOMBA ARMADA
void contador(int tempoinicial) {
//ZERA O CODEPOS E POSICAO
codepos = 8;
posicao = 0;
lcd.clear();
lcd.print("SENHA: [_______]");
lcd.setCursor(0, 1);
lcd.print("ARMADA: ");
time = (horas * 3600) + (minutos * 60) + segundos;
while (time > 0) {
//CHAMA A FUNÇÃO QUE LE E FILTRA O TECLADO
keyget();
//SE A SENHA FOR IGUAL A DEFINIDA (DESARME)
if (posicao == senha.length()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOMBA DESARMADA!");
lcd.setCursor(1, 1);
lcd.print("TIME 1 VENCEU!");
digitalWrite(LedVerde, HIGH);
digitalWrite(LedVermelho, LOW);
while (1);
}
int temporestante = time - (millis() / 1000 - tempoinicial);
lcd.setCursor(0, 1); //rotina para contagem regressiva
lcd.print("ARMADA: ");
lcd.setCursor(8, 1);
lcd.print(converterTempo(temporestante));
//MUDANÇA DO BIP COM O TEMPO
if (temporestante == 60) {
intervalo = 800;
}
if (temporestante == 30) {
intervalo = 700;
}
if (temporestante == 15) {
intervalo = 600;
}
if (temporestante == 10) {
intervalo = 400;
}
if (temporestante == 5) {
intervalo = 250;
}
int currentMillis = millis();
if (currentMillis - previousMillis >= intervalo) {
previousMillis = currentMillis;
//FAZ O LED PISCAR
estadoled = !estadoled;
digitalWrite(12, estadoled);
tone(Autofalante, freq, dur);
}
if (temporestante <= 0) { //Mensagem se o tempo acabar
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("BOMBA EXPLODIU");
lcd.setCursor(1, 1);
lcd.print("TIME 2 VENCEU!");
digitalWrite(LedVermelho, HIGH);
digitalWrite(Rele, HIGH);
while (1);
}
}
return;
}
char keyget() {
//CAPTURA A TECLA DIGITADA
char numteclado = myKeypad.getKey();
//PARA FAZER O SOM E ESCREVER O VALOR NA TELA
lcd.setCursor(codepos, 0);
if (numteclado != NO_KEY) {
lcd.print(numteclado);
tone(Autofalante, freq, dur);
}
//SE FOR DIGITADO ALGO ENTRE 0 E 9, ELE ADICIONA UM NA POSIÇÃO
if (numteclado >= '0' && numteclado <= '9') {
codepos++;
}
//SE O VALOR DIGITADO FOR IGUAL A SENHA NA MESMA POSIÇÃO, ADICIONA UM À POSIÇÃO
if (numteclado == senha[posicao]) {
posicao ++;
}
//SE DIGITAR * OU #, RESETA A SENHA
if (numteclado == '*' || numteclado == '#') {
posicao = 0;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("RESETADO!");
delay(1000);
lcd.clear();
lcd.print("SENHA: [_______]");
lcd.setCursor(2, 1);
lcd.print("ARME A BOMBA");
codepos = 8;
}
if (codepos == 15 && posicao != senha.length()) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("SENHA ERRADA");
delay(1000);
lcd.clear();
lcd.print("SENHA: [_______]");
lcd.setCursor(2, 1);
lcd.print("ARME A BOMBA");
codepos = 8;
}
}
void carregamento(int t) {
lcd.setCursor(2, 1);
lcd.print(" ");
lcd.setCursor(3, 1);
for (byte i = 0; i < 10; i++) {
delay(t);
//QUANDO É UM CARACTER ESPECIAL CRIADO NO BYTE, PRECISA SER WRITE E NAO PRINT
lcd.write(1);
}
}
String converterTempo(int totalSegundos) {
// CALCULA AS HORAS
int horas = totalSegundos / 3600;
// CALCULA OS MINUTOS
int segundosRestantes = totalSegundos % 3600;
int minutos = segundosRestantes / 60;
//CALCULA OS SEGUNDOS
int segundos = segundosRestantes % 60;
//FORMATA
char formatado[] = "00:00:00";
sprintf(formatado, "%02d:%02d:%02d", horas, minutos, segundos);
return String(formatado);
}
void inputTempo() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TEMPO ATIVADA: ");
lcd.setCursor(4, 1);
lcd.print("__:__:__");
lcd.setCursor(4, 1);
String resultado = "";
while (resultado.length() < 8) {
if (resultado.length() == 2 || resultado.length() == 5) {
lcd.print(":");
resultado += ":";
} else {
char key = myKeypad.getKey();
if (key >= '0' && key <= '9') {
lcd.print(key);
tone(Autofalante, freq, dur);
resultado += key;
}
}
}
horas = resultado.substring(0, resultado.indexOf(':')).toInt();
minutos = resultado.substring(resultado.indexOf(':') + 1, resultado.lastIndexOf(':')).toInt();
segundos = resultado.substring(resultado.lastIndexOf(':') + 1).toInt();
}
//SETAR SENHA PARA PARTIDA
bool setarSenha() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DIGITE A SENHA:");
String novaSenha = inputSenha();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONFIRME:");
String confirmarSenha = inputSenha();
if (novaSenha.equals(confirmarSenha)) {
senha = novaSenha;
return true;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SENHAS DIGITADAS");
lcd.setCursor(0, 1);
lcd.print("NAO CONFEREM");
delay(2000);
return false;
}
}
String inputSenha() {
lcd.setCursor(4, 1);
lcd.print("[_______]");
lcd.setCursor(5, 1);
String result = "";
while (result.length() < 7) {
char key = myKeypad.getKey();
if (key >= '0' && key <= '9') {
lcd.print('*');
tone(Autofalante, freq, dur);
result += key;
}
}
return result;
}