#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6uw6p3Mvq"
#define BLYNK_TEMPLATE_NAME "Smart Dam"
#define BLYNK_AUTH_TOKEN "m1fpmDjaScexjgmVeBNIA-OtE4cvDD6b"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
DHTesp dhtSensor;
BlynkTimer timer;
#define LED1 4
#define LED2 16
#define LED3 17
#define ldr 26
#define LEBAR_LAYAR 128
#define TINGGI_LAYAR 64
const int DHT_PIN = 13;
const int TRIGGER_PIN = 2;
const int ECHO_PIN = 15;
int baca_ldr;
int jarak_cm;
int kondisi = 0;
Adafruit_SSD1306 oled(LEBAR_LAYAR, TINGGI_LAYAR, &Wire, -1);
Servo servo1;
void sendSensor()
{
// Membaca suhu dan kelembapan dari sensor DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Membaca nilai sensor LDR
baca_ldr=digitalRead(ldr);
// Mengukur jarak menggunakan sensor ultrasonik
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
long durasi = pulseIn(ECHO_PIN, HIGH);
jarak_cm = durasi * 0.0343 / 2;
// Menampilkan hasil pembacaan sensor pada Serial Monitor
Serial.print("% Suhu: ");
Serial.print(data.temperature);
Serial.println("C ");
Serial.print("% Kelembapan: ");
Serial.print(data.humidity);
Serial.println("% ");
Serial.print(baca_ldr);
Serial.print("% Jarak: ");
Serial.print(jarak_cm);
Serial.println(" cm");
delay(500);
// Mengirim nilai sensor ke aplikasi Blynk
Blynk.virtualWrite(V3, jarak_cm);
Blynk.virtualWrite(V2, baca_ldr);
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);
}
// Fungsi yang dipanggil saat ada perubahan pada tombol widget V4
BLYNK_WRITE (V4)
{
kondisi = param.asInt();
// Mengecek kondisi tombol dan menggerakkan servo sesuai kondisi
if (kondisi == 1)
{
servo1.write(180);
Serial.println("Pintu Terbuka");
Blynk.virtualWrite(V4, HIGH);
}
else
{
servo1.write(0);
Serial.println("Pintu Tertutup");
Blynk.virtualWrite(V4, LOW);
}
}
void setup() {
// Mengatur pin-pin sebagai input/output
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(ldr,INPUT);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo1.attach(5);
// Mengatur konfigurasi sensor DHT22
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Memulai koneksi WiFi dan Blynk
Blynk.begin(auth, ssid, pass);
// Menetapkan interval waktu untuk membaca sensor
timer.setInterval(1000, sendSensor);
// Inisialisasi layar OLED
Serial.begin(115200);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Gagal memulai SSD1306 OLED"));
while (1);
}
delay(2000);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(0, 2);
oled.println("Smart Dam");
oled.display();
}
void loop() {
// Menjalankan loop Blynk dan Blynk Timer
Blynk.run();
timer.run();
// Membaca suhu dan kelembapan dari sensor DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
delay(1000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0, 2);
oled.print("Suhu");
oled.setCursor(80, 2);
oled.print(data.temperature);
oled.setCursor(0, 20);
oled.print("Kelembapan");
oled.setCursor(80, 20);
oled.print(data.humidity);
oled.setCursor(0, 40);
oled.print("Jarak Air");
oled.setCursor(80, 40);
oled.print(jarak_cm);
// Menampilkan kondisi siang atau malam berdasarkan nilai sensor LDR
if(baca_ldr==1){
oled.setCursor(0, 50);
oled.print("Malam");
}
else{
oled.setCursor(0, 50);
oled.print("Siang");
}
// Mengontrol LED berdasarkan jarak air
if(jarak_cm<=50){
digitalWrite(LED1,HIGH);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
}
else if(jarak_cm<=200){
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,LOW);
}
else if(jarak_cm<=400){
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
}
// Menampilkan hasil pada layar OLED
oled.display();
}