#include <Wire.h> // Library untuk I2C communication
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
#include <DHT.h> // Library untuk sensor suhu dan kelembaban
#include <RTClib.h> // Library untuk RTC (Real-Time Clock)
#include <Keypad.h> // Library untuk keypad
#include <Servo.h> // Library untuk motor servo
#define DHTPIN 2 // Pin data sensor DHT
#define DHTTYPE DHT22 // Tipe sensor DHT
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi sensor DHT
#define RELAY_PIN 3 // Pin untuk mengontrol relay pemanas
#define FAN_PIN 4 // Pin untuk mengontrol kipas
#define SERVO_PIN 5 // Pin untuk mengontrol motor servo
#define BUZZER_PIN 9 // Pin untuk mengontrol buzzer
#define RTC_SDA A4 // Pin SDA untuk RTC
#define RTC_SCL A5 // Pin SCL untuk RTC
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi objek LCD
Servo servo; // Inisialisasi objek motor servo
RTC_DS1307 rtc; // Inisialisasi objek RTC
const byte ROWS = 4; // Jumlah baris pada keypad
const byte COLS = 4; // Jumlah kolom pada keypad
const int triggerPin = 10; // Hubungkan ke pin trigger sensor HC-SR04
const int echoPin = 11; // Hubungkan ke pin echo sensor HC-SR04
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte colPins[COLS] = {13, 12, 11, 10}; // Pin kolom pada keypad
byte rowPins[ROWS] = {9, 8, 7, 6}; // Pin baris pada keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Inisialisasi keypad
float set_temperature = 37.5; // Nilai suhu yang diinginkan
float set_humidity = 60.0; // Nilai kelembaban yang diinginkan
int set_hour = 12; // Jam yang diinginkan (format 24 jam)
int set_minute = 0; // Menit yang diinginkan
unsigned long last_rotation_time = 0; // Waktu terakhir rotasi
int rotation_duration = 5000; // Durasi rotasi motor servo (default: 500ms)
bool setting_mode = false; // Mode pengaturan aktif atau tidak
bool show_temp_hum = true; // Tampilkan suhu dan kelembaban atau waktu
int days_elapsed = 0; // Jumlah hari yang sudah berlalu
bool isWaterAlarmActive = false; // Status alarm air aktif atau tidak
bool isTemperatureAlarmActive = false; // Status alarm suhu aktif atau tidak
void setup() {
dht.begin(); // Inisialisasi sensor DHT
rtc.begin(); // Inisialisasi RTC
pinMode(triggerPin, OUTPUT); // Atur triggerPin sebagai OUTPUT
pinMode(echoPin, INPUT); // Atur echoPin sebagai INPUT
pinMode(RELAY_PIN, OUTPUT); // Atur pin relay sebagai output
pinMode(FAN_PIN, OUTPUT); // Atur pin kipas sebagai output
pinMode(BUZZER_PIN, OUTPUT); // Atur pin buzzer sebagai output
servo.attach(SERVO_PIN); // Hubungkan motor servo ke pin
servo.write(90); // Letakkan motor servo di posisi tengah
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
lcd.setCursor(0, 0);
lcd.print("Mesin Penetasan");
lcd.setCursor(0, 1);
lcd.print("Telur Ayam");
delay(2000);
}
void loop() {
unsigned long current_time = millis(); // Waktu sekarang dalam milidetik
if (!setting_mode) {
float temperature = dht.readTemperature(); // Baca suhu dari sensor DHT
float humidity = dht.readHumidity(); // Baca kelembaban dari sensor DHT
float waterLevel = getWaterLevel(); // Mendapatkan tinggi level air
DateTime now = rtc.now(); // Baca waktu dari RTC
// Tampilkan data suhu dan kelembaban pada LCD
if (show_temp_hum) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(humidity);
lcd.print("%");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
lcd.print(" ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0");
}
lcd.print(now.minute());
}
// Check water level and trigger alarm if empty
if (waterLevel <= 0) {
if (!isWaterAlarmActive) {
lcd.clear();
lcd.print("Air Habis, Segera Isi !!");
activateBuzzer(); // Aktifkan bunyi alarm
isWaterAlarmActive = true;
}
} else {
isWaterAlarmActive = false;
}
// Check temperature and trigger alarm if extreme
if (temperature < (set_temperature - 10) || temperature > (set_temperature + 10)) {
if (!isTemperatureAlarmActive) {
lcd.clear();
lcd.print("Suhu Ruangan Sangat Tidak Sesuai !!");
activateBuzzer(); // Aktifkan bunyi alarm
isTemperatureAlarmActive = true;
}
} else {
isTemperatureAlarmActive = false;
}
// ...
}
}
float getWaterLevel() {
// Mengukur tinggi level air menggunakan sensor HC-SR04
// Kirim sinyal ultrasonik
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
// Baca waktu yang dibutuhkan untuk gelombang ultrasonik kembali
unsigned long duration = pulseIn(echoPin, HIGH);
// Konversi waktu menjadi tinggi level air (dalam cm, mm, atau inch)
float waterLevel = duration * 0.034 / 2; // Rumus perhitungan jarak berdasarkan waktu ultrasonik
return waterLevel;
// Implementasi fungsi untuk mendapatkan tinggi level air dari sensor HC-SR04
}
void activateBuzzer() {
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan bunyi buzzer
delay(1000); // Berbunyi selama 1 detik
digitalWrite(BUZZER_PIN, LOW); // Matikan bunyi buzzer
}
// Fungsi untuk memutar telur
void rotateEggs() {
servo.write(0); // Putar motor servo ke kiri
delay(rotation_duration); // Tunda sesuai durasi rotasi
servo.write(90); // Putar motor servo ke kanan
delay(rotation_duration); // Tunda sesuai durasi rotasi
servo.write(0); // Kembalikan motor servo ke posisi tengah
}
// Fungsi untuk mengatur nilai suhu, kelembaban, atau durasi rotasi
void setParameter(float ¶meter, String prompt) {
String input = "";
char key;
while (true) {
key = keypad.getKey();
if (key) {
if (key == '#') {
parameter = input.toFloat(); // Mengubah input ke dalam tipe data float
lcd.clear();
lcd.print("Nilai berhasil");
lcd.setCursor(0, 1);
lcd.print("diubah");
delay(2000);
setting_mode = false;
break;
} else if (key == '*') {
lcd.clear();
lcd.print("Pengaturan");
lcd.setCursor(0, 1);
lcd.print("dibatalkan");
delay(2000);
setting_mode = false;
break;
} else {
input += key;
lcd.print(key);
}
}
}
}