#define BLYNK_TEMPLATE_ID "TMPL6SNmqqa32"
#define BLYNK_TEMPLATE_NAME "Motor Control Forward Reverse"
#define BLYNK_AUTH_TOKEN "fLlWL8Q8fS23gip2MR75ZwwukQn9nQRN"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define FORWARD_RELAY_PIN 18 // Relay untuk motor forward
#define REVERSE_RELAY_PIN 19 // Relay untuk motor reverse
#define FORWARD_BUTTON_PIN 27 // Tombol forward
#define REVERSE_BUTTON_PIN 26 // Tombol reverse
#define STOP_BUTTON_PIN 25 // Tombol stop
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
// SSID dan Password WiFi
char ssid[] = "Wokwi-GUEST"; // Ganti dengan SSID WiFi Anda
char pass[] = ""; // Ganti dengan password WiFi Anda
bool motorRunning = false; // Menyimpan status motor sedang berjalan
void setup() {
// Inisialisasi pin I/O
pinMode(FORWARD_RELAY_PIN, OUTPUT);
pinMode(REVERSE_RELAY_PIN, OUTPUT);
pinMode(FORWARD_BUTTON_PIN, INPUT_PULLUP);
pinMode(REVERSE_BUTTON_PIN, INPUT_PULLUP);
pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Motor Control");
lcd.setCursor(0, 1);
lcd.print("Waiting...");
// Inisialisasi Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Matikan kedua relay saat start
digitalWrite(FORWARD_RELAY_PIN, HIGH); // Matikan relay forward
digitalWrite(REVERSE_RELAY_PIN, HIGH); // Matikan relay reverse
}
void loop() {
Blynk.run();
checkButtons();
}
void checkButtons() {
// Deteksi tombol yang ditekan
if (digitalRead(FORWARD_BUTTON_PIN) == LOW && !motorRunning) {
forwardMotor();
} else if (digitalRead(REVERSE_BUTTON_PIN) == LOW && !motorRunning) {
reverseMotor();
} else if (digitalRead(STOP_BUTTON_PIN) == LOW) {
stopMotor();
}
}
void forwardMotor() {
// Nyalakan relay forward hanya jika motor tidak berjalan
if (!motorRunning) {
motorRunning = true; // Tandai bahwa motor sedang berjalan
digitalWrite(FORWARD_RELAY_PIN, LOW); // Nyalakan relay forward
digitalWrite(REVERSE_RELAY_PIN, HIGH); // Matikan relay reverse
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor: Forward");
Blynk.virtualWrite(V1, 1); // Update status button forward ke Blynk
Blynk.virtualWrite(V2, 0); // Matikan button reverse di Blynk
Blynk.virtualWrite(V3, 0); // Matikan button stop di Blynk
}
}
void reverseMotor() {
// Nyalakan relay reverse hanya jika motor tidak berjalan
if (!motorRunning) {
motorRunning = true; // Tandai bahwa motor sedang berjalan
digitalWrite(FORWARD_RELAY_PIN, HIGH); // Matikan relay forward
digitalWrite(REVERSE_RELAY_PIN, LOW); // Nyalakan relay reverse
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor: Reverse");
Blynk.virtualWrite(V1, 0); // Matikan button forward di Blynk
Blynk.virtualWrite(V2, 1); // Update status button reverse ke Blynk
Blynk.virtualWrite(V3, 0); // Matikan button stop di Blynk
}
}
void stopMotor() {
// Matikan kedua relay dan set status motor berjalan menjadi false
motorRunning = false;
digitalWrite(FORWARD_RELAY_PIN, HIGH);
digitalWrite(REVERSE_RELAY_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor: Stopped");
Blynk.virtualWrite(V1, 0); // Matikan button forward di Blynk
Blynk.virtualWrite(V2, 0); // Matikan button reverse di Blynk
Blynk.virtualWrite(V3, 1); // Update status button stop ke Blynk
}
// Fungsi untuk menerima kontrol dari Blynk
BLYNK_WRITE(V1) {
// Tombol forward dari Blynk
int pinValue = param.asInt();
if (pinValue == 1 && !motorRunning) {
forwardMotor();
}
}
BLYNK_WRITE(V2) {
// Tombol reverse dari Blynk
int pinValue = param.asInt();
if (pinValue == 1 && !motorRunning) {
reverseMotor();
}
}
BLYNK_WRITE(V3) {
// Tombol stop dari Blynk
int pinValue = param.asInt();
if (pinValue == 1) {
stopMotor();
}
}