#define BLYNK_TEMPLATE_ID "TMPL622xeHkHq"
#define BLYNK_TEMPLATE_NAME "Monitoring Kandang Ayam Cabet maniz"
#define BLYNK_AUTH_TOKEN "nXH0LOCazdlrdUbyzG2E4NvKwAyiphd_"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h>
// ====== PIN SENSOR ======
#define DHT_PIN 13
#define TRIG 4
#define ECHO 15
// ====== PIN RELAY (WOKWI ACTIVE HIGH) ======
#define RELAY_PEMANAS 26
#define RELAY_UAP 25
#define RELAY_KIPAS 32
#define RELAY_POMPA 2
// Buzzer
#define BUZZER 14
// ====== WIFI ======
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// ====== DHT ======
DHTesp dht;
// ====== SETUP ======
void setup() {
Serial.begin(115200);
Serial.println("Monitoring Kandang Ayam Cabet maniz");
dht.setup(DHT_PIN, DHTesp::DHT22);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(RELAY_PEMANAS, OUTPUT);
pinMode(RELAY_UAP, OUTPUT);
pinMode(RELAY_KIPAS, OUTPUT);
pinMode(RELAY_POMPA, OUTPUT);
pinMode(BUZZER, OUTPUT);
// relay OFF (LOW = off untuk Wokwi)
digitalWrite(RELAY_PEMANAS, LOW);
digitalWrite(RELAY_UAP, LOW);
digitalWrite(RELAY_KIPAS, LOW);
digitalWrite(RELAY_POMPA, LOW);
noTone(BUZZER);
Serial.println("Menghubungkan ke Blynk...");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.println("Blynk Connected!");
}
// ====== BACA HC-SR04 ======
float bacaLevelAir() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long durasi = pulseIn(ECHO, HIGH);
float jarak = durasi * 0.0343 / 2;
return jarak;
}
// ====== LOOP ======
void loop() {
Blynk.run();
// Baca DHT
TempAndHumidity data = dht.getTempAndHumidity();
delay(50); // tambahan biar tidak NaN
float suhu = data.temperature;
float lembab = data.humidity;
// Baca level air
float levelAir = bacaLevelAir();
// Tampilkan nilai sensor ke Serial
Serial.println("----- Sensor Update -----");
Serial.print("Suhu: "); Serial.println(suhu);
Serial.print("Kelembaban: "); Serial.println(lembab);
Serial.print("Level Air (cm): "); Serial.println(levelAir);
// Kirim ke Blynk
Blynk.virtualWrite(V0, suhu);
Blynk.virtualWrite(V1, lembab);
Blynk.virtualWrite(V2, levelAir);
// ====== LOGIKA SUHU (Wokwi relay aktif HIGH) ======
if (suhu > 30) {
digitalWrite(RELAY_PEMANAS, LOW); // OFF
digitalWrite(RELAY_KIPAS, HIGH); // ON
Serial.println("Kondisi Suhu: PANAS → Kipas ON, Pemanas OFF");
}
else if (suhu >= 26 && suhu <= 30) {
digitalWrite(RELAY_PEMANAS, LOW); // OFF
digitalWrite(RELAY_KIPAS, LOW); // OFF
Serial.println("Kondisi Suhu: CUKUP → Semua OFF");
}
else {
digitalWrite(RELAY_PEMANAS, HIGH); // ON
digitalWrite(RELAY_KIPAS, LOW); // OFF
Serial.println("Kondisi Suhu: DINGIN → Pemanas ON, Kipas OFF");
}
// ====== KONTROL KELEMBABAN (UAP) ======
if (lembab < 60) {
digitalWrite(RELAY_UAP, HIGH); // ON
Serial.println("Uap: ON (Kelembaban rendah)");
} else {
digitalWrite(RELAY_UAP, LOW); // OFF
Serial.println("Uap: OFF (Kelembaban cukup)");
}
// ====== LEVEL AIR POMPA ======
if (levelAir > 15) {
digitalWrite(RELAY_POMPA, HIGH); // ON
Serial.println("Pompa: ON (Air kurang)");
} else {
digitalWrite(RELAY_POMPA, LOW); // OFF
Serial.println("Pompa: OFF (Air cukup)");
}
// ====== ALARM ======
if (suhu > 35 || levelAir > 30) {
tone(BUZZER, 1500);
Blynk.virtualWrite(V7, 1);
Serial.println("ALARM AKTIF !!!");
} else {
noTone(BUZZER);
Blynk.virtualWrite(V7, 0);
}
// ====== STATUS RELAY KE BLYNK (tanpa kebalik) ======
Blynk.virtualWrite(V3, digitalRead(RELAY_PEMANAS));
Blynk.virtualWrite(V4, digitalRead(RELAY_KIPAS));
Blynk.virtualWrite(V5, digitalRead(RELAY_UAP));
Blynk.virtualWrite(V6, digitalRead(RELAY_POMPA));
Serial.println("---------------------------\n");
delay(1000);
}