#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
#define RELAY_PIN 8
#define BUTTON_PIN 7
#define SD_CS 10
#define SOIL1 A0
#define SOIL2 A1
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
File dataFile;
bool pumpState = false;
unsigned long lastLog = 0;
const unsigned long logInterval = 1000; // 1 menit
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(RELAY_PIN, LOW);
dht.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (!SD.begin(SD_CS)) {
Serial.println("MicroSD gagal!");
while (1);
}
if (!SD.exists("data.csv")) {
dataFile = SD.open("data.csv", FILE_WRITE);
dataFile.println("Tanggal,Waktu,Soil1,Soil2,Suhu,HumUdara,Pompa");
dataFile.close();
}
Serial.println("Sistem Smart Garden Siap ✅");
}
void loop() {
unsigned long nowMillis = millis();
if (nowMillis - lastLog >= logInterval) {
lastLog = nowMillis;
logData();
}
if (digitalRead(BUTTON_PIN) == LOW) {
delay(300);
scanData();
}
}
void logData() {
int soil1 = analogRead(SOIL1);
int soil2 = analogRead(SOIL2);
float suhu = dht.readTemperature();
float hum = dht.readHumidity();
DateTime now = rtc.now();
pumpState = (soil1 < 400 || soil2 < 400);
digitalWrite(RELAY_PIN, pumpState ? HIGH : LOW);
dataFile = SD.open("data.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(now.day()); dataFile.print("-");
dataFile.print(now.month()); dataFile.print("-");
dataFile.print(now.year()); dataFile.print(",");
dataFile.print(now.hour()); dataFile.print(":");
dataFile.print(now.minute()); dataFile.print(",");
dataFile.print(soil1); dataFile.print(",");
dataFile.print(soil2); dataFile.print(",");
dataFile.print(suhu); dataFile.print(",");
dataFile.print(hum); dataFile.print(",");
dataFile.println(pumpState ? "ON" : "OFF");
dataFile.close();
}
// ===== OUTPUT KE TERMINAL =====
Serial.println("Data tersimpan:");
Serial.print("Tanggal : ");
Serial.print(now.day()); Serial.print("-");
Serial.print(now.month()); Serial.print("-");
Serial.println(now.year());
Serial.print("Waktu : ");
Serial.print(now.hour()); Serial.print(":");
Serial.println(now.minute());
Serial.print("Soil1 : "); Serial.println(soil1);
Serial.print("Soil2 : "); Serial.println(soil2);
Serial.print("Suhu : "); Serial.print(suhu); Serial.println(" C");
Serial.print("Hum : "); Serial.print(hum); Serial.println(" %");
Serial.print("Pompa : "); Serial.println(pumpState ? "ON" : "OFF");
Serial.println("-------------------------");
}
void scanData() {
Serial.println("=== SCAN DATA MICROSD ===");
dataFile = SD.open("data.csv");
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
} else {
Serial.println("Gagal membaca data!");
}
Serial.println("\n=== END DATA ===");
}