#define BLYNK_TEMPLATE_ID "TMPL6rjewKa8a"
#define BLYNK_TEMPLATE_NAME "utp utp"
#define BLYNK_AUTH_TOKEN "HnO_wjmCgyJZ-beZO7xoZSHphvlMabQ9"
#define BLYNK_PRINT Serial
#include <DHT.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Blynk WiFi
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// DHT
#define DHTPIN 14
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// LED & buzzer
const int ledBiru = 2;
const int ledKuning = 0;
const int ledMerah = 4;
const int buzzer = 5;
bool buzzerManual = false;
bool sudahKirimPeringatan = false;
// Fungsi untuk matikan buzzer
void matikanBuzzer() {
noTone(buzzer);
}
// Fungsi untuk nyalakan buzzer dengan frekuensi
void nyalakanBuzzer() {
tone(buzzer, 1000);
}
// Kontrol buzzer dari aplikasi Blynk
BLYNK_WRITE(V5) {
int val = param.asInt();
buzzerManual = (val == 1);
if (buzzerManual) {
nyalakanBuzzer();
} else {
matikanBuzzer();
}
}
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000);
dht.begin();
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80); // <<== gunakan port dari kode pertama
pinMode(ledBiru, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledMerah, OUTPUT);
pinMode(buzzer, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Gagal menginisialisasi OLED");
while (1);
}
display.clearDisplay();
display.display();
}
void loop() {
Blynk.run();
float suhu = dht.readTemperature();
float kelembapan = dht.readHumidity();
if (isnan(suhu) || isnan(kelembapan)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
// Tampilkan ke OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.print("Suhu: ");
display.print(suhu);
display.println(" C");
display.print("Kelembapan: ");
display.print(kelembapan);
display.println(" %");
display.display();
// Kirim ke Blynk
Blynk.virtualWrite(V3, suhu);
Blynk.virtualWrite(V4, kelembapan);
// Logika kondisi
if (suhu >= 25 && suhu <= 30 && kelembapan >= 55 && kelembapan <= 65) {
digitalWrite(ledBiru, HIGH);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, LOW);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 255);
matikanBuzzer();
sudahKirimPeringatan = false;
}
else if (suhu >= 31 && suhu <= 33 && kelembapan >= 66 && kelembapan <= 70) {
digitalWrite(ledBiru, LOW);
digitalWrite(ledKuning, HIGH);
digitalWrite(ledMerah, LOW);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 255);
Blynk.virtualWrite(V2, 0);
matikanBuzzer();
sudahKirimPeringatan = false;
}
else if ((suhu < 25 || suhu > 33) || (kelembapan < 50 || kelembapan > 70)) {
digitalWrite(ledBiru, LOW);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, HIGH);
Blynk.virtualWrite(V0, 255);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
if (buzzerManual) {
nyalakanBuzzer();
} else {
matikanBuzzer();
}
if (!sudahKirimPeringatan) {
Blynk.logEvent("peringatan", "PERINGATAN! Kondisi kandang TIDAK AMAN!");
sudahKirimPeringatan = true;
}
}
delay(2000);
}