#define BLYNK_TEMPLATE_ID "TMPL6_9bWjnrt"
#define BLYNK_TEMPLATE_NAME "sistem soil"
#define BLYNK_AUTH_TOKEN "iyXMz2zti9BI3UU3QQ-stobGKqnRnZ7g"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define SOIL_PIN 34
#define LED_RED 2
#define LED_GREEN 4
BlynkTimer timer;
bool notifTerkirim = false; // Penanda supaya notif tidak nyepam
void checkSoil() {
int rawValue = analogRead(SOIL_PIN);
int moisturePercent = map(rawValue, 0, 4095, 0, 100);
Blynk.virtualWrite(V1, moisturePercent);
if (moisturePercent < 30) {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.print("Status: KERING! - ");
// Kirim notifikasi HANYA JIKA belum terkirim sebelumnya
if (notifTerkirim == false) {
Blynk.logEvent("tanah_kering", "Woi! Tanah kering, siram dulu!");
notifTerkirim = true; // Tandai sudah terkirim
}
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
Serial.print("Status: AMAN - ");
notifTerkirim = false; // Reset tanda kalau tanah sudah basah lagi
}
Serial.print("Kelembapan: ");
Serial.print(moisturePercent);
Serial.println("%");
}
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(SOIL_PIN, INPUT);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, checkSoil);
}
void loop() {
Blynk.run();
timer.run();
}