#define BLYNK_TEMPLATE_ID "TMPL6Zh4l2vJF"
#define BLYNK_DEVICE_NAME "Jemuran Otomatis"
char auth[] = "itAg3EaAtR6RzXAwvzqY885yY8FBQefK";
char ssid[] = "Wokwi-GUEST";          // masukan nama WiFi
char pass[] = ""; // pass wifi
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
#include "DHT.h"

#define SERVO_PIN 32 // ESP32 pin GIOP26 connected to servo motor
#define DHTPIN 33
const int ldrpin = 35;
#define DHTTYPE DHT22

BlynkTimer timer;
Servo servo;
DHT dht(DHTPIN, DHTTYPE);
boolean notif_buka = true;
boolean notif_tutup = true;
boolean auto_mode = true;

int derajat_tutup = 0; //For Derajat tutup servo
int derajat_buka = 180; //for derajar buka servo

void setup() {
  Serial.begin(115200);
  servo.attach(SERVO_PIN);  // attaches the servo on ESP32 pin
  servo.write(derajat_tutup);
  dht.begin();
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(1000L, postData);
  Blynk.virtualWrite(V3, 1);
}

void loop() {
  Blynk.run();
  timer.run();
}

void postData() {
  int temp = dht.readTemperature();
  int cahaya = analogRead(ldrpin);
  cahaya = map(cahaya, 0, 4095, 100, 0);
  Serial.println("TEMP = " + String(temp));
  Serial.println("Intensitas Cahaya = " + String(cahaya) + "%");
  Blynk.virtualWrite(V1, cahaya);
  Blynk.virtualWrite(V2, temp);

  if (auto_mode) {
    //mode auto
    if (temp > 25 && cahaya > 30) {
      servo.write(derajat_buka); //kondisi cerah
      Blynk.virtualWrite(V4, 1);
      Blynk.virtualWrite(V0, "TERBUKA");
      if (notif_buka) {
        Blynk.logEvent("notif", "Perhatian, atap kondisi terbuka !!");
        notif_buka = false;
        notif_tutup = true;
      }
    } else if (temp < 25 && cahaya < 30) {
      servo.write(derajat_tutup); // kondisi mendung atau malam
      Blynk.virtualWrite(V4, 0);
      Blynk.virtualWrite(V0, "TERTUTUP");
      if (notif_tutup) {
        Blynk.logEvent("notif", "Perhatian, atap kondisi tertutup !!");
        notif_buka = true;
        notif_tutup = false;
      }
    }
  }

}

BLYNK_WRITE(V3) {
  int mode = param.asInt();
  if (mode == 0) {
    auto_mode = false;
  } else {
    auto_mode = true;
  }
  Serial.println("MODE KONTROL = " + String(auto_mode));
}

BLYNK_WRITE(V4) {

  int kontrol_atap = param.asInt();
  if (!auto_mode) {
    if (kontrol_atap == 0) {
      servo.write(derajat_tutup); //tutup atap manual
      Blynk.virtualWrite(V0, "TERTUTUP");
    } else {
      servo.write(derajat_buka); // buka atap manual
      Blynk.virtualWrite(V0, "TERBUKA");
    }
  }
}