// ===== INIT KEYPAD =====
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[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(keys), 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 =====
unsigned long defDurasiSystem = 100000, durasiSystem = 100000;
unsigned long lastBuzzer, startSystem;
float clockMul = 1;
int defDurasiBuzzer = 5000, durasiBuzzer = 5000;
String correctCode = "1234";
int stateSystem = 0; //0 = standby, 1 = running, 2 = stopFault, 3 = stopOk
int stateBuzzer = 2; //0 = off, 1 = on, 2 = auto
bool firstStandby = true, firstRunning = true, firstFault = true, firstOk = true;
String setCode;
int opsi = 0;
int kabel = 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;
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(1500);
}
void loop() {
setBuzzer();
switch (stateSystem) {
case 0 : standby(); break;
case 1 : running(); break;
case 2 : stopFault(); break;
case 3 : stopOk(); break;
}
}
void standby() {
if (firstStandby) {
lcd.setCursor(0, 0); lcd.print(" SIMULASI ");
lcd.setCursor(0, 1); lcd.print(" KETANGKASAN! ");
digitalWrite(ledMerah, LOW);
digitalWrite(ledHijau, LOW);
durasiSystem = defDurasiSystem;
durasiBuzzer = defDurasiBuzzer;
firstStandby = false;
firstRunning = true;
firstFault = true;
firstOk = true;
digitalWrite(buzzer, HIGH); stateBuzzer = 0;
clockMul = 1;
delay(1500);
lcd.setCursor(0, 1); lcd.print("CODE : ");
}
cekKeypad();
}
void running() {
if (firstRunning) {
lcd.setCursor(0, 0); lcd.print(" BOM ACTIVATED! ");
sprintf(text, "TIME :%8lu s", durasiSystem / 1000);
lcd.setCursor(0, 1); lcd.print(text);
digitalWrite(ledMerah, LOW); digitalWrite(ledHijau, HIGH);
firstStandby = true;
firstRunning = false;
firstFault = true;
firstOk = true;
stateBuzzer = 2;
delay(1500);
setKabel[kabel] = 1;
stateMerah = HIGH;
stateKuning = HIGH;
statePutih = HIGH;
startSystem = millis();
}
long sisaDurasiSystem = durasiSystem - (millis() * clockMul - startSystem);
if (sisaDurasiSystem <= 0) {
stateSystem = 2;
sisaDurasiSystem = 0;
}
else if (sisaDurasiSystem / 1000 < 10) {
durasiBuzzer = 400;
}
else if (sisaDurasiSystem / 1000 < 30) {
durasiBuzzer = 800;
}
else if (sisaDurasiSystem / 1000 < 60) {
durasiBuzzer = 1200;
}
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);
cekKabel();
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 ");
}
}
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. ");
}
}
void setBuzzer() {
if (stateBuzzer == 2) {
unsigned long thisTime = millis();
if (thisTime > (lastBuzzer + durasiBuzzer)) {
digitalWrite(buzzer, LOW); lcd.noBacklight();
lastBuzzer = thisTime;
}
if (thisTime > (lastBuzzer + 200)) {
lcd.backlight(); digitalWrite(buzzer, HIGH);
}
}
}
void cekKabel() {
if (digitalRead(kabelMerah) == HIGH && stateMerah == HIGH) {
stateMerah = LOW;
if (kabel == 1) {
stateSystem = 3;
}
else {
lcd.setCursor(0, 0); lcd.print(" WRONG WIRE ");
clockMul += 0.5;
delay(1000);
}
}
else if (digitalRead(kabelKuning) == HIGH && stateKuning == HIGH) {
stateKuning = LOW;
if (kabel == 2) {
stateSystem = 3;
}
else {
lcd.setCursor(0, 0); lcd.print(" WRONG WIRE ");
clockMul += 0.5;
delay(1000);
}
}
else if (digitalRead(kabelPutih) == HIGH && statePutih == HIGH) {
statePutih = LOW;
if (kabel == 3) {
stateSystem = 3;
}
else {
lcd.setCursor(0, 0); lcd.print(" WRONG WIRE ");
clockMul += 0.5;
delay(1000);
}
}
}
void cekKeypad() {
//===================BLINKING CURSOR===================
if (stateSystem == 1 && tempCode == "") {
lcd.setCursor(0, 1); lcd.print(" BOM ACTIVATED! ");
}
else if (millis() - lastBlink >= 200) {
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 >= 400)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 == 'A') {
if (stateSystem == 0 && opsi == 0) {
setCode = tempCode;
Serial.println("Code Set To " + setCode);
stateSystem = 1;
kabel = 1;
}
tempCode = "";
}
else if (tempChar == 'B') {
if (stateSystem == 0 && opsi == 0) {
setCode = tempCode;
Serial.println("Code Set To " + setCode);
stateSystem = 1;
kabel = 2;
}
tempCode = "";
}
else if (tempChar == 'C') {
if (stateSystem == 0 && opsi == 0) {
setCode = tempCode;
Serial.println("Code Set To " + setCode);
stateSystem = 1;
kabel = 3;
}
tempCode = "";
}
else if (tempChar == 'D') {
if (stateSystem == 0) {
opsi = 1 - opsi;
}
tempCode = "";
}
else if (tempChar == '#') {
if (stateSystem == 0) {
if (opsi == 0) {
setCode = tempCode;
Serial.println("Code Set To " + setCode);
stateSystem = 1;
kabel = 0;
}
else {
durasiSystem = tempCode.toInt() * 1000;
opsi = 0;
sprintf(text, "TIME SET %6d s", tempCode.toInt());
lcd.setCursor(0, 1); lcd.print(text);
delay(1000);
}
}
else {
if (tempCode == setCode) {
stateSystem = 3;
}
else {
lcd.setCursor(0, 0); lcd.print(" WRONG CODE ");
clockMul += 0.5;
delay(1000);
}
}
tempCode = "";
}
else if (tempChar == '*') {
tempCode = tempCode.substring(0, tempCode.length() - 1);
}
else {
if (tempCode.length() < 6) tempCode += tempChar;
}
lcd.setCursor(0, 1);
if (opsi == 0 || stateSystem == 1) lcd.print("CODE : ");
else lcd.print("TIME : s");
lcd.setCursor(7, 1); lcd.print(tempCode);
Serial.println(tempCode);
}
}