#include <LiquidCrystal.h>
// Mendefinisikan pin koneksi untuk LCD
const int rs = 12;
const int en = 11;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Mendefinisikan pin koneksi untuk Relay Alarm
const int relay1Pin = 6;
const int relay2Pin = 7;
const int relay3Pin = 8;
// Mendefinisikan pin koneksi untuk Buzzer
const int buzzerPin = 9;
// Variabel untuk menyimpan status alarm
bool alarmStatus[7] = {false}; // Indeks 0 hingga 6 sesuai dengan nomor relay
void setup() {
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.print("Sistem Alarm");
// Inisialisasi pin Relay
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
// Inisialisasi pin Buzzer
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// Memeriksa kondisi dan menetapkan alarm sesuai
// Ganti kondisi ini dengan kondisi alarm sebenarnya
// Alarm No TS Lock
bool noTSLock = true; // Ganti dengan kondisi Anda
updateAlarmStatus(1, noTSLock, "No TS Lock");
// Alarm No Primary Input Lock
bool noPrimaryInputLock = true; // Ganti dengan kondisi Anda
updateAlarmStatus(2, noPrimaryInputLock, "No Primary Input Lock");
// Alarm No Secondary Input Lock
bool noSecondaryInputLock = true; // Ganti dengan kondisi Anda
updateAlarmStatus(3, noSecondaryInputLock, "No Secondary Input Lock");
// Alarm C/N Margin
int cnMargin = 5; // Ganti dengan kondisi Anda
updateCNMarginAlarm(cnMargin);
// Alarm Video Not Running
bool videoNotRunning = true; // Ganti dengan kondisi Anda
updateAlarmStatus(5, videoNotRunning, "Video Not Running");
// Alarm CA Error
bool caError = true; // Ganti dengan kondisi Anda
updateAlarmStatus(6, caError, "CA Error");
// Alarm OverTemperature
int temperature = 55; // Ganti dengan kondisi Anda
updateAlarmStatus(7, temperature >= 55, "OverTemperature");
// Mematikan buzzer jika tidak ada alarm yang aktif
if (!isAnyAlarmActive()) {
digitalWrite(buzzerPin, LOW);
}
delay(1000); // Delay untuk stabilitas
}
// Fungsi untuk mengupdate status alarm dan mengontrol relay serta buzzer
void updateAlarmStatus(int alarmNumber, bool alarmTriggered, const char *alarmMessage) {
if (alarmTriggered && !alarmStatus[alarmNumber - 1]) {
activateAlarm(alarmNumber);
alarmStatus[alarmNumber - 1] = true;
lcd.setCursor(0, 1);
lcd.print(alarmMessage);
lcd.print(" Aktif ");
digitalWrite(buzzerPin, HIGH); // Aktifkan buzzer jika ada alarm aktif
} else if (!alarmTriggered && alarmStatus[alarmNumber - 1]) {
deactivateAlarm(alarmNumber);
alarmStatus[alarmNumber - 1] = false;
lcd.setCursor(0, 1);
lcd.print(alarmMessage);
lcd.print(" Tidak Aktif");
}
}
// Fungsi untuk mengaktifkan alarm (menggunakan Relay NO)
void activateAlarm(int alarmNumber) {
switch (alarmNumber) {
case 1:
case 5:
digitalWrite(relay1Pin, LOW);
break;
case 2:
case 6:
digitalWrite(relay2Pin, LOW);
break;
case 3:
case 7:
digitalWrite(relay3Pin, LOW);
break;
}
}
// Fungsi untuk menonaktifkan alarm (menggunakan Relay NC)
void deactivateAlarm(int alarmNumber) {
switch (alarmNumber) {
case 1:
case 5:
digitalWrite(relay1Pin, HIGH);
break;
case 2:
case 6:
digitalWrite(relay2Pin, HIGH);
break;
case 3:
case 7:
digitalWrite(relay3Pin, HIGH);
break;
}
}
// Fungsi untuk memeriksa apakah ada alarm yang aktif
bool isAnyAlarmActive() {
for (int i = 0; i < 7; ++i) {
if (alarmStatus[i]) {
return true;
}
}
return false;
}
// Fungsi untuk mengupdate status alarm C/N Margin dan mengontrol buzzer
void updateCNMarginAlarm(int cnMargin) {
bool alarmTriggered = cnMargin <= 5; // Ganti dengan kondisi Anda
if (alarmTriggered && !alarmStatus[3]) {
alarmStatus[3] = true;
lcd.setCursor(0, 1);
lcd.print("C/N Margin Aktif ");
digitalWrite(buzzerPin, HIGH); // Aktifkan buzzer jika alarm aktif
} else if (!alarmTriggered && alarmStatus[3]) {
alarmStatus[3] = false;
lcd.setCursor(0, 1);
lcd.print("C/N Margin Tidak Aktif");
}
}