#include "LiquidCrystal_I2C.h"
#include "RTClib.h"
#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT22
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);
const int relay1Pin = 6;
const int relay2Pin = 5;
const int relay3Pin = 4;
const int relay4Pin = 3;
const int relay5Pin = 2;
const uint8_t tomPin[] = { 13, 12, 11, 10, 9, 8};
const int jlTom = 6;
float targetTemp = 37.5;
float targetHum = 52.5;
byte tomSw = 0;
byte setTimer=0;
int tmp;
bool mtrNyala = 0;
bool mtrAktif = 0;
long targetTime=3600;
long lamaNyala = 60;
long targetTimeRem;
long lamaNyalaRem;
int remainingTime = 0;
void setup() {
//Serial.begin(9600);
for (uint8_t i = 0; i < jlTom; i++) {
pinMode(tomPin[i], INPUT_PULLUP);
}
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
pinMode(relay5Pin, OUTPUT);
lcd.begin(20, 4);
lcd.backlight();
//lcd.noDisplay(); // tulisan tidak tampil
//lcd.setBacklight(0); // layar gelap
//lcd.setContrast(0);
rtc.begin();
dht.begin();
}
void loop() {
DateTime now = rtc.now();
float temp = dht.readTemperature(); // Baca suhu dari sensor DHT22
float hum = dht.readHumidity(); // Baca kelembaban dari sensor DHT22
bacaTombol();
//lcd.clear();
lcd.setCursor(0, 0);
tmp = now.day(); if (tmp<10) {lcd.print("0");} lcd.print(tmp, DEC); lcd.print('-');
tmp = now.month(); if (tmp<10) {lcd.print("0");} lcd.print(tmp, DEC); lcd.print('-');
tmp = now.year(); lcd.print(tmp, DEC); lcd.print(" ");
tmp = now.hour(); if (tmp<10) {lcd.print("0");} lcd.print(tmp, DEC); lcd.print(':');
tmp = now.minute();if (tmp<10) {lcd.print("0");} lcd.print(tmp, DEC); lcd.print(":");
tmp = now.second();if (tmp<10) {lcd.print("0");} lcd.print(tmp, DEC);
lcd.setCursor(0, 1); lcd.print(temp); lcd.write((uint8_t)223); lcd.print("C ");
lcd.print("%RH:"); lcd.print(hum);
if (temp>targetTemp){
digitalWrite(relay2Pin, LOW);
} else {
digitalWrite(relay2Pin, HIGH);
}
lcd.setCursor(0, 2); lcd.print(targetTemp);
if (mtrAktif) {
if (mtrNyala) {
remainingTime = lamaNyalaRem - millis() / 1000;
int hours = remainingTime / 3600;
int minutes = (remainingTime % 3600) / 60;
int seconds = (remainingTime % 3600) % 60;
String jam = String(hours);
if (hours < 10) {
jam = "0" + jam;
}
String menit = String(minutes);
if (minutes < 10) {
menit = "0" + menit;
}
String detik = String(seconds);
if (seconds < 10) {
detik = "0" + detik;
}
lcd.print(" " + jam + ":" + menit + ":" + detik + " ");
if (remainingTime==0){
mtrNyala=false;
targetTimeRem = targetTime + millis()/1000;
// Matikan Relay 1: Motor Utama
digitalWrite(relay1Pin, LOW);
}
} else {
remainingTime = targetTimeRem - millis() / 1000;
int hours = remainingTime / 3600;
int minutes = (remainingTime % 3600) / 60;
int seconds = (remainingTime % 3600) % 60;
String jam = String(hours);
if (hours < 10) {
jam = "0" + jam;
}
String menit = String(minutes);
if (minutes < 10) {
menit = "0" + menit;
}
String detik = String(seconds);
if (seconds < 10) {
detik = "0" + detik;
}
lcd.print(" " + jam + ":" + menit + ":" + detik + " ");
if (remainingTime==0){
mtrNyala=true;
lamaNyalaRem = lamaNyala + millis()/1000;
// Nyalakan Relay 1: Motor Utama
digitalWrite(relay1Pin, HIGH);
}
//lcd.print(" MTR On ");
//Serial.println(remainingTime);
}
} else {
lcd.print(" MTR OFF ");
}
lcd.print(targetHum);
lcd.setCursor(0, 3);
//lcd.write((byte)1);
//lcd.print("<SW>");
//lcd.write((byte)0);
//lcd.setCursor(13, 3);
//lcd.print(millis() / 1000);
if (tomSw==0){lcd.print("(STDBY) ");}
if (tomSw==1){lcd.print("(SUHU) ");}
if (tomSw==2){lcd.print("(%RH) ");}
if (tomSw==3){
lcd.print("MOTOR (ON/OFF)");
if (mtrAktif){lcd.print(" <ON>");}
else {lcd.print(" <OFF>");}
}
if (tomSw==4){
int jamJadwal = targetTime / 3600;
int mntJadwal = (targetTime % 3600) / 60;
int detJadwal = (targetTime % 3600) % 60;
String jamJdSt = String(jamJadwal);
if (jamJadwal<10){jamJdSt = "0"+jamJdSt;}
String mntJdSt = String(mntJadwal);
if (mntJadwal<10){mntJdSt = "0"+mntJdSt;}
String detSt = String(detJadwal);
if (detJadwal<10){detSt = "0"+detSt;}
if (setTimer==0){lcd.print("MOTOR (JADWAL) ");}
if (setTimer==1){lcd.print("JADWAL(Jam) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
if (setTimer==2){lcd.print("JADWAL(Mnt) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
if (setTimer==3){lcd.print("JADWAL(Det) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
}
if (tomSw==5){
int jamJadwal = lamaNyala / 3600;
int mntJadwal = (lamaNyala % 3600) / 60;
int detJadwal = (lamaNyala % 3600) % 60;
String jamJdSt = String(jamJadwal);
if (jamJadwal<10){jamJdSt = "0"+jamJdSt;}
String mntJdSt = String(mntJadwal);
if (mntJadwal<10){mntJdSt = "0"+mntJdSt;}
String detSt = String(detJadwal);
if (detJadwal<10){detSt = "0"+detSt;}
if (setTimer==0){lcd.print("MOTOR (Durasi) ");}
if (setTimer==1){lcd.print("Durasi(Jam) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
if (setTimer==2){lcd.print("Durasi(Mnt) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
if (setTimer==3){lcd.print("Durasi(Det) " + jamJdSt + ":" + mntJdSt + ":" + detSt);}
}
delay(101);
}
void bacaTombol(){
byte pitch = 6;
for (uint8_t i = 0; i < jlTom; i++) {
if (digitalRead(tomPin[i]) == LOW) {
pitch = i;
}
}
if (pitch == 0) {
if (tomSw==1){targetTemp++;}
if (tomSw==2){targetHum++;}
// if (tomSw==3){mtrAktif=true;}
if (tomSw==4){
if (setTimer==1){targetTime=targetTime+10800;}
if (setTimer==2){targetTime=targetTime+600;}
if (setTimer==3){targetTime=targetTime+10;}
};
if (tomSw==5){
if (setTimer==1){lamaNyala=lamaNyala+10800;}
if (setTimer==2){lamaNyala=lamaNyala+600;}
if (setTimer==3){lamaNyala=lamaNyala+10;}
};
}
if (pitch == 1) {
tomSw++;
if (tomSw == 6){tomSw=0;}
}
if (pitch == 2) {
if (tomSw==1){targetTemp--;}
if (tomSw==2){targetHum--;}
// if (tomSw==3){mtrAktif=false;}
if (tomSw==4){
if (setTimer==1){targetTime=targetTime-10800;}
if (setTimer==2){targetTime=targetTime-600;}
if (setTimer==3){targetTime=targetTime-10;}
};
if (tomSw==5){
if (setTimer==1){lamaNyala=lamaNyala-10800;}
if (setTimer==2){lamaNyala=lamaNyala-600;}
if (setTimer==3){lamaNyala=lamaNyala-10;}
};
}
if (pitch == 3) {
if (tomSw==1){targetTemp=targetTemp-0.1;}
if (tomSw==2){targetHum=targetHum-0.1;}
// if (tomSw==3){mtrAktif=false;}
if (tomSw==4){
if (setTimer==1){targetTime=targetTime-3600;}
if (setTimer==2){targetTime=targetTime-60;}
if (setTimer==3){targetTime--;}
};
if (tomSw==5){
if (setTimer==1){lamaNyala=lamaNyala-3600;}
if (setTimer==2){lamaNyala=lamaNyala-60;}
if (setTimer==3){lamaNyala--;}
};
}
if (pitch == 4) {
if (tomSw>=4){
setTimer++;
if (setTimer==4){setTimer=0;}
}
if (tomSw==3){
mtrAktif=!mtrAktif;
if (mtrAktif){
targetTimeRem = targetTime + millis()/1000;
}
}
}
if (pitch == 5) {
if (tomSw==1){targetTemp=targetTemp+0.1;}
if (tomSw==2){targetHum=targetHum+0.1;}
// if (tomSw==3){mtrAktif=true;}
if (tomSw==4){
if (setTimer==1){targetTime=targetTime+3600;}
if (setTimer==2){targetTime=targetTime+60;}
if (setTimer==3){targetTime++;}
};
if (tomSw==5){
if (setTimer==1){lamaNyala=lamaNyala+3600;}
if (setTimer==2){lamaNyala=lamaNyala+60;}
if (setTimer==3){lamaNyala++;}
};
}
//Serial.print("pitch:");
//Serial.print(pitch);
//Serial.print(" Timer:");
//Serial.print(setTimer);
//Serial.print(" Swith:");
//Serial.println(tomSw);
}Relay 1: Motor Utama
NTC 2 Pin
RTC Jam Sisem
Relay 2: Pemanas Udara
Relay 3: Pemanas Air
Relay 4: Kipas perata suhu/kelembaban
Sensor MQ135 (VOC)
Relay 5: Kipas udara segar
DHT22 #01
diatas rak telur
Suhu Air
Motor Utama
Untuk membalik telur
Menyala secara rutin jika MOTOR=ON
Pemanas udara otomatis menyala
jika suhu udara dibawah target
SHT30-D
dibawah rak telur