#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 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
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
void setup() {
dht.begin(); // Inisialisasi sensor DHT
rtc.begin(); // Inisialisasi RTC
pinMode(RELAY_PIN, OUTPUT); // Atur pin relay sebagai output
pinMode(FAN_PIN, OUTPUT); // Atur pin kipas 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
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("Hari ke ");
lcd.print(days_elapsed + 1);
lcd.setCursor(0, 1);
lcd.print("Waktu: ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0");
}
lcd.print(now.minute());
}
// Periksa jika suhu melebihi nilai yang diinginkan
if (temperature < set_temperature) {
digitalWrite(RELAY_PIN, HIGH); // Aktifkan pemanas
} else {
digitalWrite(RELAY_PIN, LOW); // Matikan pemanas
}
// Periksa jika kelembaban melebihi nilai yang diinginkan
if (humidity < set_humidity) {
digitalWrite(FAN_PIN, HIGH); // Aktifkan kipas
} else {
digitalWrite(FAN_PIN, LOW); // Matikan kipas
}
// Putar telur setiap 10 menit
//if (current_time - last_rotation_time >= 600000) { // 10 menit (600000 ms)
if (current_time - last_rotation_time >= 5000) { // 10 menit (600000 ms)
rotateEggs(); // Panggil fungsi untuk memutar telur
last_rotation_time = current_time; // Perbarui waktu terakhir rotasi
}
delay(5000); // Tunda 5 detik sebelum mengganti tampilan
show_temp_hum = !show_temp_hum; // Ganti tampilan antara suhu/kelembaban dan waktu
} else {
// Tampilkan mode pengaturan pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mode Pengaturan");
lcd.setCursor(0, 1);
lcd.print("1=Suhu, 2=Kelembaban, 3=Durasi");
delay(2000); // Tunda untuk memberikan waktu pada pengguna
// Baca input dari keypad
char key = keypad.getKey();
// Cek input dari keypad
if (key) {
if (key == '1') {
lcd.clear();
lcd.print("Masukkan nilai suhu:");
setParameter(set_temperature);
} else if (key == '2') {
lcd.clear();
lcd.print("Masukkan nilai kelembaban:");
setParameter(set_humidity);
} else if (key == '3') {
lcd.clear();
lcd.print("Masukkan durasi rotasi (ms):");
setParameter(rotation_duration);
}
}
}
}
// 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 parameter) {
String input = "";
char key;
while (true) {
key = keypad.getKey();
if (key) {
if (key == '#') {
rotation_duration = input.toInt(); // Mengubah input ke dalam tipe data integer
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);
}
}
}
}