#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6ThNGok00"
#define BLYNK_TEMPLATE_NAME "V"
#define BLYNK_AUTH_TOKEN "oAls8_bRApWPoTCwtIqtJOSZkQF_bR6j"
#define ECHO_PIN 18
#define TRIG_PIN 5
#define BUZZER_PIN 4
#define MAX_HEIGHT_CM 20.0
#define OLI_FULL 2.0
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST"; // Nama jaringan di Wokwi
char pass[] = ""; // Tanpa password
bool brio = false;
bool brv = false;
bool filter = false;
float triggerVolume = 0.0;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
Blynk.begin(auth, ssid, pass);
Serial.println("Pilih menu");
}
void loop() {
Blynk.run(); // Mengaktifkan Blynk
float distance = measureDistance();
float volume = calculateOilVolume(distance);
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm | Oil Volume: ");
Serial.print(volume);
Serial.println(" liters");
updateTriggerVolume();
Blynk.virtualWrite(V4, volume * 1000);
if (volume >= triggerVolume) {
activateBuzzer();
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
deactivateBuzzer();
}
delay(1000);
}
// Fungsi untuk menerima input dari Blynk Virtual Pin (V1, V2 dan V3)
BLYNK_WRITE(V1) {
brio = param.asInt();
Serial.println("BRIO");
Serial.println(brio ? "Dipilih" : "Dilepas");
}
BLYNK_WRITE(V2) {
brv = param.asInt();
Serial.println("BRV");
Serial.println(brv ? "Dipilih" : "Dilepas");
}
BLYNK_WRITE(V3) {
filter = param.asInt();
Serial.print("FILTER");
Serial.println(filter ? "Dipilih" : "Dilepas");
}
void updateTriggerVolume() {
if (brio && filter) {
triggerVolume = 0.799;
Serial.println("Kombinasi BRIO dan FILTER dipilih (3200 mL)");
Blynk.virtualWrite(V5, 3200);
} else if (brv && filter) {
triggerVolume = 0.699;
Serial.println("Kombinasi Menu BRV dan FILTER dipilih (3300 mL)");
Blynk.virtualWrite(V5, 3300);
} else if (brio) {
triggerVolume = 0.99;
Serial.println("Menu BRIO dipilih (3000 mL)");
Blynk.virtualWrite(V5, 3000);
} else if (brv) {
triggerVolume = 0.899;
Serial.println("Menu BRV dipilih (3100 mL)");
Blynk.virtualWrite(V5, 3100);
} else {
triggerVolume = 0.0;
Serial.println("Tidak ada menu yang dipilih");
}
}
float measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distanceCm = duration * 0.034 / 2;
return distanceCm;
}
float calculateOilVolume(float distance) {
float filledHeight = MAX_HEIGHT_CM - distance; // Tinggi oli yang terisi
float volume = (filledHeight / MAX_HEIGHT_CM) * OLI_FULL;
return volume;
}
void activateBuzzer() {
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Buzzer ON");
}
void deactivateBuzzer() {
digitalWrite(BUZZER_PIN, LOW);
Serial.println("Buzzer OFF");
}