#include <Keypad.h>
#include <Servo.h>
#include <DHT.h>
#include <RTClib.h>
#include <Adafruit_SSD1306.h>
#define PIN_DHT 2
#define TIPE_DHT DHT22
#define PIN_BUZZER 5 // Buzzer dan lampu sorot berbagi pin ini
#define PIN_LAMPU_RUANGAN 6
#define RESET_OLED -1
Servo servoPintu;
Servo servoPemanas;
Servo servoPendingin;
DHT dht(PIN_DHT, TIPE_DHT);
RTC_DS3231 rtc;
Adafruit_SSD1306 layar(RESET_OLED);
const int pinServoPintu = 3;
const int pinServoPemanas = 7;
const int pinServoPendingin = 8;
const String pinBenar = "1234";
// Definisikan pin untuk keypad pada Arduino Mega
char tombol[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte barisPin[4] = {22, 23, 24, 25}; // Pin untuk baris pada Arduino Mega
byte kolomPin[4] = {26, 27, 28, 29}; // Pin untuk kolom pada Arduino Mega
Keypad keypad = Keypad(makeKeymap(tombol), barisPin, kolomPin, 4, 4);
unsigned long waktuPintuTerbuka = 0;
const unsigned long durasiAktif = 600000; // 10 menit dalam milidetik
bool pintuTerbuka = false;
bool perangkatAktif = false;
bool alarmAktif = false;
void setup() {
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_LAMPU_RUANGAN, OUTPUT);
servoPintu.attach(pinServoPintu);
servoPemanas.attach(pinServoPemanas);
servoPendingin.attach(pinServoPendingin);
servoPintu.write(0);
servoPemanas.write(0);
servoPendingin.write(0);
dht.begin();
rtc.begin();
if (!layar.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;);
}
layar.clearDisplay();
layar.display();
tampilkanLoadingDenganTitik();
Serial.begin(9600);
}
void loop() {
String pinMasuk = dapatkanPinMasuk();
if (pinMasuk == pinBenar) {
bukaPintu();
tampilkanPesan("Pintu Terbuka");
} else if (pinMasuk.length() > 0) {
pinSalah();
tampilkanPesan("PIN SALAH,\nSILAHKAN MASUKKAN KEMBALI");
}
kelolaPerangkat();
perbaruiLayar();
}
void tampilkanLoadingDenganTitik() {
layar.clearDisplay();
layar.setTextSize(2);
layar.setTextColor(SSD1306_WHITE);
layar.setCursor(0, 15);
layar.print("Loading");
layar.display();
for (int i = 0; i < 3; i++) {
delay(150);
layar.print(".");
layar.display();
}
delay(1000);
}
String dapatkanPinMasuk() {
static String inputPIN = "";
char tombolDitekan = keypad.getKey();
if (tombolDitekan) {
if (tombolDitekan == '#') {
String sementara = inputPIN;
inputPIN = "";
return sementara;
} else if (tombolDitekan == '*') {
inputPIN = "";
} else {
inputPIN += tombolDitekan;
tampilkanPIN(inputPIN);
}
}
return "";
}
void tampilkanPIN(String pin) {
layar.clearDisplay();
layar.setTextSize(2);
layar.setTextColor(SSD1306_WHITE);
layar.setCursor(0, 20);
String mask = "";
for (int i = 0; i < pin.length(); i++) {
mask += "*";
}
layar.println(mask);
layar.display();
}
void bukaPintu() {
if (!pintuTerbuka) {
servoPintu.write(90);
waktuPintuTerbuka = millis();
pintuTerbuka = true;
digitalWrite(PIN_LAMPU_RUANGAN, HIGH);
}
}
void kelolaPerangkat() {
float suhu = dht.readTemperature();
if (suhu < 24) {
servoPemanas.write(90);
} else if (suhu >= 24) {
servoPemanas.write(0);
}
if (suhu >= 32) {
servoPendingin.write(90);
} else if (suhu <= 24) {
servoPendingin.write(0);
}
if (pintuTerbuka && (millis() - waktuPintuTerbuka >= durasiAktif)) {
digitalWrite(PIN_LAMPU_RUANGAN, LOW);
tutupPintu();
}
}
void tutupPintu() {
if (pintuTerbuka) {
servoPintu.write(0);
pintuTerbuka = false;
}
}
void pinSalah() {
tone(PIN_BUZZER, 1000);
delay(1000);
noTone(PIN_BUZZER);
alarmAktif = true;
}
void tampilkanPesan(String pesan) {
layar.clearDisplay();
layar.setTextSize(1);
layar.setTextColor(SSD1306_WHITE);
layar.setCursor(0, 0);
layar.println(pesan);
layar.display();
delay(2000);
}
void perbaruiLayar() {
static unsigned long waktuTerakhir = 0;
static int halaman = 0;
if (millis() - waktuTerakhir > 5000) { // Ganti layar setiap 5 detik
waktuTerakhir = millis();
halaman = (halaman + 1) % 2; // Dua halaman, 0 dan 1
}
layar.clearDisplay();
layar.setTextSize(1);
layar.setTextColor(SSD1306_WHITE);
if (halaman == 0) {
// Halaman 1: Waktu, Pintu, Suhu
DateTime sekarang = rtc.now();
char waktuTerformat[20];
sprintf(waktuTerformat, "%02d:%02d:%02d", sekarang.hour(), sekarang.minute(), sekarang.second());
layar.setCursor(0, 0);
layar.println(waktuTerformat);
layar.setCursor(0, 10);
layar.print("Pintu: ");
layar.println(pintuTerbuka ? "Terbuka" : "Tertutup");
layar.setCursor(0, 20);
layar.print("Suhu: ");
layar.print(dht.readTemperature());
layar.println(" C");
} else {
// Halaman 2: Pendingin, Pemanas, Lampu
layar.setCursor(0, 0);
layar.print("Pendingin: ");
layar.println(servoPendingin.read() == 90 ? "Aktif" : "Mati");
layar.setCursor(0, 10);
layar.print("Pemanas: ");
layar.println(servoPemanas.read() == 90 ? "Aktif" : "Mati");
layar.setCursor(0, 20);
layar.print("Lampu: ");
layar.println(digitalRead(PIN_LAMPU_RUANGAN) ? "ON" : "OFF");
}
layar.display();
}