#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);
}