#define BLYNK_TEMPLATE_ID "TMPL6W0GP1lyN"
#define BLYNK_TEMPLATE_NAME "UTPP"
#define BLYNK_AUTH_TOKEN "Ln-qcEn7haOXK3p31Ip_8b9u9nTwSnkO"
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// DHT22 pin
#define PIN_DHT 15
#define TIPE_DHT DHT22
DHT sensorIklim(PIN_DHT, TIPE_DHT);
// Pin Output
#define PIN_LED_BIRU 12
#define PIN_LED_KUNING 13
#define PIN_LED_MERAH 14
#define PIN_BUZZER 27
// OLED
#define LAYAR_LEBAR 128
#define LAYAR_TINGGI 64
Adafruit_SSD1306 layar(LAYAR_LEBAR, LAYAR_TINGGI, &Wire, -1);
// WiFi
char wifi_ssid[] = "Wokwi-GUEST";
char wifi_pass[] = "";
// Blynk
BlynkTimer jadwalBaca;
#define VP_BUZZER V6
#define VP_SUHU V3
#define VP_KELEMBAPAN V5
bool status_buzzer = true;
BLYNK_WRITE(VP_BUZZER) {
status_buzzer = param.asInt();
}
void setup() {
Serial.begin(115200);
sensorIklim.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, wifi_ssid, wifi_pass);
pinMode(PIN_LED_BIRU, OUTPUT);
pinMode(PIN_LED_KUNING, OUTPUT);
pinMode(PIN_LED_MERAH, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
if (!layar.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Gagal inisialisasi OLED"));
while (true);
}
layar.clearDisplay();
layar.setTextSize(1);
layar.setTextColor(WHITE);
layar.setCursor(0, 0);
layar.print("Inisialisasi...");
layar.display();
}
void bacaDataSensor() {
float suhu_now = sensorIklim.readTemperature();
float lembap_now = sensorIklim.readHumidity();
if (isnan(suhu_now) || isnan(lembap_now)) {
Serial.println("Sensor gagal membaca data!");
return;
}
Serial.print("Suhu: ");
Serial.print(suhu_now);
Serial.print(" °C, Kelembapan: ");
Serial.print(lembap_now);
Serial.println(" %");
// Kirim ke Blynk
Blynk.virtualWrite(VP_SUHU, suhu_now);
Blynk.virtualWrite(VP_KELEMBAPAN, lembap_now);
// Tampilkan di OLED
layar.clearDisplay();
layar.setCursor(0, 0);
layar.print("Suhu: ");
layar.print(suhu_now);
layar.println(" C");
layar.print("Lembap: ");
layar.print(lembap_now);
layar.println(" %");
layar.display();
// Logika kontrol
if (suhu_now >= 25 && suhu_now <= 30 && lembap_now >= 55 && lembap_now <= 65) {
digitalWrite(PIN_LED_BIRU, HIGH);
digitalWrite(PIN_LED_KUNING, LOW);
digitalWrite(PIN_LED_MERAH, LOW);
Blynk.virtualWrite(V0, 1);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
noTone(PIN_BUZZER);
} else if (suhu_now >= 31 && suhu_now <= 33 && lembap_now >= 66 && lembap_now <= 70) {
digitalWrite(PIN_LED_BIRU, LOW);
digitalWrite(PIN_LED_KUNING, HIGH);
digitalWrite(PIN_LED_MERAH, LOW);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 0);
noTone(PIN_BUZZER);
} else {
digitalWrite(PIN_LED_BIRU, LOW);
digitalWrite(PIN_LED_KUNING, LOW);
digitalWrite(PIN_LED_MERAH, HIGH);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 1);
if (status_buzzer) {
tone(PIN_BUZZER, 200);
Blynk.logEvent("warning", "PERINGATAN! Kondisi kandang TIDAK AMAN!");
} else {
noTone(PIN_BUZZER);
}
}
}
void loop() {
Blynk.run();
bacaDataSensor();
}