#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6BiUCZTjt"
#define BLYNK_TEMPLATE_NAME "Kontrol 4 Buah Relay"
#define BLYNK_AUTH_TOKEN "ht0vvGZ6o5gh4BKf5ANFwQK4TWtjnkH"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

#define relay1 23
#define relay2 22
#define relay3 21
#define relay4 19
int data;
int data1;
int data2;
int data3;
int data4;

String a;
String b;
String c;
String d;

BLYNK_WRITE(V0)
{
  data = param.asInt();
  if(data == 1){      
    digitalWrite (relay1, HIGH);          
    Blynk.virtualWrite(V4, 1);
    a = "Relay 1 ON";
  }
  else{             
    digitalWrite (relay1, LOW);    
    Blynk.virtualWrite(V4, 0);
     a = "Relay 1 OFF";
  }
}

BLYNK_WRITE(V1)
{
  data1 = param.asInt();
  if(data1 == 1){      
    digitalWrite (relay2, HIGH);          
    Blynk.virtualWrite(V5, 1);
     b = "Relay 2 ON";
  }
  else{             
    digitalWrite (relay2, LOW);    
    Blynk.virtualWrite(V5, 0);
    b = "Relay 2 OFF";
  }
}

BLYNK_WRITE(V2)
{
  data2 = param.asInt();
  if(data2 == 1){      
    digitalWrite (relay3, HIGH);          
    Blynk.virtualWrite(V6, 1);
    c = "Relay 3 ON";
  }
  else{             
    digitalWrite (relay3, LOW);    
    Blynk.virtualWrite(V6, 0);
    c = "Relay 3 OFF";
  }
}

BLYNK_WRITE(V3)
{
  data3 = param.asInt();
  if(data3 == 1){      
    digitalWrite (relay4, HIGH);          
    Blynk.virtualWrite(V7, 1);
    d = "Relay 4 ON";
  }
  else{             
    digitalWrite (relay4, LOW);    
    Blynk.virtualWrite(V7, 0);
    d = "Relay 4 OFF";
  }
}

BLYNK_WRITE(V9)
{
  data4 = param.asInt();
  if(data4 == 1){      
    digitalWrite (relay1, LOW);
    digitalWrite (relay2, LOW);
    digitalWrite (relay3, LOW);
    digitalWrite (relay4, LOW);  
    delay (100);
    Blynk.virtualWrite(V0, 0);
    Blynk.virtualWrite(V1, 0);
    Blynk.virtualWrite(V2, 0);
    Blynk.virtualWrite(V3, 0);
    Blynk.virtualWrite(V4, 0);
    Blynk.virtualWrite(V5, 0);
    Blynk.virtualWrite(V6, 0);
    Blynk.virtualWrite(V7, 0);
    Blynk.virtualWrite(V8, 0);
    Blynk.virtualWrite(V9, 0);
    Blynk.virtualWrite(V7, 0);
    a = "Relay 1 OFF";
    b = "Relay 2 OFF";
    c = "Relay 3 OFF";
    d = "Relay 4 Off";
  }
}

void setup() {
  // put your setup code here, to run once:
  pinMode (relay1, OUTPUT);
  pinMode (relay2, OUTPUT);
  pinMode (relay3, OUTPUT);
  pinMode (relay4, OUTPUT);  
  Blynk.begin(auth, ssid, pass);
  Blynk.virtualWrite(V0, 0);
  Blynk.virtualWrite(V1, 0);
  Blynk.virtualWrite(V2, 0);
  Blynk.virtualWrite(V3, 0);
  Blynk.virtualWrite(V4, 0);
  Blynk.virtualWrite(V5, 0);
  Blynk.virtualWrite(V6, 0);
  Blynk.virtualWrite(V7, 0);
  Blynk.virtualWrite(V8, 0);
  Blynk.virtualWrite(V9, 0);
}

void loop() {
  Blynk.run();  
  Blynk.virtualWrite(V8, a, ", ", b, ", ", c, ", ", d);
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay2:VCC
relay2:GND
relay2:IN
relay2:NC
relay2:COM
relay2:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay3:VCC
relay3:GND
relay3:IN
relay3:NC
relay3:COM
relay3:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay4:VCC
relay4:GND
relay4:IN
relay4:NC
relay4:COM
relay4:NO
vcc1:VCC
gnd1:GND