#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
uint8_t DAILY_EVENT_PAGI_HH = 9; // waktu penyiraman pagi : jam
uint8_t DAILY_EVENT_PAGI_MM = 42; // waktu penyiraman pagi : menit
uint8_t DAILY_EVENT_SORE_HH = 9; // waktu penyiraman sore : jam
uint8_t DAILY_EVENT_SORE_MM = 44; // waktu penyiraman sore : menit
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
#define PIN_TRIG 3
#define PIN_ECHO 2
void setup() {
// Hanya berjalan sekali setelah mulai atau reset
Serial.begin(9600);
// output yang berjalan
pinMode(7, OUTPUT); // relay ke pompa
pinMode(8, OUTPUT); // buzzer
pinMode(13, OUTPUT); // LED batas air darurat habis
pinMode(12, OUTPUT); // LEDbatas pengisian air
pinMode(11, OUTPUT); // LED batas air berlebih
// inisiasi LCD
lcd.init();
lcd.backlight();
// sensor jarak
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// Real Time Clock
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// sets the RTC to the date & time on PC this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// sets the RTC with an explicit date & time, for example to set
// January 21, 2021 at 3am you would call:
// rtc.adjust(DateTime(2021, 1, 21, 3, 0, 0));
// inisiasi pompa
digitalWrite(7,HIGH);
delay(3000);
digitalWrite(7,LOW);
}
void loop() {
// kondisi output keadaan mati
digitalWrite(7, LOW);
noTone(8);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
lcd.clear();
// kontrol sensor jarak
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
int distance = duration/58;
Serial.print("Distance in CM: ");
Serial.println(distance);
// kontrol pompa
DateTime now = rtc.now();
printTime(now);
if (now.hour() == DAILY_EVENT_PAGI_HH &&
now.minute() == DAILY_EVENT_PAGI_MM ||
now.hour() == DAILY_EVENT_SORE_HH &&
now.minute() == DAILY_EVENT_SORE_MM) {
if (distance<350){
Serial.println("Penyiraman air");
digitalWrite(7, HIGH);
delay(10000);
digitalWrite(7, LOW);
lcd.setCursor(2, 0);
lcd.print("Penyiraman!!");
delay(50000);
}
else{
digitalWrite(7, LOW);
}
}
// LCD
lcd.setCursor(0,0);
lcd.print("Kondisi:");
LCDTime(now);
// kontrol LED
if (distance>300 && distance<350){
digitalWrite(12,HIGH);
lcd.setCursor(8, 0);
lcd.print("Kurang");
}
if (distance>=100 && distance<=300){
lcd.setCursor(8, 0);
lcd.print("Terisi");
}
if (distance>10 && distance<100) {
digitalWrite(11,HIGH);
lcd.setCursor(8, 0);
lcd.print("Penuh");
}
if (distance>=350){
digitalWrite(13,HIGH);
lcd.setCursor(8, 0);
lcd.print("Habis");
tone(8, 512);
}
delay(1000);
}
void printTime(DateTime time) {
Serial.print("TIME: ");
Serial.print(time.year(), DEC);
Serial.print('/');
Serial.print(time.month(), DEC);
Serial.print('/');
Serial.print(time.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[time.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(time.hour(), DEC);
Serial.print(':');
Serial.print(time.minute(), DEC);
Serial.print(':');
Serial.println(time.second(), DEC);
}
void LCDTime(DateTime now){
lcd.setCursor(5,1);
lcd.print(now.hour());
lcd.print(':');
lcd.print(now.minute());
}