#define BLYNK_TEMPLATE_ID "TMPL6AD8nOnOA"
#define BLYNK_DEVICE_NAME "penyiram tanaman"
char auth[] = "pfmPpiGhVrX4h00OPE-TQp_yS-ZpaOTR";
char ssid[] = "Wokwi-GUEST"; // masukan nama WiFi
char pass[] = ""; // masukan password WiFi
const int dry = 0; //kondisi nilai ADC soil sensor tidak terpasang ke tanah
const int wet = 4095; //kondisi nilai ADC soil sensor terpasang ke tanah basah
int batas_bawah = 50;//%
int batas_atas = 75;// %
#define BLYNK_PRINT Serial
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
const int relay = 32;
const int soilPin = 35;
BlynkTimer timer;
boolean auto_mode = true;
boolean notif_on = true;
boolean notif_off = true;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH);
delay(100);
// lcd.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("PENYIRAM TANAMAN");
lcd.setCursor(4, 1);
lcd.print("OTOMATIS");
delay(2000);
Blynk.begin(auth, ssid, pass);
timer.setInterval(500L, postData);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, "OFF");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MOISTURE = ");
lcd.setCursor(0, 1);
lcd.print("POMPA = OFF");
}
void loop() {
Blynk.run();
timer.run();
}
void postData() {
int soilVal = analogRead(soilPin);
int kelembabanTanah = map(soilVal, wet, dry, 100, 0);
if (kelembabanTanah > 100) {
kelembabanTanah = 100;
} else if (kelembabanTanah < 0) {
kelembabanTanah = 0;
}
Blynk.virtualWrite(V0, kelembabanTanah);
lcd.setCursor(11, 0);
lcd.print(kelembabanTanah);
lcd.print("%");
lcd.print(" ");
Serial.println("SOIL ADC = " + String(soilVal));
Serial.println("SOIL MOISTURE = " + String(kelembabanTanah) + "%");
if (auto_mode) {
if (kelembabanTanah > batas_atas) {
digitalWrite(relay, HIGH);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, "OFF");
lcd.setCursor(8, 1);
lcd.print("OFF");
if (notif_on) {
Blynk.logEvent("notif", "Pompa OFF Kelembaban Tanah diatas " + String(batas_atas) + "%");
notif_on = false;
notif_off = true;
}
} else if (kelembabanTanah < batas_bawah) {
digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V3, "ON");
lcd.setCursor(8, 1);
lcd.print("ON");
lcd.print(" ");
if (notif_off) {
Blynk.logEvent("notif", "Pompa ON Kelembaban Tanah dibawah " + String(batas_bawah) + "%");
notif_on = true;
notif_off = false;
}
}
}
}
BLYNK_WRITE(V1) {
int mode = param.asInt();
if (mode == 0) {
auto_mode = false;
} else {
auto_mode = true;
}
Serial.println("MODE KONTROL = " + String(auto_mode));
}
BLYNK_WRITE(V2) {
int kontrol_relay = param.asInt();
if (!auto_mode) {
if (kontrol_relay == 0) {
digitalWrite(relay, HIGH);
lcd.setCursor(8, 1);
lcd.print("OFF");
Blynk.virtualWrite(V3, "OFF");
} else {
lcd.setCursor(8, 1);
lcd.print("ON");
lcd.print(" ");
digitalWrite(relay, LOW);
Blynk.virtualWrite(V3, "ON");
}
}
}