#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // use correct address from I2C scanner
// Keypad
const byte ROWS = 4; //rows
const byte COLS = 3; //columns
byte rowPins[ROWS] = {1, 2, 42, 41}; // R1-R4
byte colPins[COLS] = {40, 39, 38}; // C1-C3
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
// Create keypad object
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// LED
const int redLED = 4;
// Buzzer
const int buzzer = 37;
// variables
int gamemode = 0;
int preparationTime = 0;
int gameTime = 0;
int boomTime = 0;
int bombMode = 0;
int bombHold = 0;
int defuseNumber = 0;
int defusemode = 0;
int defuseHoldTime = 0;
//tones
const int enterToneFreq = 800;
const int enterBeepTime = 500;
const int removeToneFreq = 1000;
const int removeBeepTime = 200;
const int clickToneFreq = 1000;
const int clickBeepTime = 50;
//
const int scrollTextSpeed = 1200;
void setup() {
Serial.begin(115200);
Wire.begin(17, 18); // SDA=17, SCL=18
//LCD initialization
lcd.init();
lcd.backlight();
//LED
pinMode(redLED, OUTPUT); // Set pin as output
gamemodeSelection();
}
void loop() {
}
void gamemodeSelection(){
unsigned long lastScroll = 0;
bool showBomb = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gamemode: ");
while(gamemode == 0){
char key = keypad.getKey();
if (key == '1') {
Serial.println("gamemode 1");
gamemode = 1;
break;
}
else if (key == '2'){
Serial.println("gamemode 2");
gamemode = 2;
break;
}
// Scroll text without blocking
if (millis() - lastScroll > scrollTextSpeed) { // 1.2 second interval
lastScroll = millis();
lcd.setCursor(0,1);
if (showBomb) {
lcd.print("Bomb: 1 ");
} else {
lcd.print("Detonator: 2 ");
}
showBomb = !showBomb;
}
}
preparation();
}
void preparation() {
String preparationString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Prep Time:");
lcd.setCursor(0, 1);
while(preparationTime == 0) {
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
// Append digit to input string
preparationString += key;
tone(buzzer, clickToneFreq); // 1000 Hz tone
delay(clickBeepTime);
noTone(buzzer); // stop sound
// Show it on LCD
lcd.setCursor(0, 1);
lcd.print(preparationString);
}
else if (key == '*') {
tone(buzzer, enterToneFreq);
delay(enterBeepTime);
noTone(buzzer);
// Convert to integer
preparationTime = preparationString.toInt();
Serial.println("Preparation Time:" + String(preparationTime));
}
else if (key == '#') {
tone(buzzer, removeToneFreq); // 1000 Hz tone
delay(removeBeepTime);
noTone(buzzer);
preparation();
}
}
}
gameTimeSelection();
}
void gameTimeSelection() {
String gameTimeString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Game Time: ");
lcd.setCursor(0, 1);
while (gameTime == 0){
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
// Append digit to input string
gameTimeString += key;
tone(buzzer, clickToneFreq); // 1000 Hz tone
delay(clickBeepTime);
noTone(buzzer); // stop sound
// Show it on LCD
lcd.setCursor(0, 1);
lcd.print(gameTimeString);
}
else if (key == '*') {
tone(buzzer, removeToneFreq);
delay(removeBeepTime);
noTone(buzzer);
// Convert to integer
gameTime = gameTimeString.toInt();
Serial.println("Game Time: " + String(gameTime));
if(gamemode == 1){
bombSettings();
}
else if(gamemode == 2){
dominatorSettings();
}
}
else if (key == '#') {
tone(buzzer, removeToneFreq); // 1000 Hz tone
delay(removeBeepTime);
noTone(buzzer);
}
}
}
}
void bombSettings(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Boom Time:");
lcd.setCursor(0, 1);
//boom time
while(boomTime == 0) {
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
// Append digit to input string
boomTimeString += key;
tone(buzzer, clickToneFreq); // 1000 Hz tone
delay(clickBeepTime);
noTone(buzzer); // stop sound
// Show it on LCD
lcd.setCursor(0, 1);
lcd.print(boomTimeString);
}
else if (key == '*') {
tone(buzzer, enterToneFreq);
delay(enterBeepTime);
noTone(buzzer);
// Convert to integer
boomTime = boomTimeString.toInt();
Serial.println("Boom Time:" + String(boomTime));
break;
}
else if (key == '#') {
tone(buzzer, removeToneFreq); // 1000 Hz tone
delay(removeBeepTime);
noTone(buzzer);
}
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Bomb Mode:");
lcd.setCursor(0, 1);
while(bombMode == 0){
unsigned long lastScroll = 0;
bool showBomb = true;
char key = keypad.getKey();
if (key == '1') {
Serial.println("bombMode: 1/Hold");
bombMode = 1;
break;
}
else if (key == '2'){
Serial.println("bombMode: 2/Enter Code");
bombMode = 2;
break;
}
// Scroll text without blocking
if (millis() - lastScroll > scrollText) { // 1.2 second interval
lastScroll = millis();
lcd.setCursor(0,1);
if (showFirst) {
lcd.print("Hold: 1 ");
} else {
lcd.print("Enter code: 2 ");
}
showFirst = !showFirst;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hold Time:");
lcd.setCursor(0, 1);
while(bombMode == 1 && bombHold == 0){
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
// Append digit to input string
bombHoldString += key;
tone(buzzer, clickToneFreq); // 1000 Hz tone
delay(clickBeepTime);
noTone(buzzer); // stop sound
// Show it on LCD
lcd.setCursor(0, 1);
lcd.print(bombHoldString);
}
else if (key == '*') {
tone(buzzer, enterToneFreq);
delay(enterBeepTime);
noTone(buzzer);
// Convert to integer
bombHold = bombHoldString.toInt();
Serial.println("Bomb Hold Time:" + String(bombHold));
break;
}
else if (key == '#') {
tone(buzzer, removeToneFreq); // 1000 Hz tone
delay(removeBeepTime);
noTone(buzzer);
}
}
}
}
void dominatorSettings(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dominator");
lcd.setCursor(0, 1);
}
/*
String options[3] = { "hold: 1", "Detonator: 2", "Defuse: 3" };
int optionIndex = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Bomb Mode:");
//bomb mode
while(bombMode == 0) {
char key = keypad.getKey();
if (key == '1'){
}
else if(key == '2'){
}
else if(key == '3'){
}
if (millis() - lastScroll > scrollTextSpeed) {
lastScroll = millis();
lcd.setCursor(0, 1);
lcd.print(options[optionIndex]);
lcd.print(" "); // clear rest of line
optionIndex = (optionIndex + 1) % 3; // cycle through 0,1,2
}
*/