#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6fb5vvgUh"
#define BLYNK_TEMPLATE_NAME "Sistem Pembersih dan Pendingin Panel Surya"
#define BLYNK_AUTH_TOKEN "YmL_ph4-yQD1-kO7lyzUbHKFv2_GJM3N"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>;
#define DHTPIN 15     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

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

const float GAMMA = 0.7;
const float RL10 = 50;

#define relay1 23 // lAMPU 1
#define relay2 22  // LAMPU 2
#define relay3 21 // STOP KONTAK 1
#define relay4 19 // STOP KONTAK 2
#define pembersih_cw 5 // PEMBERSIH CW
#define pembersih_ccw 4 // PEMBERSIH CCW
#define pendinginan 2 // PENDINGIN
#define limit_cw 12
#define limit_ccw 32

float temp;
int data;
int data1;
int data2;
int data3;
int data4;
float arus;
/*
String a;
String b;
String c;
String d;*/

int tegangan;
int data_tegangan;
int cahaya;
float voltage;
float resistance;
float lux;


BLYNK_WRITE(V4)
{
  data = param.asInt();
  if(data == 1){      
    digitalWrite (relay1, HIGH); 
  }
  else{             
    digitalWrite (relay1, LOW); 
  }
}

BLYNK_WRITE(V5)
{
  data1 = param.asInt();
  if(data1 == 1){      
    digitalWrite (relay2, HIGH);  
  }
  else{             
    digitalWrite (relay2, LOW);  
  }
}

BLYNK_WRITE(V6)
{
  data2 = param.asInt();
  if(data2 == 1){      
    digitalWrite (relay3, HIGH); 
  }
  else{             
    digitalWrite (relay3, LOW); 
  }
}

BLYNK_WRITE(V7)
{
  data3 = param.asInt();
  if(data3 == 1){      
    digitalWrite (relay4, HIGH); 
  }
  else{             
    digitalWrite (relay4, LOW);
  }
}

void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:  
  pinMode (relay1, OUTPUT);
  pinMode (relay2, OUTPUT);
  pinMode (relay3, OUTPUT);
  pinMode (relay4, OUTPUT); 
  pinMode (pembersih_cw, OUTPUT);
  pinMode (pembersih_ccw, OUTPUT);
  pinMode (pendinginan, OUTPUT);
  pinMode (limit_cw, INPUT);
  pinMode (limit_ccw, INPUT);

  Blynk.virtualWrite(V4, 0);
  Blynk.virtualWrite(V5, 0);
  Blynk.virtualWrite(V6, 0);
  Blynk.virtualWrite(V7, 0);
  digitalWrite (relay1, LOW);
  digitalWrite (relay2, LOW);
  digitalWrite (relay3, LOW);
  digitalWrite (relay4, LOW);
  digitalWrite (pembersih_cw, LOW);
  digitalWrite (pembersih_ccw, LOW);
  digitalWrite (pendinginan, LOW);
  dht.begin();
  Blynk.begin(auth, ssid, pass);
}

void loop() {  
  tegangan = analogRead (36);
  int analogValue = analogRead (34);
  data_tegangan = map (tegangan, 0, 1023, 0, 50);
  Serial.println("Tegangan : "+ String(data_tegangan));
    if (data_tegangan < 15 ){
      // Bagian Pembacaan sensor LDR      
      voltage = float(analogValue) / 4095.0 * 5.0;
      resistance = 2000.0 * voltage / (1.0 - voltage / 5.0);
      lux = pow(RL10 * 1e3 * pow(10.0, GAMMA) / resistance, (1.0 / GAMMA));
      if (lux > 400){
        Serial.println("Cahaya : "+ String(lux));
        temp = dht.readTemperature();  
        Serial.println("Temp: " + String(temp) + "°C");  
        if (temp >= 50){          
          digitalWrite (pendinginan, HIGH); // Pendinginan Panel
          digitalWrite (pembersih_ccw, LOW);
          digitalWrite (pembersih_cw, LOW);
          Blynk.virtualWrite(V3, "Panel Cooling Process");
          Blynk.logEvent("cooling_panel_process");
          delay(100);
        }
        else{
          Serial.println("Pembersihan Panel");
          Blynk.virtualWrite(V3, "Panel Cleaning Process");
          Blynk.logEvent("panel_cleaning_process");
          digitalWrite (pendinginan, LOW);
          int val = digitalRead (limit_cw);
          delay(100);
          int val1 = digitalRead (limit_ccw);
          Serial.println(val);
          delay(100);

          // Motor CW
          if (val == HIGH){
          Serial.println("Motor CW ON");
          digitalWrite (pembersih_cw, HIGH);
          digitalWrite (pembersih_ccw, LOW);
          }
          
          // Motor CCW
          if (val1 == LOW){
          Serial.println("Motor CCW ON");
          digitalWrite (pembersih_cw, LOW);
          digitalWrite (pembersih_ccw, HIGH);
          }          
        }      
      }else{
        digitalWrite (pembersih_cw, LOW);
        digitalWrite (pembersih_ccw, LOW);
        digitalWrite (pendinginan, LOW);
        Blynk.virtualWrite(V3, "Normal Panel Temperature and Cleanliness");        
      }  
    }else{
      digitalWrite (pembersih_cw, LOW);
      digitalWrite (pembersih_ccw, LOW);
      digitalWrite (pendinginan, LOW);
      Blynk.virtualWrite(V3, "Normal Panel Temperature and Cleanliness");
    }
    
float nilai_arus = analogRead (33);
arus = map (nilai_arus, 0, 1023, 0, 5);
float power = 220 * arus;
int i = i + power;  
float Energy = ((1.0/3600) * i);
Serial.println ("Arus : "+String(arus));
Serial.println ("Energy : "+String(Energy));
Blynk.virtualWrite(V1, data_tegangan);
Blynk.virtualWrite(V0, arus);
Blynk.virtualWrite(V2, "Power : "+String(power)+" watt; " +" Energy : "+String(Energy)+" kWh");
Blynk.run();
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module