#define BLYNK_TEMPLATE_ID "TMPL66j_W6zKW"
#define BLYNK_TEMPLATE_NAME "MONITORING KANDANG AYAM"
#define BLYNK_AUTH_TOKEN "YrET9M_KhN1PW1vfGTFgt7oFGAychMzS"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#define DHTPIN 23
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Relay pin
#define FAN_PIN 25 // Kipas pendingin
#define HEATER_PIN 26 // Lampu pemanas
#define HUMIDIFIER_PIN 33 // Humidifier
#define PUMP_PIN 22 // Pompa air
#define BUZZER_PIN 27 // Alarm
#define TRIG_PIN 16
#define ECHO_PIN 4
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
// Variabel untuk menyimpan state terakhir
bool lastFanState = LOW;
bool lastHeaterState = LOW;
bool lastHumidifierState = LOW;
bool lastPumpState = LOW;
bool lastBuzzerState = LOW;
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(FAN_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
pinMode(HUMIDIFIER_PIN, OUTPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Matikan semua perangkat awal
digitalWrite(FAN_PIN, LOW);
digitalWrite(HEATER_PIN, LOW);
digitalWrite(HUMIDIFIER_PIN, LOW);
digitalWrite(PUMP_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
dht.begin();
// Koneksi WiFi dan Blynk
WiFi.begin(ssid, pass);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Blynk.config(BLYNK_AUTH_TOKEN);
if (Blynk.connect()) {
Serial.println("Connected to Blynk server");
} else {
Serial.println("Failed to connect to Blynk server");
}
timer.setInterval(2000L, sendSensor);
}
void sendSensor() {
if (!Blynk.connected()) {
Serial.println("Blynk not connected, attempting reconnect...");
Blynk.connect();
return;
}
float temp = dht.readTemperature();
float hum = dht.readHumidity();
float level = readWaterLevel();
// Cek jika pembacaan sensor valid
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: "); Serial.print(temp); Serial.println(" °C");
Serial.print("Humidity: "); Serial.print(hum); Serial.println(" %");
Serial.print("Water Level: "); Serial.print(level); Serial.println(" cm");
// Kirim data ke Blynk
Blynk.virtualWrite(V0, temp); // Suhu
Blynk.virtualWrite(V1, hum); // Kelembaban
Blynk.virtualWrite(V2, level); // Level air
// Kontrol perangkat berdasarkan sensor
controlDevices(temp, hum, level);
}
void controlDevices(float temp, float hum, float level) {
// Kontrol suhu (Kipas dan Pemanas)
if (temp < 30.0) {
// Suhu < 30°C: Kipas ON, Pemanas OFF
digitalWrite(FAN_PIN, HIGH);
digitalWrite(HEATER_PIN, LOW);
lastFanState = HIGH;
lastHeaterState = LOW;
}
else if (temp > 33.0) {
// Suhu > 33°C: Kipas ON, Pemanas OFF
digitalWrite(FAN_PIN, HIGH);
digitalWrite(HEATER_PIN, LOW);
lastFanState = HIGH;
lastHeaterState = LOW;
}
// Suhu 30-33°C: Tidak ada perubahan (pertahankan state sebelumnya)
// Kontrol kelembaban (Humidifier)
if (hum < 70.0) {
// Kelembaban < 70%: Humidifier ON
digitalWrite(HUMIDIFIER_PIN, HIGH);
lastHumidifierState = HIGH;
}
else if (hum > 80.0) {
// Kelembaban > 80%: Humidifier OFF
digitalWrite(HUMIDIFIER_PIN, LOW);
lastHumidifierState = LOW;
}
// Kelembaban 70-80%: Tidak ada perubahan
// Kontrol level air (Pompa)
if (level < 100.0) {
// Level < 100cm: Pompa ON
digitalWrite(PUMP_PIN, HIGH);
lastPumpState = HIGH;
}
else if (level >= 100.0 && level <= 150.0) {
// Level 100-150cm: Pompa OFF
digitalWrite(PUMP_PIN, LOW);
lastPumpState = LOW;
}
else if (level > 150.0) {
// Level > 150cm: Pompa ON
digitalWrite(PUMP_PIN, HIGH);
lastPumpState = HIGH;
}
// Kontrol alarm
if (temp > 35.0 || hum < 60.0 || level < 50.0 || level > 160.0) {
// Kondisi darurat: Alarm ON
digitalWrite(BUZZER_PIN, HIGH);
lastBuzzerState = HIGH;
}
else {
// Kondisi normal: Alarm OFF
digitalWrite(BUZZER_PIN, LOW);
lastBuzzerState = LOW;
}
// Update status di Blynk
Blynk.virtualWrite(V3, lastFanState ? 255 : 0); // Status Kipas
Blynk.virtualWrite(V4, lastHeaterState ? 255 : 0); // Status Pemanas
Blynk.virtualWrite(V5, lastHumidifierState ? 255 : 0); // Status Humidifier
Blynk.virtualWrite(V6, lastPumpState ? 255 : 0); // Status Pompa
Blynk.virtualWrite(V7, lastBuzzerState ? 255 : 0); // Status Alarm
}
float readWaterLevel() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance_cm = duration * 0.034 / 2;
return distance_cm;
}
void loop() {
Blynk.run();
timer.run();
}