#define BLYNK_TEMPLATE_ID "TMPL6YRpK37VV"
#define BLYNK_TEMPLATE_NAME "SmartHomeIOT"
#define BLYNK_AUTH_TOKEN "UGQ68tZXyQkg6jbwur8_tFrDE8hMhaOo"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include "DHTesp.h"
#include <RTClib.h>
#include <ESP32Servo.h>

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

#define I2C_ADDR    0x27
#define LCD_COLUMNS 20
#define LCD_LINES   4
#define DHT_PIN     19
#define AC_RELAY_PIN   2
#define SERVO_PIN   13
#define LDR_PIN     34
#define LED_PIN     25

DHTesp dhtSensor;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
RTC_DS1307 rtc;
Servo myServo;
BlynkTimer timer;

bool isDoorClosed = false;

BLYNK_WRITE(V1) {
  TempAndHumidity data = dhtSensor.getTempAndHumidity();
  Blynk.virtualWrite(V1, data.temperature);
}

BLYNK_WRITE(V2) {
  int ldrValue = analogRead(LDR_PIN);
  int normalizedLDR = map(ldrValue, 0, 4095, 0, 100);
  Blynk.virtualWrite(V2, normalizedLDR);
}

BLYNK_WRITE(V3) {
  int pinValue = param.asInt();
  analogWrite(LED_PIN, pinValue);
}

BLYNK_WRITE(V4) {
  int servoValue = param.asInt();

  if (servoValue == 0) {
    // Switch off, buka pintu
    myServo.write(90);
    isDoorClosed = false;
  } else {
    // Switch on, tutup pintu
    myServo.write(180);
    isDoorClosed = true;
  }

  Serial.print("Status kunci Pintu: ");
  Serial.println(isDoorClosed ? "Terkunci" : "Terbuka");
}

BLYNK_WRITE(V5) {
  int relayValue = param.asInt();
  digitalWrite(AC_RELAY_PIN, relayValue);
}

void sendSensorData() {
  TempAndHumidity data = dhtSensor.getTempAndHumidity();
  Blynk.virtualWrite(V1, data.temperature);
}

void readLDR() {
  int ldrValue = analogRead(LDR_PIN);
  int normalizedLDR = map(ldrValue, 0, 4095, 0, 100);
  Blynk.virtualWrite(V2, normalizedLDR);
}

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);

  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  lcd.init();
  lcd.backlight();

  Wire.begin();
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  myServo.attach(SERVO_PIN);
  myServo.write(90);
  isDoorClosed = false;

  pinMode(AC_RELAY_PIN, OUTPUT);
  digitalWrite(AC_RELAY_PIN, LOW);

  pinMode(LDR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  timer.setInterval(100L, sendSensorData);
  timer.setInterval(1000L, readLDR);
}

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

  DateTime now = rtc.now();
  TempAndHumidity data = dhtSensor.getTempAndHumidity();

  lcd.setCursor(0, 0);
  lcd.print("AC: ");
  lcd.print(digitalRead(AC_RELAY_PIN) ? "Hidup" : "Mati");
  lcd.print("   ");

  lcd.setCursor(0, 1);
  lcd.print("Suhu Ruangan: " + String(data.temperature, 1) + "\xDF"+"C  ");

  lcd.setCursor(0, 2);
  lcd.print("Kelembapan  : " + String(data.humidity, 1) + "% ");

  lcd.setCursor(0, 3);
  lcd.print("Waktu : " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()));

  delay(1000);
}
NOCOMNCVCCGNDINLED1PWRRelay Module
GND5VSDASCLSQWRTCDS1307+