#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h> // Include the RTC library
#include <DHT.h>
RTC_DS1307 rtc; // Create an instance of the RTC_DS1307 class
#define DS18B20_SENSOR1 3 // DS18B20 sensor 1
#define DHT_PIN 2 // pin sensor terhubung ke pin digital 8
#define RELAY1_PIN 4 // ds1820 S1 output relay1 heater
#define RELAY2_PIN 5 // ds18b20 S2 output relay2 fan
#define RELAY3_PIN 6 // SOIL OUTPUT relay3 pompa dc2 air
#define RELAY4_PIN 7 // relay4 pompa dc1 EM4
#define RELAY5_PIN 8 // Motor
//-----------------------------SoilMoisture
const int SoilSensor = A0;
//-----------------------------LED
const int ledPin = 10;
const int buttonPin = 9;
bool programActive = false;
bool buttonPressed = false;
bool relay4Aktif = false;
//-----------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire1(DS18B20_SENSOR1);
DallasTemperature sensors1(&oneWire1);
DHT dht(DHT_PIN, DHT22);
//-----------------------------Fungsi millis program
unsigned long previousMillis = 0;
const unsigned long interval = 1000;
//-----------------------------FUNGSI MILIS RELAY 5
bool relay5Active = false;
unsigned long relay5OnTime = 0;
unsigned long relay5OffTime = 0;
unsigned long DurasiOn = 60000;
unsigned long DurasiOff = 60000;
//-----------------------------RTC
String getDayOfWeek(int day)
{
switch (day)
{
case 0: return "Minggu";
case 1: return "Senin";
case 2: return "Selasa";
case 3: return "Rabu";
case 4: return "Kamis";
case 5: return "Jumat";
case 6: return "Sabtu";
default: return "";
}
}
//----------------------------- Jadwal alarm RTC
const int targetDay = 4; // Hari target (misalnya, jumat)
const int targetHour = 23; // Jam target (misalnya, 8 untuk jam 8 pagi)
const int targetMinute = 56; // Menit target (misalnya, 28 untuk jam 08:28)
void setup()
{
Serial.begin(9600);
Wire.begin(); // Initialize I2C communication for RTC
rtc.begin(); // Initialize RTC
//rtc.adjust(DateTime(__DATE__, __TIME__)); (mengatur awal date dan time di awal)
sensors1.begin();
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Afivah Yunita");
lcd.setCursor(0,1);
lcd.print("monitoring");
delay(2000);
//---------------------------------------Button
pinMode(buttonPin, INPUT_PULLUP);
//---------------------------------------LED
pinMode(ledPin, OUTPUT);
//---------------------------------------HEATER
pinMode(RELAY1_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, HIGH);//kondisi awal mati
//---------------------------------------KIPAS
pinMode(RELAY2_PIN, OUTPUT);
digitalWrite(RELAY2_PIN, HIGH);//kondisi awal mati
//---------------------------------------Pompa DC2 air
pinMode(RELAY3_PIN, OUTPUT);
digitalWrite(RELAY3_PIN, HIGH);//kondisi awal mati
//---------------------------------------Pompa DC1 EM4
pinMode(RELAY4_PIN, OUTPUT);
digitalWrite(RELAY4_PIN, HIGH);//kondisi awal mati
//---------------------------------------Motor Pengaduk/pencacah
pinMode(RELAY5_PIN, OUTPUT);
digitalWrite(RELAY5_PIN, HIGH);//kondisi awal hidup
}
void kontrolRelay5() {
unsigned long currentMillis = millis();
if (!relay5Active) {
// Relay 5 sedang tidak aktif, cek apakah waktunya untuk menyalakannya
if (currentMillis - relay5OffTime >= DurasiOff) {
digitalWrite(RELAY5_PIN, LOW); // Nyalakan relay 5
Serial.println("Motor pencacah/Pengaduk ON");
relay5Active = true;
relay5OnTime = currentMillis;
}
}
else {
// Relay 5 sedang aktif, cek apakah waktunya untuk mematikannya
if (currentMillis - relay5OnTime >= DurasiOn) {
digitalWrite(RELAY5_PIN, HIGH); // Matikan relay 5
Serial.println("Motor pencacah/Pengaduk OFF");
relay5Active = false;
relay5OffTime = currentMillis;
}
}
}
void loop()
{
// Baca status tombol switch
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW && !buttonPressed)
{
buttonPressed = true;
programActive = !programActive; // Toggle status program
delay(300); // Delay untuk menghindari bouncing
// Tambahkan kondisi berikut untuk menyalakan relay 5 saat tombol start ditekan
if (programActive) {
digitalWrite(RELAY5_PIN, LOW); // Nyalakan relay 5
Serial.println("Motor pencacah/Pengaduk ON");
relay5Active = true;
relay5OnTime = millis();
}
}
// Jika program aktif, jalankan kontrol program
if (programActive)
{
Serial.println("Start");
// Kontrol relay 5
kontrolRelay5();
// Kontrol relay 4
if (!relay4Aktif)//------------------------------------aktif relay4 hanya sekali
{
digitalWrite(RELAY4_PIN, LOW);
Serial.println("Pompa EM4 ON");
delay(2000);
digitalWrite(RELAY4_PIN, HIGH);
Serial.println("Pompa EM4 OFF");
relay4Aktif = true; // Set the flag to indicate that relay4 has been activated
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
DateTime now = rtc.now();
// Cek apakah saat ini adalah hari yang dijadwalkan
if (now.dayOfTheWeek() == targetDay && now.hour() == targetHour && now.minute() == targetMinute )
{
digitalWrite(ledPin, HIGH); // Nyalakan LED
delay(5000); // Tunda selama 5 detik
digitalWrite(ledPin, LOW); // Matikan LED
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hari: ");
lcd.print(getDayOfWeek(now.dayOfTheWeek()));
lcd.setCursor(0, 1);
lcd.print("Tanggal: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.setCursor(0, 2);
lcd.print("Pukul: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second() < 10)
{
lcd.print("0");
}
lcd.print(now.second(), DEC);
delay(3000);
//----------------------------------------------------------DS18B20 S1(Sampah)
sensors1.setResolution(9); //bit untuk resolusi
sensors1.requestTemperatures(); // Minta data suhu dari sensor
//float temperatureC = sensors1.getTempCByIndex(0); // Baca suhu dalam celcius
float temperatureC = sensors1.getTempCByIndex(0); // Baca nilai mentah dari sensor
float KalibrasiSuhu = (temperatureC - 0.007)/0.9732; // Koreksi nilai suhu
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu S:");
lcd.print(KalibrasiSuhu); // Tampilkan suhu dalam celcius
lcd.print((char)223); //tampilkan simbol derajat di LCD
lcd.print("C");
Serial.println("Suhu Sampah: " + String(KalibrasiSuhu) + "C");
//----------------------------------------------------------DS18B20 S2
float dht22Temp = dht.readTemperature();
float dht22Humidity = dht.readHumidity();
//lcd.clear(); // Bersihkan tampilan LCD
lcd.setCursor(0, 1); // Pindahkan kursor ke baris 0 kolom 0
lcd.print("Suhu R:"); // Tampilkan teks "Suhu R: "
lcd.print(dht22Temp); // Tampilkan suhu dalam dht
lcd.print(char(223)); //tampilkan simbol derajat di LCD
lcd.print("C"); // Tampilkan satuan "C" untuk celcius
Serial.println("Suhu Ruang: "+String(dht22Temp)+"C");
lcd.setCursor(0, 3); // Pindahkan kursor ke baris 1 kolom 1
lcd.print("Kelembapan R:");
lcd.print(dht22Humidity); // Tampilkan kelembaban dalam dht
lcd.print("%"); // Tampilkan satuan "%"
Serial.println("Kelembapan Ruang: "+String(dht22Humidity)+"%");
//-----------------------------------------------------------------Soil
//-----------------------------------------------------------------Soil
int KelembapanTanah;
int hasilPembacaan = analogRead(SoilSensor);
KelembapanTanah = (100 - ((hasilPembacaan/1023.00)*100));
//lcd.clear(); // Bersihkan tampilan LCD
lcd.setCursor(0, 2); // Pindahkan kursor ke baris 0 kolom 2
lcd.print("Kelembapan S:"); // Tampilkan teks "kelembapan tanah: "
lcd.print(KelembapanTanah); // Tampilkan kelembapan tanah
lcd.print("%"); // Tampilkan satuan "%" untuk kelembapan
Serial.println("Kelembapan Sampah: "+String(KelembapanTanah)+"%");
//----------------------------------------------------------DS18B20 S1(S)
//cek suhu DS18B20 S1 dan on/off relay 1 HEATER
if (temperatureC <= 40)
{
digitalWrite(RELAY1_PIN, LOW);
Serial.println("HEATER ON");
}
else if (temperatureC >= 42)
{
digitalWrite(RELAY1_PIN, HIGH);
Serial.println("HEATER OFF");
}
//-----------------------------------------------------------------Soil
//cek Kelembapan dan on/off relay 4 POMPA
if (KelembapanTanah <= 40 )
{
digitalWrite(RELAY3_PIN, LOW);
Serial.println("Pompa AIR ON");
}
else if (KelembapanTanah >= 50 )
{
digitalWrite(RELAY3_PIN, HIGH);
Serial.println("Pompa AIR OFF");
}
//----------------------------------------------------------DS18B20 S2(R)
//cek suhu DHT22 dan on/off relay 2 KIPAS
if (dht22Temp >= 45)
{
digitalWrite(RELAY2_PIN, LOW);
Serial.println ("KIPAS EXHAUST ON");
}
else if (dht22Temp <= 40)
{
digitalWrite(RELAY2_PIN, HIGH);
Serial.println ("KIPAS EXHAUST OFF");
}
delay(5000);
}
}
}
Loading
ds18b20
ds18b20