#include <Keypad.h> //knihovna pro klavesnici
#include <Wire.h> //I2C komunikace
#include <LiquidCrystal_I2C.h> //knihovna pro LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); //inicializace LCD displeje s adresou 0x27, 16 sloupci a 2 řádky
//deklarace poli pro zadavani kodu
const byte passLength = 7;
char correctPass[passLength] = { '7', '3', '5', '5', '6', '0', '8' };
char userPass[passLength] = { '*', '*', '*', '*', '*', '*', '*' };
int enterIndex = 0; //index poctu vlozenych znaku
void (*resetFunc)(void) = 0; //funkce resetu
//deklarace pinu, poctu radku a sloupcu
const byte radky = 4;
const byte sloupce = 4;
const int ledPinRed = 12;
const int ledPinZel = 13;
const int buzzerPin = 10;
//deklarace casovych hodnot pro bombu
unsigned long startTime = millis();
int sec = 39; // bomba bouchne za 40 vterin
int oneSecond = 1000;
int freq = 0; //ton bzucaku
int defIndex = 0; //pomocna promenna pri deaktivaci bomby
// vytvoření pole s rozmístěním kláves
char keys[radky][sloupce] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ 'D', 'E', 'F', '0' }
};
// nastavení čísel pinů pro spojení s klávesnicí
byte pinyRadku[radky] = { 6, 7, 8, 9 };
byte pinySloupcu[sloupce] = { 5, 4, 3, 2 };
// vytvoření instance klavesnice z knihovny Keypad
Keypad klavesnice = Keypad(makeKeymap(keys), pinyRadku, pinySloupcu, radky, sloupce);
void printTempPass() { //slouzi pri zadavani kodu, kazdy vlozeny znak prida jednu "*"
for (int i = 0; i < enterIndex; i++) {
lcd.setCursor(i, 0);
lcd.print("*");
}
}
void resetProgram() { //resetovani
resetFunc();
}
void bomb() { //bomba je aktivovana
defIndex = 0;
while (true) {
if (millis() - startTime >= oneSecond) {
startTime = millis();
lcd.setCursor(5, 1);
sec--;
//podminky pro zobrazovani cifer cisel
int displayMin = sec / 60;
if (displayMin < 10) {
lcd.print("0");
}
lcd.print(displayMin);
lcd.print(":");
int displaySec = sec % 60;
if (displaySec < 10) {
lcd.print("0");
}
lcd.print(sec % 60);
// Podmínky pro pípání podle zbývajícího času
if (sec >= 30) { // 1x pipnuti za vteřinu do 30 vterin
tone(buzzerPin, 3000, 100);
digitalWrite(ledPinRed, HIGH);
char klavesa = klavesnice.getKey();
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(900);
//po stisku D, zacne proces deaktivace.
//defIndex zajistuje to, aby pyrotechnik opakovanym skiskem D neprerusoval deaktivaci
if (klavesa == 'C'){ //tlacitko C zrusi deaktivaci
defIndex = 0;
lcd.clear();
}
if (klavesa == 'D' && defIndex == 0){
tone(buzzerPin, 2000);
delay(125);
noTone(buzzerPin);
delay(125);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
lcd.setCursor(0, 0);
lcd.println("Defusing...");
defIndex++;
}
if (defIndex == 6) { // po 5 vterinach se bomba deaktivuje
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
lcd.clear();
lcd.setCursor(2, 0);
lcd.println("Bomb Defused");
delay(4000);
resetProgram();
}
else if (defIndex >= 1 && defIndex <= 5) { //po stisku se kazdou vterinu pricte index
defIndex++;
}
} else if (sec >= 20 && sec <= 29) { //2x pipnuti za vteřinu
tone(buzzerPin, 3000, 100);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(400);
char klavesa = klavesnice.getKey();
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(400);
if (klavesa == 'C' && defIndex != 0){
defIndex = 0;
lcd.clear();
}
if (klavesa == 'D' && defIndex == 0){
tone(buzzerPin, 2000);
delay(125);
noTone(buzzerPin);
delay(125);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
lcd.setCursor(0, 0);
lcd.println("Defusing...");
defIndex++;
}
if (defIndex == 6) {
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
lcd.clear();
lcd.setCursor(2, 0);
lcd.println("Bomb Defused");
delay(4000);
resetProgram();
}
else if (defIndex >= 1 && defIndex <= 5) {
defIndex++;
}
} else if (sec >= 10 && sec <= 19) {// 3x pipnuti za vteřinu
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(233);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(233);
tone(buzzerPin, 3000);
char klavesa = klavesnice.getKey();
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(234);
if (klavesa == 'C'){
defIndex = 0;
lcd.clear();
}
if (klavesa == 'D' && defIndex == 0){
tone(buzzerPin, 2000);
delay(125);
noTone(buzzerPin);
delay(125);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
lcd.setCursor(0, 0);
lcd.println("Defusing...");
defIndex++;
}
if (defIndex == 6) {
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
lcd.clear();
lcd.setCursor(2, 0);
lcd.println("Bomb Defused");
delay(4000);
resetProgram();
}
else if (defIndex >= 1 && defIndex <= 5) {
defIndex++;
}
} else if (sec >= 5 && sec <= 9) { // 4x za vteřinu
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(150);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(150);
tone(buzzerPin, 3000);
char klavesa = klavesnice.getKey();
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(150);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(150);
if (klavesa == 'C'){
defIndex = 0;
lcd.clear();
}
if (klavesa == 'D' && defIndex == 0){
tone(buzzerPin, 2000);
delay(125);
noTone(buzzerPin);
delay(125);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
lcd.setCursor(0, 0);
lcd.println("Defusing...");
defIndex++;
}
if (defIndex == 6) {
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
lcd.clear();
lcd.setCursor(2, 0);
lcd.println("Bomb Defused");
delay(4000);
resetProgram();
}
else if (defIndex >= 1 && defIndex <= 5) {
defIndex++;
}
} else if (sec >= 1 && sec <= 4) { // 5x za vteřinu
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(100);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(100);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(100);
tone(buzzerPin, 3000);
char klavesa = klavesnice.getKey();
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(100);
tone(buzzerPin, 3000);
digitalWrite(ledPinRed, HIGH);
delay(100);
noTone(buzzerPin);
digitalWrite(ledPinRed, LOW);
delay(100);
if (klavesa == 'C'){
defIndex = 0;
lcd.clear();
}
if (klavesa == 'D' && defIndex == 0){
tone(buzzerPin, 2000);
delay(125);
noTone(buzzerPin);
delay(125);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
lcd.setCursor(0, 0);
lcd.println("Defusing...");
defIndex++;
}
if (defIndex == 6) {
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
lcd.clear();
lcd.setCursor(2, 0);
lcd.println("Bomb Defused");
delay(4000);
resetProgram();
}
else if (defIndex >= 1 && defIndex <= 5) {
defIndex++;
}
}
// casomira vyprsela
if (sec == 0) {
digitalWrite(ledPinZel, HIGH);
for (int freq = 0; freq <= 4000; freq = freq + 20) {
tone(buzzerPin, freq);
delay(3);
noTone(buzzerPin);
delay(2);
}
digitalWrite(ledPinZel, LOW);
tone(buzzerPin, 600);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 600);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 600);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 600);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 600);
delay(100);
noTone(buzzerPin);
delay(100);
}
// po vyprseni casomiry bomba vybuchne, i pri pozdni deaktivaci
if (sec < 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Terrorists Win.");
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
delay(500);
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
delay(500);
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
delay(500);
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
delay(500);
tone(buzzerPin, 1500);
delay(500);
noTone(buzzerPin);
delay(500);
break;
}
}
}
resetProgram();
}
void setup() { //vstupy, vystupy, inicializace lcd
Serial.begin(9600);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinZel, OUTPUT);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
}
void loop() { //uvodni nacteni bomby
digitalWrite(ledPinRed, HIGH);
digitalWrite(ledPinZel, HIGH);
tone(buzzerPin, 2000);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
tone(buzzerPin, 2500);
delay(75);
noTone(buzzerPin);
delay(75);
// načtení hodnoty stisknuté klávesy do proměnné
char klavesa = klavesnice.getKey();
if (klavesa) { //pri stisku klavesy se znak zapise do serioveho monitoru a do pole
Serial.print("Stisknuta klavesa: ");
Serial.println(klavesa);
userPass[enterIndex] = klavesa;
enterIndex++;
printTempPass();
delay(250);
if (enterIndex >= passLength) { // cely kod byl zadan
bool wrongPass = false;
for (int i = 0; i < passLength; i++) { // kontrola zadaneho kodu
if (correctPass[i] != userPass[i]) { //bylo zadano spatne heslo, bomba se resetuje
Serial.println("invalid password");
lcd.setCursor(0, 0);
lcd.println("INVALID PASSWORD");
delay(2000);
resetProgram();
wrongPass = true;
break;
}
}
if (wrongPass == false) { // kontrola probehla a heslo je spravne
delay(100);
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinZel, LOW);
lcd.clear();
bomb(); // aktivace bomby
}
}
}
}