#define BLYNK_TEMPLATE_ID "TMPL61gu6iSGz"
#define BLYNK_TEMPLATE_NAME "Suction Pump"
#define BLYNK_AUTH_TOKEN "F3eftnmqrt8k1GTFZ277x13DPfGzh8vT"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h> // Mengimpor pustaka LiquidCrystal untuk mengakses dan mengontrol LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Mendefinisikan objek lcd dengan pinout LCD
#define potentiometer 34 // Mendefinisikan pin analog 34 sebagai input untuk potensiometer
#define bt_F 35 // Mendefinisikan pin analog 35 sebagai input untuk tombol maju
#define bt_S 32 // Mendefinisikan pin analog 32 sebagai input untuk tombol stop
#define bt_B 33 // Mendefinisikan pin analog 33 sebagai input untuk tombol mundur
#define M1_Ena 5 // Mendefinisikan pin PWM untuk mengendalikan kecepatan motor
#define M1_in1 18 // Mendefinisikan pin digital untuk kontrol motor
#define M1_in2 19 // Mendefinisikan pin digital untuk kontrol motor
#define trigPin 2 // Mendefinisikan pin digital nomor 2 sebagai Trigger untuk sensor ultrasonik
#define echoPin 4 // Mendefinisikan pin digital nomor 4 sebagai Echo untuk sensor ultrasonik
#define ledPin 15 // Mendefinisikan pin digital nomor 15 untuk LED
char auth[] = "F3eftnmqrt8k1GTFZ277x13DPfGzh8vT";
int read_ADC; // Mendefinisikan variabel untuk membaca nilai dari potensiometer
int duty_cycle; // Variabel untuk menyimpan duty cycle (nilai PWM) yang dihitung dari potensiometer
int duty_cycle_lcd; // Variabel untuk menampilkan duty cycle di LCD
int set = 0; // Variabel untuk menentukan mode operasi (0: stop, 1: maju, 2: mundur)
long duration; // Variabel untuk menyimpan durasi pulsa Echo
int distance; // Variabel untuk menyimpan jarak yang dihitung dari durasi Echo
int volume;
BlynkTimer timer;
void setup() {
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 115200
pinMode(potentiometer, INPUT); // Mengatur pin potensiometer sebagai input
pinMode(bt_F, INPUT_PULLUP); // Mengatur pin tombol maju dengan pull-up resistor internal
pinMode(bt_S, INPUT_PULLUP); // Mengatur pin tombol stop dengan pull-up resistor internal
pinMode(bt_B, INPUT_PULLUP); // Mengatur pin tombol mundur dengan pull-up resistor internal
pinMode(M1_Ena, OUTPUT); // Mengatur pin PWM untuk mengendalikan kecepatan motor sebagai output
pinMode(M1_in1, OUTPUT); // Mengatur pin untuk kontrol motor sebagai output
pinMode(M1_in2, OUTPUT); // Mengatur pin untuk kontrol motor sebagai output
pinMode(trigPin, OUTPUT); // Mengatur pin Trigger sebagai output
pinMode(echoPin, INPUT); // Mengatur pin Echo sebagai input
pinMode(ledPin, OUTPUT); // Mengatur pin LED sebagai output
Blynk.begin(auth, "Wokwi-GUEST", "");
timer.setInterval(1000, Blynktimer);
lcd.init();
lcd.backlight(); // Menginisialisasi LCD dengan ukuran 16x2
lcd.setCursor(0, 0); // Mengatur kursor di baris pertama, kolom pertama
lcd.print(" Kelompok 3C "); // Menampilkan teks "Kelompok 3C" di LCD
lcd.setCursor(0, 1); // Mengatur kursor di baris kedua, kolom pertama
lcd.print("Suction Pump"); // Menampilkan teks "Suction Pump" di LCD
delay(2000); // Delay 2 detik
lcd.clear(); // Membersihkan layar LCD
}
void loop() {
Blynk.run();
// Membaca nilai potensiometer
read_ADC = analogRead(potentiometer); // Membaca nilai analog dari potensiometer
duty_cycle = map(read_ADC, 0, 4095, 0, 255); // Mengonversi nilai potensiometer menjadi rentang PWM (0-255)
duty_cycle_lcd = map(read_ADC, 0, 4095, 0, 100); // Mengonversi nilai potensiometer menjadi persentase (0-100)
ledcWrite(0, duty_cycle); // Mengatur duty cycle PWM untuk mengendalikan kecepatan motor
// Membaca jarak dari sensor ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Mengonversi durasi menjadi jarak dalam cm
//Menghitung volume cairan dalam tabung
volume = 3.14 * 5.5 * 5.5 * (21 - distance);
// Menampilkan kecepatan di LCD
lcd.setCursor(0, 0); // Mengatur kursor di baris pertama, kolom pertama
lcd.print("Kecepatan : "); // Menampilkan teks "Kecepatan: " di LCD
lcd.print(duty_cycle_lcd); // Menampilkan duty cycle di LCD
lcd.print("% "); // Menampilkan tanda persen di LCD, dengan spasi tambahan untuk menghapus karakter sebelumnya
// Menampilkan jarak atau peringatan di LCD
lcd.setCursor(0, 1); // Mengatur kursor di baris kedua, kolom pertama
if (distance < 0) {
lcd.print(" Peringatan: Penuh "); // Menampilkan peringatan "Penuh" di LCD jika jarak di bawah 5 cm
triggerLED(true); // Memanggil fungsi untuk menyalakan LED
} else {
lcd.print("Volume: "); // Menampilkan teks "Jarak: " di LCD
lcd.print(volume); // Menampilkan jarak di LCD
lcd.print(" ml "); // Menampilkan satuan cm di LCD, dengan spasi tambahan untuk menghapus karakter sebelumnya
triggerLED(false); // Memanggil fungsi untuk mematikan LED
}
// Membaca input tombol
if (digitalRead(bt_F) == 0) {
set = 1; // Jika tombol maju ditekan, set mode operasi menjadi maju
}
if (digitalRead(bt_S) == 0) {
set = 0; // Jika tombol stop ditekan, set mode operasi menjadi stop
}
if (digitalRead(bt_B) == 0) {
set = 2; // Jika tombol mundur ditekan, set mode operasi menjadi mundur
}
// Mengontrol motor berdasarkan mode operasi
if (set == 0) { // Jika mode operasi adalah stop
digitalWrite(M1_in1, LOW); // Mematikan output motor
digitalWrite(M1_in2, LOW); // Mematikan output motor
} else if (set == 1) { // Jika mode operasi adalah maju
digitalWrite(M1_in1, HIGH); // Mengatur arah motor maju
digitalWrite(M1_in2, LOW); // Mematikan arah motor mundur
} else if (set == 2) { // Jika mode operasi adalah mundur
digitalWrite(M1_in1, LOW); // Mematikan arah motor maju
digitalWrite(M1_in2, HIGH); // Mengatur arah motor mundur
}
delay(50); // Delay untuk stabilisasi dan efisiensi loop
timer.run();
}
void triggerLED(bool state) {
if (state) {
digitalWrite(ledPin, HIGH); // Menyalakan LED
} else {
digitalWrite(ledPin, LOW); // Mematikan LED
}
}
void Blynktimer() {
Blynk.virtualWrite(V0, duty_cycle_lcd); // Mengirim Kecepatan sedotan ke Blynk
Blynk.virtualWrite(V1, volume); // Mengirim nilai volume liquid ke Blynk
}