// ======== Konfigurasi Blynk Template dan Token ========
#define BLYNK_TEMPLATE_ID "TMPL69WwMQnFq" // ID template dari Blynk Cloud
#define BLYNK_TEMPLATE_NAME "Penyiraman Tanaman Otomatis" // Nama project Blynk
#define BLYNK_AUTH_TOKEN "U4GKrgn8zCgxJgJm1kdhJMWPrJxbjpHU" // Token autentikasi perangkat
// ======== Import Library yang Dibutuhkan ========
#include <Wire.h> // Komunikasi I2C (untuk LCD)
#include "LiquidCrystal_I2C.h" // Library untuk LCD I2C
#include "DHT.h" // Library sensor suhu & kelembaban DHT
#include <ESP32Servo.h> // Library kontrol servo pada ESP32
#include <WiFi.h> // Koneksi WiFi ESP32
#include <BlynkSimpleEsp32.h> // Blynk library khusus ESP32
// ======== Konfigurasi PIN =========
const int servoPin = 18; // Pin untuk servo motor
const int ledPin = 14; // Pin LED indikator
#define DHT_PIN 15 // Pin data untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT yang digunakan
#define buzzerPin 12 // Pin untuk buzzer
// ======== Objek Sensor dan Aktuator =========
DHT dht(DHT_PIN, DHT22); // Inisialisasi objek DHT22
LiquidCrystal_I2C lcd(0x27, 20, 4); // Inisialisasi LCD I2C alamat 0x27, ukuran 20x4
Servo servo; // Objek untuk kontrol servo motor
// ======== Data WiFi & Blynk =========
char auth[] = BLYNK_AUTH_TOKEN; // Token Blynk
char ssid[] = "Wokwi-GUEST"; // Nama WiFi (SSID)
char pass[] = ""; // Password WiFi (kosong untuk Wokwi)
// ======== Konfigurasi Sensor FC-28 =========
#include "FC28.h" // Library sensor kelembaban tanah FC-28
#define SensorFC28_Pin 34 // Pin ADC untuk sensor FC-28
float soil_moisture; // Variabel untuk menyimpan kelembaban tanah
FC28Sensor mySensor; // Inisialisasi objek sensor FC-28
// ======== Blynk Widget LED =========
WidgetLED blynkLed(V7); // Virtual LED di Blynk (V7)
void setup() {
Serial.begin(9600); // Memulai komunikasi Serial
mySensor.initFC28Sensor(115200, SensorFC28_Pin); // Inisialisasi sensor FC-28
servo.attach(servoPin); // Menghubungkan servo ke pin
pinMode(ledPin, OUTPUT); // Menentukan LED sebagai output
pinMode(buzzerPin, OUTPUT); // Menentukan buzzer sebagai output
// ===== Koneksi WiFi dan Blynk =====
WiFi.begin(ssid, pass); // Mulai koneksi WiFi
Blynk.begin(auth, ssid, pass); // Mulai koneksi ke Blynk Cloud
// ===== Inisialisasi Sensor & LCD =====
dht.begin(); // Mulai sensor DHT
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Menyalakan backlight LCD
// ===== Tampilan awal LCD =====
lcd.setCursor(2,0); lcd.print("Smart Farming"); // Baris 1
lcd.setCursor(0,1); lcd.print("Penyiraman Otomatis"); // Baris 2
delay(3000); // Tunda 3 detik
lcd.clear(); // Bersihkan tampilan
}
void loop() {
Blynk.run(); // Wajib dijalankan di loop untuk Blynk
// ======== Baca sensor DHT22 ========
float hum = dht.readHumidity(); // Membaca kelembaban udara
float temp = dht.readTemperature(); // Membaca suhu udara
// ======== Baca sensor FC-28 (Kelembaban Tanah) ========
soil_moisture = mySensor.getSoilMoisture(); // Membaca nilai kelembaban tanah
// ======== Tentukan Status Tanah Berdasarkan Nilai Moisture ========
String msg = soil_moisture < 22.22 ? "Basah" :
soil_moisture > 33.33 ? "Kering" : "Normal";
// ======== Kontrol Aktuator Berdasarkan Status Tanah ========
if (msg == "Kering") {
servo.write(180); // Buka keran (servo)
digitalWrite(ledPin, HIGH); // Nyalakan LED
digitalWrite(buzzerPin, HIGH); // Aktifkan buzzer
blynkLed.on(); // Nyalakan LED Virtual di Blynk
tone(buzzerPin, 1000); // Bunyikan buzzer (frekuensi 1000 Hz)
}
else if (msg == "Normal") {
servo.write(0); // Tutup keran (servo)
digitalWrite(ledPin, LOW); // Matikan LED
digitalWrite(buzzerPin, LOW); // Matikan buzzer
blynkLed.on(); // LED virtual tetap menyala
noTone(buzzerPin); // Nonaktifkan tone buzzer
}
else if (msg == "Basah") {
servo.write(0); // Tutup keran
digitalWrite(ledPin, LOW); // Matikan LED
digitalWrite(buzzerPin, LOW); // Matikan buzzer
blynkLed.on(); // LED virtual tetap menyala
noTone(buzzerPin); // Nonaktifkan buzzer
}
// ======== Kirim Data ke Aplikasi Blynk ========
Blynk.virtualWrite(V0, soil_moisture); // Kirim kelembaban tanah ke V0
Blynk.virtualWrite(V1, temp); // Kirim suhu ke V1
Blynk.virtualWrite(V2, hum); // Kirim kelembaban udara ke V2
Blynk.virtualWrite(V6, msg); // Kirim status tanah ke V6
// ======== Tampilkan Data ke LCD ========
lcd.setCursor(0,0); lcd.print("Tanah: "); lcd.print(msg + " "); // Status tanah
lcd.setCursor(0,1); lcd.print("Soil : "); lcd.print(soil_moisture,1); lcd.print("% "); // Kelembaban tanah
lcd.setCursor(0,2); lcd.print("Suhu : "); lcd.print(temp,1); lcd.print("C "); // Suhu udara
lcd.setCursor(0,3); lcd.print("Udara: "); lcd.print(hum,1); lcd.print("% "); // Kelembaban udara
// ======== Debug ke Serial Monitor ========
Serial.println("Soil Moisture : " + String(soil_moisture, 2) + "%"); // Cetak kelembaban tanah
Serial.println("Suhu : " + String(temp, 1) + " C"); // Cetak suhu
Serial.println("Kelembaban : " + String(hum, 1) + " %"); // Cetak kelembaban udara
Serial.println("Status Tanah : " + msg); // Cetak status tanah
Serial.println("--------------------");
delay(1000); // Delay 1 detik antar pembacaan sensor
}
// < 22.22%: Basah
// 22.22% – 33.33%: Normal
// > 33.33%: Kering → Menyiram