#define BLYNK_TEMPLATE_ID //id blynk
#define BLYNK_TEMPLATE_NAME //Template nama blynk
#define BLYNK_AUTH_TOKEN //Token Blynk
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//Pin Serial Menentukan Sensor DHT 22 Pada ESP32
#define DHTPIN 26 // What digital pin we're connected to
#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321
DHT dht(DHTPIN, DHTTYPE);
#define TRIG_A_PIN 15 // TRIG pin ultrasonic sensor A
#define ECHO_A_PIN 2 // ECHO pin
#define LED_A 4
#define TRIG_B_PIN 18 // TRIG pin ultrasonic sensor B
#define ECHO_B_PIN 19 // ECHO pin
#define LED_B 5
float duration_a, distance_a, limit_a; // ultrasonic sensor A
float duration_b, distance_b, limit_b;// ultrasonic sensor B
// conter of repeats getting initial distance values
int counter_a, counter_b,counter_max;
//PIN VARIABEL SOIL MOSITURE KEBUN 1 & KEBUN 2
const int SoilMoisture1 = 13;
const int SoilMoisture2 = 12;
const int SoilMoisture3 = 14;
const int SoilMoisture4 = 27;
BlynkTimer timer;
#define RELAY_1 35
#define RELAY_2 32
int Data ;
int Data1 ;
int Data2 ;
void sendSensor() {
// Mengirim Data Sensor Suhu DHT 22 Ke Monitoring Blynk
float Humidity = dht.readHumidity();
float Temperature = dht.readTemperature();
if (isnan(Humidity) || isnan(Temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V0, Humidity);
Blynk.virtualWrite(V1, Temperature);
//VIRTUAL PIN VARIABEL SOIL MOISTURE 1,2,3,DAN 4
int moisture1 = map(SoilMoisture1, 0,1023,100,0);
int moisture2 = map(SoilMoisture2, 0,1023,100,0);
int moisture3 = map(SoilMoisture3, 0,1023,100,0);
int moisture4 = map(SoilMoisture4, 0,1023,100,0);
int analogValue1 = analogRead(SoilMoisture1);
int analogValue2 = analogRead(SoilMoisture2);
int analogValue3 = analogRead(SoilMoisture3);
int analogValue4 = analogRead(SoilMoisture4);
Blynk.virtualWrite(V4,moisture1);
Blynk.virtualWrite(V5,moisture2);
Blynk.virtualWrite(V6,moisture3);
Blynk.virtualWrite(V7,moisture4);
Serial.print("Moisture in soil1: ");
Serial.println(moisture1);
Serial.print("Moisture in soil2: ");
Serial.println(moisture2);
Serial.print("Moisture in soil3: ");
Serial.println(moisture3);
Serial.print("Moisture in soil4: ");
Serial.println(moisture4);
delay(1000);
}
//KONTROL MANUAL SWITH APP BLYNK
BLYNK_WRITE(V8){
Data = param.asInt();
if (Data == 1){
digitalWrite(RELAY_1, HIGH);
Serial.println("RELAY 1 AKTIF");
Blynk.virtualWrite(V8, HIGH);
} else{
digitalWrite(RELAY_1, LOW);
Serial.println("RELAY 1 MATI");
Blynk.virtualWrite(V8, LOW);
}
}
BLYNK_WRITE(V9){
Data1 = param.asInt();
if (Data1 == 1){
digitalWrite(RELAY_2, HIGH);
Serial.println("RELAY 2 AKTIF");
Blynk.virtualWrite(V9, HIGH);
} else{
digitalWrite(RELAY_2, LOW);
Serial.println("RELAY 2 MATI");
Blynk.virtualWrite(V9, LOW);
}
}
void setup()
{
// Konfirmasi Data Serial Ke Dalam Variabel
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
LCD.init();
LCD.backlight();
dht.begin();
// configure the trigger pin to output mode
pinMode(TRIG_A_PIN, OUTPUT);
// configure the echo pin to input mode
pinMode(ECHO_A_PIN, INPUT);
// configure the trigger pin to output mode
pinMode(TRIG_B_PIN, OUTPUT);
// configure the echo pin to input mode
pinMode(ECHO_B_PIN, INPUT);
// a = red b = green led
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
counter_a=0;
counter_b=0;
//distance to compare measured value -> lower value puts led on
limit_a=limit_b=30;
counter_max=2;
pinMode(SoilMoisture1, INPUT);
pinMode(SoilMoisture2, INPUT);
pinMode(SoilMoisture3, INPUT);
pinMode(SoilMoisture4, INPUT);
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
timer.setInterval(1000L, sendSensor);
}
void loop()
{
Blynk.run();
timer.run(); // Real Time Set Data
// generate 10-microsecond pulse to TRIG pin
digitalWrite(TRIG_A_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_A_PIN, LOW);
// measure duration of pulse from ECHO pin
duration_a = pulseIn(ECHO_A_PIN, HIGH);
// generate 10-microsecond pulse to TRIG pin
digitalWrite(TRIG_B_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_B_PIN, LOW);
// measure duration of pulse from ECHO pin
duration_b = pulseIn(ECHO_B_PIN, HIGH);
// calculate the distance
distance_a = 0.017 * duration_a;
distance_b = 0.017 * duration_b;
// check if several A values are below limit and remove counter in limits 0...counter_max
if (distance_a < limit_a ) {
++counter_a;
// flash led to tell if distance A is below limit
FlashLed(LED_A);
if (counter_a >counter_max) {counter_a = counter_max;}
} else {
--counter_a;
if (counter_a<0) {counter_a=0;}
}
// check if several B values are below limit and remove counter in limits 0...10
if (distance_b < limit_b ) {
++counter_b;
// flash led to tell if distance B is below limit
FlashLed(LED_B);
if (counter_b >counter_max) {counter_b = counter_max;}
} else {
--counter_b;
if (counter_b<0) {counter_b=0;}
}
// check which side turtle is and lit the led on thst side
if (counter_a==counter_max or counter_b==counter_max){
if (counter_a>counter_b) {
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
}
if (counter_a<counter_b) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
}
}
// print the value to Serial Monitor
Serial.print(counter_a);
Serial.print("-distanceA: ");
Serial.print(distance_a);
Serial.print(" cm ");
Serial.print(counter_b);
Serial.print("-distanceB: ");
Serial.print(distance_b);
Serial.println(" cm ");
delay(1000);
Blynk.virtualWrite(V2,distance_a);
Blynk.virtualWrite(V3,distance_b);
}
//SUBROUTINES-SUBROUTINE-SUBROUTINES-SUBROUTINES-SUBROUTINES
// flash led to tell if distance is under limit
void FlashLed(int x){
if (digitalRead(x) == LOW) {
digitalWrite(x, HIGH);
delay(1);
digitalWrite(x, LOW);
}
// UNflash led to tell if distance B is under limit
if (digitalRead(x) == HIGH) {
digitalWrite(x, LOW);
delay(20);
digitalWrite(x, HIGH);
}
}