#define BLYNK_TEMPLATE_NAME "Irman Project 1700"
#define BLYNK_AUTH_TOKEN "ZJEWKX5sSD-95b1sV9XnIo30xRp6k2-P"
#define BLYNK_TEMPLATE_ID "TMPL6aKi0WSQH"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Kredensial WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Konfigurasi DHT
#define DHTPIN 23
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
// Konfigurasi Pin
#define SOIL_MOISTURE_PIN 34
#define RELAY_PIN 15
#define BUZZER_PIN 27
// Variabel Pompa
bool pumpStatus = false;
void connectToWiFi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(ssid, pass);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Terhubung!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nGagal terhubung ke WiFi. Periksa SSID/Password.");
while (true);
}
}
void setup() {
Serial.begin(115200);
// Inisialisasi WiFi
connectToWiFi();
// Inisialisasi Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Inisialisasi DHT
dht.begin();
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("Gagal menginisialisasi OLED"));
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Sistem Irigasi"));
display.println(F("Memulai..."));
display.display();
delay(2000);
// Inisialisasi pin
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Pompa dimatikan awal
}
void loop() {
Blynk.run();
// Membaca data sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int soilMoistureRaw = analogRead(SOIL_MOISTURE_PIN);
float soilMoisturePercent = map(soilMoistureRaw, 4095, 0, 0, 100);
// Logika kontrol pompa dan buzzer
if (soilMoisturePercent < 50) { // Jika kelembapan tanah kurang dari 50%
digitalWrite(RELAY_PIN, HIGH); // Pompa dinyalakan
pumpStatus = true;
tone(BUZZER_PIN, 1000); // Buzzer berbunyi (frekuensi 1000 Hz)
delay(500);
noTone(BUZZER_PIN);
} else { // Jika kelembapan tanah cukup
digitalWrite(RELAY_PIN, LOW); // Pompa dimatikan
pumpStatus = false;
noTone(BUZZER_PIN);
}
// Menampilkan data di OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print(F("Suhu: "));
display.print(temperature);
display.println(F(" C"));
display.print(F("Kelembapan: "));
display.print(humidity);
display.println(F(" %"));
display.print(F("Tanah: "));
display.print(soilMoisturePercent);
display.println(F(" %"));
display.print(F("Pompa: "));
display.println(pumpStatus ? "ON" : "OFF");
display.display();
// Menampilkan data di Serial Monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.print("°C, Kelembapan Udara: ");
Serial.print(humidity);
Serial.print("%, Kelembapan Tanah: ");
Serial.print(soilMoisturePercent);
Serial.print("%, Pompa: ");
Serial.println(pumpStatus ? "ON" : "OFF");
// Mengirim data ke Blynk
Blynk.virtualWrite(V1, temperature); // Suhu
Blynk.virtualWrite(V2, humidity); // Kelembapan Udara
Blynk.virtualWrite(V3, soilMoisturePercent); // Kelembapan Tanah
Blynk.virtualWrite(V4, pumpStatus); // Status Pompa (ON/OFF)
delay(3000); // Tunggu 3 detik
}