#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLOEcmpNMh"
#define BLYNK_DEVICE_NAME "Smart"
#define BLYNK_AUTH_TOKEN "KXn2vN4q4-iwbxZeeB_ywaNEHH75pHCo"
#define LED1 12  //Lampu
#define LED2 14  //Heater
#define LED3 13  //Nozel 
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"

const int DHT_PIN = 15;
DHTesp dhtSensor;
const float GAMMA = 0.7;
const float RL10 = 50;

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

BlynkTimer timer;

void sendSensor() { 
}

void setup()
{
  Serial.begin(115200);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  timer.setInterval(1L, sendSensor);
  Blynk.begin(auth, ssid, pass);
  
}

void loop()
{
  
  int analogValue = analogRead(36);
  float voltage = analogValue * 5/4095.0;
  float resistance = 2000 * voltage / (1 - voltage / 5);
  float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
  Serial.print("Lux: ");
  Serial.println(lux);
  Blynk.virtualWrite(V3, lux); 
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  
  TempAndHumidity  data = dhtSensor.getTempAndHumidity();
  Serial.println("Temp: " + String(data.temperature, 2) + "°C");
  Serial.println("Humidity: " + String(data.humidity, 1) + "%");
  Serial.println("---");
  Blynk.virtualWrite(V0, data.temperature); 
  Blynk.virtualWrite(V1, data.humidity);
  
  sendSensor();
  Blynk.run();
  timer.run();

  if (lux >= 60){
    Serial.print("Status: ");
    digitalWrite(LED1, LOW);
    Serial.println("Terang");
    Blynk.virtualWrite(V4, "lampu Mati");
  } 
  else {
    Serial.print("Status: ");
    digitalWrite(LED1, HIGH);
    Serial.println("Gelap");
    Blynk.virtualWrite(V4, "lampu Nyala");
    delay(100);
  }
  if (data.temperature >= 28){
    Serial.print("Status: ");
    digitalWrite(LED2, LOW);
    Serial.println("Panas");
    Blynk.virtualWrite(V5, "Heater OFF");
    delay(100);
  } 
  else {
    Serial.print("Status: ");
    digitalWrite(LED2, HIGH);
    Serial.println("Dingin");
    Blynk.virtualWrite(V5, "Heater ON");
    delay(100);
  }
  if (data.humidity >= 70){
    Serial.print("Status: ");
    digitalWrite(LED3, HIGH);
    Serial.println("Lembab");
    Blynk.virtualWrite(V6, "Kipas ON");
  } 
  else {
    Serial.print("Status: ");
    digitalWrite(LED3, LOW);
    Serial.println("Kering");
    Blynk.virtualWrite(V6, "Kipas OFF");
  }
}