#define BLYNK_PRINT Serial // Menggunakan objek Serial untuk output Blynk
#define BLYNK_TEMPLATE_ID "TMPL6PXFeaY3V" // ID template Blynk
#define BLYNK_TEMPLATE_NAME "esp32" // Nama template Blynk
#include <WiFi.h> // Library WiFi untuk ESP32
#include <WiFiClient.h> // Library WiFiClient untuk ESP32
#include <BlynkSimpleEsp32.h> // Library Blynk untuk ESP32
#include "DHTesp.h" // Library DHT untuk sensor suhu dan kelembaban
#include <ESP32Servo.h> // Library Servo untuk ESP32
Servo myservo; // Objek Servo untuk mengontrol motor servo
const float GAMMA = 0.7; // Nilai konstanta gamma untuk perhitungan cahaya
const float RL10 = 50; // Nilai resistor RL10 dalam perhitungan cahaya
#define WIFI_SSID "Wokwi-GUEST" // Nama SSID WiFi
#define WIFI_PASSWORD "" // Kata sandi WiFi
#define LDR_PIN 34 // Pin untuk sensor LDR
const int DHT_PIN = 15; // Pin untuk sensor DHT22
int led = 0; // Variabel untuk status LED
int switchStatus = 0; // Variabel untuk menyimpan status switch
DHTesp dhtSensor; // Objek sensor suhu dan kelembaban
char auth[] = "7sclIMIZEvEI_N80M_hElmjcn7tB4sMh"; // Token otentikasi Blynk
char ssid[] = WIFI_SSID; // Nama SSID WiFi
char pass[] = WIFI_PASSWORD; // Kata sandi WiFi
BlynkTimer timer; // Objek timer untuk jadwal pengiriman data
float lux; // Variabel untuk menyimpan nilai cahaya
TempAndHumidity data; // Objek untuk menyimpan data suhu dan kelembaban
BLYNK_WRITE(V4)
{
int pinValue = param.asInt(); // Mendapatkan nilai dari widget Blynk
digitalWrite(2, pinValue); // Mengontrol LED berdasarkan nilai widget Blynk
}
BLYNK_WRITE(V5)
{
switchStatus = param.asInt(); // Mendapatkan nilai dari switch di Blynk
controlSwitch(); // Memanggil fungsi untuk mengatur LED dan Servo
Blynk.virtualWrite(V6, switchStatus); // Mengirim status switch ke Blynk
}
void controlSwitch() {
if (switchStatus == 1) {
myservo.write(0); // Menutup servo (0 derajat) jika switch diaktifkan
digitalWrite(2, LOW); // Mematikan LED
led = 0;
} else {
// Mengontrol servo dan LED berdasarkan kondisi
if (lux >= 10000 && lux <= 30000 && data.temperature >= 24 && data.temperature <= 29) {
myservo.write(90); // Membuka servo (90 derajat) jika kondisi terpenuhi dan switch mati
digitalWrite(2, HIGH); // Menyalakan LED
led = 1;
} else {
myservo.write(0); // Menutup servo (0 derajat) jika kondisi tidak terpenuhi
digitalWrite(2, LOW); // Mematikan LED
led = 0;
}
}
}
void setup() {
Serial.begin(115200); // Menginisialisasi komunikasi serial
Blynk.begin(auth, ssid, pass); // Menginisialisasi Blynk dengan token otentikasi dan koneksi WiFi
pinMode(2, OUTPUT); // Mengatur pin 2 sebagai OUTPUT (digunakan untuk LED)
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Menginisialisasi sensor suhu dan kelembaban DHT22
pinMode(LDR_PIN, INPUT); // Mengatur pin LDR sebagai INPUT
myservo.attach(4); // Menghubungkan servo ke pin 4
myservo.write(0); // Mengatur posisi awal servo
timer.setInterval(1000L, sendSensorData); // Mengatur interval timer untuk fungsi sendSensorData
}
void loop() {
Blynk.run(); // Menjalankan Blynk
timer.run(); // Menjalankan timer
}
void sendSensorData() {
// Sensor LDR
int analogValue = analogRead(LDR_PIN); // Membaca nilai analog dari sensor LDR
float voltage = analogValue / 4096.0 * 5; // Menghitung tegangan dari nilai analog
float resistance = 2000 * voltage / (1 - voltage / 5); // Menghitung resistansi dari tegangan
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); // Menghitung tingkat cahaya
// Sensor DHT22
data = dhtSensor.getTempAndHumidity(); // Mendapatkan data suhu dan kelembaban
// Mengirim data ke Blynk
Blynk.virtualWrite(V1, data.temperature);
Blynk.virtualWrite(V2, data.humidity);
Blynk.virtualWrite(V3, lux);
Blynk.virtualWrite(V4, led);
// Menampilkan data di monitor serial
Serial.print("Suhu : ");
Serial.print(data.temperature);
Serial.print(" Kelembaban : ");
Serial.print(data.humidity);
Serial.print(" Cahaya : ");
Serial.println(lux);
controlSwitch(); // Memanggil fungsi untuk mengatur LED dan Servo berdasarkan switch
}