#include <Wire.h> // Library untuk modul RTC
#include <SPI.h> // Library untuk modul microSD
#include <SD.h> // Library untuk modul microSD
#include <TimeLib.h> // Library untuk modul RTC
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include <Adafruit_SPIDevice.h>
#include <RTClib.h>
#include <LiquidCrystal.h> // Library untuk modul LCD
#include <avr/sleep.h> // untuk sleep mode
// Sensor Ultrasonic
const int trigPin = 9;
const int echoPin = 10;
float durasi, cm, wl; // Tipe data yang dapat menampung nilai desimal
// MicroSD dan RTC
RTC_DS1307 rtc;
const int csPin = 4;
File myFile;
// LCD
LiquidCrystal lcd(8, 7, 6, 5, 3, 2); // Hubungkan RS, E, D4, D5, D6, D7 ke pin yang Anda pilih
// Pompa
const int pumpPin = 1; // Ganti dengan pin yang sesuai untuk mengendalikan pompa
String pumpCondition;
// Alarm (Buzzer)
const int buzzerPin = 0;
// LED
const int ledPin = 18;
// Sleep mode
void enterSleepMode() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
}
void setup() {
// Konfigurasi koneksi serial
Wire.begin();
Serial.begin(9600);
while (!Serial);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC Tidak Terbaca");
while (1);
}
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Serial.println("Inisialisasi RTC Sukses");
// Inisialisasi microSD
pinMode(csPin, OUTPUT);
if (!SD.begin(csPin)) {
Serial.println("MicroSD Error atau Hilang");
while (1);
}
Serial.println("Inisialisasi MicroSD Sukses");
// Inisialisasi Ultrasonic Sensor
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
// Inisialisasi Alarm
pinMode(buzzerPin, OUTPUT);
// LED
pinMode(ledPin, OUTPUT);
digitalWrite(18, LOW);
// Inisialisasi LCD
lcd.begin(20, 4); // 20 karakter x 4 baris
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Automatic Water Level Recording");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(1000);
// Inisialisasi Pompa
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, LOW); // Pastikan pompa dimatikan pada awalnya
}
void loop() {
loggingTanggal();
loggingWaktu();
loggingWaterlevel();
loggingMicroSD();
controlPump(); // Fungsi untuk mengendalikan pompa
delay(4000);
// Masukkan mikrokontroler ke sleep mode selama 60 detik
enterSleepMode();
}
void activateAlarm() {
digitalWrite(buzzerPin, HIGH);
}
void deactivateAlarm() {
digitalWrite(buzzerPin, LOW);
}
void controlPump() {
// Tentukan tingkat air minimum untuk mengaktifkan pompa (misalnya 10 cm)
float minWaterLevel = 10.0;
if (wl < minWaterLevel) {
// Aktifkan pompa
digitalWrite(pumpPin, HIGH);
pumpCondition = "ON ";
lcd.setCursor(0, 3);
lcd.print("Pump: ");
lcd.print(pumpCondition);
lcd.print(" Alarm: ON ");
activateAlarm();
// Kedipkan LED saat pompa aktif
blinkLED(ledPin, 0);
} else {
// Matikan pompa
digitalWrite(pumpPin, LOW);
pumpCondition = "OFF";
lcd.setCursor(0, 3);
lcd.print("Pump: ");
lcd.print(pumpCondition);
lcd.print(" Alarm: OFF");
deactivateAlarm();
// Matikan LED
digitalWrite(18, LOW);
}
}
void blinkLED(int pin, unsigned long interval) {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Ubah status LED (nyala/matikan)
if (digitalRead(pin) == LOW) {
digitalWrite(pin, HIGH);
} else {
digitalWrite(pin, LOW);
}
}
}
//logging Tanggal
void loggingTanggal() {
DateTime now = rtc.now();
// Tampilkan tanggal
lcd.setCursor(0, 1);
lcd.print("Date: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
}
//logging waktu
void loggingWaktu() {
DateTime now = rtc.now();
// Tampilkan waktu
lcd.setCursor(0, 2);
lcd.print("Time: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
}
void loggingWaterlevel() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
durasi = pulseIn(echoPin, HIGH);
cm = (durasi * 0.0343) / 2;
wl = 30 - cm;
// Level air
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(wl);
lcd.print("cm ");
}
void loggingMicroSD() {
DateTime now = rtc.now();
// Open csv
myFile = SD.open("AWLR.csv", FILE_WRITE);
if (myFile) {
myFile.print(now.day());
myFile.print("/");
myFile.print(now.month());
myFile.print("/");
myFile.print(now.year());
myFile.print(" , ");
myFile.print(now.hour());
myFile.print(":");
myFile.print(now.minute());
myFile.print(":");
myFile.print(now.second());
myFile.print(" , ");
myFile.print(wl);
myFile.close();
Serial.println(" | Saved to MicroSD");
} else {
Serial.println(" | Failed to Save to MicroSD");
}
delay(1000);
}