// ===== INIT KEYPAD =====
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keyes[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};//connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keyes), rowPins, colPins, ROWS, COLS );
// ===== INIT LCD =====
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ===== INIT PIN =====
#define ledMerah 13
#define ledHijau 12
#define buzzer 11
#define kabelMerah A0
#define kabelKuning A1
#define kabelPutih A2
// ===== PROSES =====
#include <EEPROM.h>
unsigned long lastBuzzer, startSystem;
float clockMul = 1;
String correctCode = "1234";
int stateSystem = 0; //0 = standby, 1 = running, 2 = stopFault, 3 = stopOk
int stateBuzzer = 0; //0 = off, 1 = on, 2 = auto
bool firstStandby = true, firstRunning = true, firstFault = true, firstOk = true;
String setCode;
int opsi = 0;
int setKabel[4] = {0, 0, 0, 0};
char text[20];
unsigned long lastBlink, lastPush;
bool stateBlink;
int stateButton;
char tempChar;
String tempCode;
bool stateMerah, stateKuning, statePutih;
//====== PARAMETER =====
String masterCode = "455A4";
unsigned long durasiSystem = 100000; //milidetik
int kabel = 3;// 1 A0, 2 A1, 3 A2
//======================
void setup() {
lcd.init(); lcd.backlight();
Serial.begin(9600);
Serial.println("Inisialisasi Input dan Output");
pinMode(ledMerah, OUTPUT); digitalWrite(ledMerah, LOW);
pinMode(ledHijau, OUTPUT); digitalWrite(ledHijau, LOW);
pinMode(buzzer, OUTPUT); digitalWrite(buzzer, LOW);
pinMode(kabelMerah, INPUT_PULLUP);
pinMode(kabelKuning, INPUT_PULLUP);
pinMode(kabelPutih, INPUT_PULLUP);
lcd.setCursor(0, 0); lcd.print(" SIMULASI ");
lcd.setCursor(0, 1); lcd.print(" KETANGKASAN! ");
delay(2500);
}
void loop() {
setBuzzer();
switch (stateSystem) {
case 0 : standby(); break;
case 1 : running1(); break;
case 2 : running2(); break;
case 3 : stopFault(); break;
case 4 : stopOk(); break;
}
}
void standby() {
if (firstStandby) {
loadFromEEPROM();
int menit = durasiSystem / 60000;
int detik = (durasiSystem % 60000) / 1000;
int mili = ((durasiSystem % 60000) % 1000) / 10;
lcd.setCursor(0, 0); lcd.print("PRESS # TO START");
sprintf(text, " [ %02d:%02d:%02d ] ", menit, detik, mili);
lcd.setCursor(0, 1); lcd.print(text);
digitalWrite(ledMerah, LOW); digitalWrite(ledHijau, LOW);
firstStandby = false;
firstRunning = true;
firstFault = true;
firstOk = true;
digitalWrite(buzzer, HIGH); stateBuzzer = 0;
clockMul = 1;
}
cekKeypad();
}
void running1() {
if (firstRunning) {
loadFromEEPROM();
// setCode = tempCode; //LOAD FROM EEPROM
Serial.println("Start Timer, Password : " + setCode);
Serial.println("Start Timer, Time : " + String(durasiSystem) + " ms");
sprintf(text, "TIME :%8lu s", durasiSystem / 1000);
lcd.setCursor(0, 1); lcd.print(text);
lcd.setCursor(0, 0); lcd.print(" GET READY! ");
digitalWrite(ledMerah, LOW); digitalWrite(ledHijau, HIGH);
firstStandby = true;
firstRunning = false;
firstFault = true;
firstOk = true;
stateBuzzer = 2;
delay(1500);
stateMerah = HIGH;
stateKuning = HIGH;
statePutih = HIGH;
startSystem = millis();
}
long sisaDurasiSystem = durasiSystem - (millis() * clockMul - startSystem);
if (sisaDurasiSystem <= 0) {
stateSystem = 3;
sisaDurasiSystem = 0;
}
int menit = sisaDurasiSystem / 60000;
int detik = (sisaDurasiSystem % 60000) / 1000;
int mili = ((sisaDurasiSystem % 60000) % 1000) / 10;
lcd.setCursor(0, 0); lcd.print("CUT RIGHT WIRE!!");
sprintf(text, " [ %02d:%02d:%02d ] ", menit, detik, mili);
lcd.setCursor(0, 1); lcd.print(text);
cekKabel();
}
void running2() {
long sisaDurasiSystem = durasiSystem - (millis() * clockMul - startSystem);
if (sisaDurasiSystem <= 0) {
stateSystem = 3;
sisaDurasiSystem = 0;
}
int menit = sisaDurasiSystem / 60000;
int detik = (sisaDurasiSystem % 60000) / 1000;
int mili = ((sisaDurasiSystem % 60000) % 1000) / 10;
sprintf(text, " [ %02d:%02d:%02d ] ", menit, detik, mili);
lcd.setCursor(0, 0); lcd.print(text);
cekKeypad();
}
void stopFault() {
if (firstFault) {
digitalWrite(ledMerah, LOW);
digitalWrite(ledHijau, HIGH);
firstStandby = true;
firstRunning = true;
firstFault = false;
firstOk = true;
lcd.backlight();
digitalWrite(buzzer, LOW); stateBuzzer = 1;
lcd.setCursor(0, 1); lcd.print(" TIME IS UP ");
}
while (1) {
char charKey = keypad.getKey();
if (charKey == '*')break;
}
firstStandby = true;
firstRunning = true;
firstFault = true;
firstOk = true;
stateSystem = 0;
}
void stopOk() {
if (firstOk) {
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, LOW);
firstStandby = true;
firstRunning = true;
firstFault = true;
firstOk = false;
lcd.backlight();
digitalWrite(buzzer, HIGH); stateBuzzer = 0;
lcd.setCursor(0, 1); lcd.print(" BOM DEFUSED. ");
}
while (1) {
char charKey = keypad.getKey();
if (charKey == '*')break;
}
firstStandby = true;
firstRunning = true;
firstFault = true;
firstOk = true;
stateSystem = 0;
}
void setBuzzer() {
if (stateBuzzer == 2) {
unsigned long thisTime = millis();
if (thisTime > (lastBuzzer + (1000 / clockMul))) {
digitalWrite(buzzer, LOW); lcd.noBacklight();
lastBuzzer = thisTime;
}
if (thisTime > (lastBuzzer + (500 / clockMul))) {
lcd.backlight(); digitalWrite(buzzer, HIGH);
}
}
}
void cekKabel() {
int correct = 2;
if (digitalRead(kabelMerah) == HIGH && stateMerah == HIGH) {
stateMerah = LOW;
if (kabel == 1) correct = 1;
else correct = 0;
}
else if (digitalRead(kabelKuning) == HIGH && stateKuning == HIGH) {
stateKuning = LOW;
if (kabel == 2) correct = 1;
else correct = 0;
}
else if (digitalRead(kabelPutih) == HIGH && statePutih == HIGH) {
statePutih = LOW;
if (kabel == 3) correct = 1;
else correct = 0;
}
if (correct == 1) {
digitalWrite(ledMerah, HIGH); digitalWrite(ledHijau, LOW);
lcd.setCursor(0, 1); lcd.print(" CORRECT WIRE ");
}
else if (correct == 0) {
lcd.setCursor(0, 1); lcd.print(" WRONG WIRE ");
clockMul += 0.2;
}
if (correct != 2) {
lcd.backlight();
stateSystem = 2;
delay(1000);
}
}
void cekKeypad() {
//===================BLINKING CURSOR===================
if (stateSystem == 2 && tempCode == "") {
lcd.setCursor(0, 1); lcd.print(" BOM ACTIVATED! ");
}
else if (millis() - lastBlink >= 200 && (opsi != 0 || stateSystem != 0)) {
lastBlink = millis();
lcd.setCursor(7, 1); lcd.print(tempCode);
lcd.setCursor(tempCode.length() + 7, 1);
if (stateBlink)lcd.print(char(255));
else lcd.print(" ");
stateBlink = 1 - stateBlink;
}
if (millis() - lastPush >= 350)stateButton = 0;
//====================SCAN TOMBOL START=========================
if (stateButton == 0) {
tempChar = keypad.getKey();
if (tempChar)stateButton = 1;
}
//===============TOMBOL DITEKAN=================================
if (stateButton == 1) {
stateButton = 2;
lastPush = millis();
if (tempChar == '#') {
if (stateSystem == 0) {
if (opsi == 0) {
stateSystem = 1;
}
else if (opsi == 1) {
for (int i = 0; i < 6; i++) {
// Serial.println(tempCode[i]); delay(500);
EEPROM.write(i, tempCode[i]);
}
// setCode = tempCode; // SAVE TO EEPROM
opsi = 0; firstStandby = true;
lcd.setCursor(0, 1); lcd.print("CODE SET s");
lcd.setCursor(9, 1); lcd.print(tempCode);
Serial.println("CODE SET TO : " + tempCode);
Serial.println(text);
delay(1000);
}
else {
for (int i = 0; i < 6; i++) {
EEPROM.write(i + 10, tempCode[i]);
}
opsi = 0; firstStandby = true;
lcd.setCursor(0, 1); lcd.print("TIME SET s");
lcd.setCursor(9, 1); lcd.print(tempCode);
Serial.println("TIME SET TO : " + tempCode + " s");
delay(1000);
}
}
else {
if (tempCode == setCode) {
stateSystem = 4;
}
else {
lcd.setCursor(0, 0); lcd.print(" WRONG CODE ");
// clockMul += 0.2;
delay(1000);
}
}
tempCode = "";
}
else if (tempChar == 'A') {
if (stateSystem == 0) {
if (opsi == 1) {
opsi = 0;
firstStandby = true;
}
else {
opsi = 1;
lcd.setCursor(0, 0); lcd.print(" [SETTING CODE] ");
}
}
tempCode = "";
}
else if (tempChar == 'B') {
if (stateSystem == 0) {
if (opsi == 2) {
opsi = 0;
firstStandby = true;
}
else {
opsi = 2;
lcd.setCursor(0, 0); lcd.print(" [SETTING TIME] ");
}
}
tempCode = "";
}
else if (tempChar == 'C');
else if (tempChar == 'D');
else if (tempChar == '*') {
tempCode = tempCode.substring(0, tempCode.length() - 1);
}
else {
if (tempCode.length() < 6) tempCode += tempChar;
}
lcd.setCursor(0, 1);
if (opsi == 1 || stateSystem == 2) lcd.print("CODE : ");
else if (opsi == 2 && stateSystem == 0)lcd.print("TIME : s");
Serial.println(tempCode);
}
}
void loadFromEEPROM() {
String tempEEPROM;
char getCode[6]="";
for (int i = 0; i < 6; i++) {
getCode[i] = EEPROM.read(i);
}
setCode="";
setCode = getCode;
// setCode.trim();
for (int i = 0; i < 6; i++) {
getCode[i] = EEPROM.read(i + 10);
}
tempEEPROM = getCode;
durasiSystem = tempEEPROM.toInt() * 1000;
}