#define BLYNK_TEMPLATE_ID "TMPL6HnNQDfF2" // ID template Blynk
#define BLYNK_TEMPLATE_NAME "Templat 1" // Nama template Blynk
#define BLYNK_AUTH_TOKEN "GQfXBGGqs8lYR32W6WIoTFtgNS6pKiOv" // Token autentikasi Blynk
#include <WiFi.h> // Library untuk koneksi WiFi
#include <BlynkSimpleEsp32.h> // Library Blynk khusus ESP32
#include <WiFiClient.h> // Library tambahan untuk WiFi
#include <ESP32Servo.h> // Library untuk mengontrol servo pada ESP32
Servo myservo; // Objek servo
int posisiSekarang; // Variabel untuk menyimpan posisi servo saat ini
int button = 2; // Pin untuk tombol otomatis
int manual = 3; // Pin untuk tombol manual
BlynkTimer timer; // Timer untuk menjalankan fungsi tertentu secara periodik
char auth[] = BLYNK_AUTH_TOKEN; // Token autentikasi Blynk
char ssid[] = "Wokwi-GUEST"; // Nama SSID WiFi
char pass[] = ""; // Password WiFi (kosong untuk jaringan Wokwi-GUEST)
BLYNK_WRITE(V1){ // Fungsi ini dijalankan saat ada data dari Virtual Pin V1
int data = param.asInt(); // Membaca data sebagai integer
myservo.write(data); // Menggerakkan servo ke posisi sesuai dengan data
Blynk.virtualWrite(V1, data); // Mengirim kembali data ke Virtual Pin V1 untuk memperbarui tampilan di aplikasi Blynk
}
void setup(){
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 9600
myservo.attach(26); // Menghubungkan servo ke pin GPIO 26 pada ESP32
Blynk.begin(auth, ssid, pass); // Menghubungkan ESP32 ke Blynk menggunakan token, SSID, dan password
timer.setInterval(100L, sendData); // Mengatur timer untuk menjalankan fungsi sendData setiap 100 ms
delay(2000); // Menambahkan delay 2 detik untuk stabilitas
}
void loop(){
Blynk.run(); // Menjalankan fungsi Blynk untuk mengelola koneksi
timer.run(); // Menjalankan timer untuk fungsi periodik
}
void sendData(){
int read_manual = digitalRead(manual); // Membaca status tombol manual
int read_button = digitalRead(button); // Membaca status tombol otomatis
posisiSekarang = myservo.read(); // Membaca posisi servo saat ini
Blynk.virtualWrite(V2, String(posisiSekarang)); // Mengirim posisi servo saat ini ke Virtual Pin V2
if(read_button == 1 && read_manual == 0){ // Jika tombol otomatis ditekan dan tombol manual tidak ditekan
myservo.write(90); // Menggerakkan servo ke posisi 90 derajat
}else if(read_button == 0 && read_manual == 0){ // Jika tombol otomatis tidak ditekan dan tombol manual juga tidak ditekan
myservo.write(0); // Menggerakkan servo ke posisi 0 derajat
}
}