#include <OneWire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHTesp.h>
#include <ESP32Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
// Inisialisasi layar OLED dengan ukuran 128x32 dan pin reset -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DHT_PIN 15 // Pin digital untuk sensor DHT22
#define MOISTURE_PIN 34 // Pin analog untuk sensor kelembaban tanah
#define POT_PIN 35 // Pin analog untuk potensiometer
#define ULTRASONIC_TRIGGER_PIN 4 // Pin digital untuk trigger sensor ultrasonik
#define ULTRASONIC_ECHO_PIN 5 // Pin digital untuk echo sensor ultrasonik
#define SERVO_PIN 26 // Pin digital untuk motor servo untuk mengontrol aliran air ke tanaman
#define RELAY_PIN 27 // Pin digital untuk relay yang mengontrol pompa air
// Inisialisasi sensor DHT22, sensor kelembaban tanah, sensor ultrasonik, motor servo, dan relay
DHTesp dhtSensor;
Servo servo;
int relayState = LOW;
void setup() {
Serial.begin(9600); // Mulai serial monitor
pinMode(SERVO_PIN, OUTPUT); // Konfigurasikan pin servo motor ke output
pinMode(RELAY_PIN, OUTPUT); // Konfigurasikan pin relay ke output
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Mulai layar OLED
display.clearDisplay(); // Bersihkan layar OLED
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Konfigurasikan sensor DHT22
servo.attach(SERVO_PIN); // Sambungkan motor servo ke pin digital
digitalWrite(RELAY_PIN, relayState); // Matikan pompa air pada awalnya
}
void loop() {
// Baca suhu dari sensor DHT22 dan tampilkan di serial monitor
float temperature = dhtSensor.getTemperature();
Serial.print("Suhu : ");
Serial.print(temperature);
Serial.println("*C");
// Baca kelembaban dari sensor DHT22 dan tampilkan di serial monitor
float humidity = dhtSensor.getHumidity();
Serial.print("Kelembapan : ");
Serial.print(humidity);
Serial.println("%");
// Baca nilai kelembaban tanah dan nilai potensiometer
int moisture = analogRead(MOISTURE_PIN);
int brightness = map(analogRead(POT_PIN), 0, 4095, 0, 255);
Serial.print("Kelembaban Tanah: ");
Serial.print(moisture);
Serial.println("/4095");
Serial.print("Kecerahan: ");
Serial.print(brightness);
Serial.println("/255");
// Baca nilai sensor ultrasonik untuk mendapatkan sisa tingkat air di tangki
long duration, distance;
pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT);
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
// Mengukur waktu respons echo dari sensor ultrasonik
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
// Menghitung jarak berdasarkan waktu respons echo
distance = duration * 0.034 / 2;
Serial.print("Tinggi air di tangki: ");
Serial.print(distance);
Serial.println(" cm");
// Kontrol motor servo untuk mengalirkan air ke tanaman berdasarkan kelembaban tanah dan tingkat air di tangki
if (distance < 10) {
servo.write(0);
delay(3000);
servo.write(90);
}
/*
// Atur posisi motor servo untuk mengontrol aliran air ke tanaman
int servoPosition = map(moisture, 0, 4095, 0, 180);
servo.write(servoPosition);
*/
// Kontrol relay untuk menyalakan atau mematikan pompa air berdasarkan kelembaban tanah dan tingkat air di tangki
if (moisture < 2000) {
relayState = HIGH;
digitalWrite(RELAY_PIN, relayState);
} else if (moisture > 2000 || distance < 10) {
relayState = LOW;
digitalWrite(RELAY_PIN, relayState);
}
// Tampilkan data pada layar OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Suhu: ");
display.print(temperature);
display.print(" C");
display.setCursor(0,10);
display.print("Kelembapan: ");
display.print(humidity);
display.print(" %");
display.setCursor(0,20);
display.print("Kelembaban Tanah: ");
display.print(moisture/40.95);
display.print("%");
display.setCursor(80,20);
display.print("Kecerahan: ");
display.print(brightness);
display.print("/255");
display.display();
// Tunggu 2 detik sebelum membaca data kembali
Serial.println(" ");
delay(2000);
}