// Arduino IDE versi 2.2.1
// BOARD : LOLIN(WEMOS) D1 mini Lite (esp8266:esp8266:d1_mini_lite)
// ROBOT SOCKER NODEMCU BY ASUN86 10 FEB 2025
// OUT A = GEAR kiri
// OUT B = GEAR kanan
/******* WiFi Robot Remote Control Mode ********/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>
// connections for drive Motors
int PWM_A = D6; // tidak digunakan
int PWM_B = D7; // tidak digunakan
int DIR_A = D1;
int DIR_B = D2;
int DIR_C = D3;
int DIR_D = D4;
const int buzPin = D5; // set digital pin D5 as buzzer pin (use active buzzer)
const int ledPin = D8; // set digital pin D8 as LED pin (use super bright LED)
const int wifiLedPin = D0; // set digital pin D0 as indication, the LED turn on if NodeMCU connected to WiFi as STA mode
String command; // String to store app command state.
int SPEED = 1023; // 330 - 1023.
int speed_Coeff = 3;
ESP8266WebServer server(80); // Create a webserver object that listens for HTTP request on port 80
unsigned long previousMillis = 0;
String sta_ssid = ""; // set Wifi networks you want to connect to
String sta_password = ""; // set password for Wifi networks
void setup(){
Serial.begin(115200); // bisa diganti 9600 supara bisa berkomunikasi dg hc05
Serial.println();
Serial.println("WiFi Robot Remote Control Mode");
Serial.println("--------------------------------------");
pinMode(buzPin, OUTPUT); // sets the buzzer pin as an Output
pinMode(ledPin, OUTPUT); // sets the LED pin as an Output
pinMode(wifiLedPin, OUTPUT); // sets the Wifi LED pin as an Output
digitalWrite(buzPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(wifiLedPin, HIGH);
// Set all the motor control pins to outputs
pinMode(PWM_A, OUTPUT);
pinMode(PWM_B, OUTPUT);
pinMode(DIR_A, OUTPUT);
pinMode(DIR_B, OUTPUT);
pinMode(DIR_C, OUTPUT);
pinMode(DIR_D, OUTPUT);
// Turn off motors - Initial state
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, LOW);
analogWrite(PWM_A, 0);
analogWrite(PWM_B, 0);
// set NodeMCU Wifi hostname based on chip mac address
String chip_id = String(ESP.getChipId(), HEX);
int i = chip_id.length()-4;
chip_id = chip_id.substring(i);
chip_id = "wificar-" + chip_id; // nama robot contor wificar-RFI01
String hostname(chip_id);
Serial.println();
Serial.println("Hostname: "+hostname);
// first, set NodeMCU as STA mode to connect with a Wifi network
WiFi.mode(WIFI_STA);
WiFi.begin(sta_ssid.c_str(), sta_password.c_str());
Serial.println("");
Serial.print("Connecting to: ");
Serial.println(sta_ssid);
Serial.print("Password: ");
Serial.println(sta_password);
// try to connect with Wifi network about 10 seconds
unsigned long currentMillis = millis();
previousMillis = currentMillis;
while (WiFi.status() != WL_CONNECTED && currentMillis - previousMillis <= 10000) {
delay(500);
Serial.print(".");
currentMillis = millis();
}
// if failed to connect with Wifi network set NodeMCU as AP mode
if (WiFi.status() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi-STA-Mode");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
digitalWrite(wifiLedPin, LOW); // Wifi LED on when connected to Wifi as STA mode
delay(3000);
} else {
WiFi.mode(WIFI_AP);
WiFi.softAP(hostname.c_str());
IPAddress myIP = WiFi.softAPIP();
Serial.println("");
Serial.println("WiFi failed connected to " + sta_ssid);
Serial.println("");
Serial.println("WiFi-AP-Mode");
Serial.print("AP IP address: ");
Serial.println(myIP);
digitalWrite(wifiLedPin, HIGH); // Wifi LED off when status as AP mode
delay(3000);
}
server.on ( "/", HTTP_handleRoot ); // call the 'handleRoot' function when a client requests URI "/"
server.onNotFound ( HTTP_handleRoot ); // when a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"
server.begin(); // actually start the server
ArduinoOTA.begin(); // enable to receive update/uploade firmware via Wifi OTA
}
void loop() {
ArduinoOTA.handle(); // listen for update OTA request from clients
server.handleClient(); // listen for HTTP requests from clients
command = server.arg("State"); // check HTPP request, if has arguments "State" then saved the value
if (command == "F") Forward(); // check string then call a function or set a value
else if (command == "B") Backward();
else if (command == "R") TurnRight();
else if (command == "L") TurnLeft();
else if (command == "G") ForwardLeft();
else if (command == "H") BackwardLeft();
else if (command == "I") ForwardRight();
else if (command == "J") BackwardRight();
else if (command == "S") Stop();
else if (command == "V") BeepHorn();
else if (command == "W") TurnLightOn();
else if (command == "w") TurnLightOff();
else if (command == "0") SPEED = 330;
else if (command == "1") SPEED = 400;
else if (command == "2") SPEED = 470;
else if (command == "3") SPEED = 540;
else if (command == "4") SPEED = 610;
else if (command == "5") SPEED = 680;
else if (command == "6") SPEED = 750;
else if (command == "7") SPEED = 820;
else if (command == "8") SPEED = 890;
else if (command == "9") SPEED = 960;
else if (command == "q") SPEED = 1023;
}
// function prototypes for HTTP handlers
void HTTP_handleRoot(void){
server.send ( 200, "text/html", "" ); // Send HTTP status 200 (Ok) and send some text to the browser/client
if( server.hasArg("State") ){
Serial.println(server.arg("State"));
}
}
void handleNotFound(){
server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request
}
// function to move forward
void Forward(){
digitalWrite(DIR_A, HIGH);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, HIGH);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to move backward
void Backward(){
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, HIGH);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, HIGH);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to turn right
void TurnRight(){
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, HIGH);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to turn left
void TurnLeft(){
digitalWrite(DIR_A, HIGH);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to move forward left
void ForwardLeft(){
digitalWrite(DIR_A, HIGH);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, HIGH);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to move backward left
void BackwardLeft(){
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, HIGH);
digitalWrite(DIR_C, HIGH);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to move forward right
void ForwardRight(){
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, HIGH);
digitalWrite(DIR_C, HIGH);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to move backward left
void BackwardRight(){
digitalWrite(DIR_A, HIGH);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, HIGH);
//analogWrite(PWM_A, SPEED);
//analogWrite(PWM_B, SPEED);
}
// function to stop motors
void Stop(){
digitalWrite(DIR_A, LOW);
digitalWrite(DIR_B, LOW);
digitalWrite(DIR_C, LOW);
digitalWrite(DIR_D, LOW);
//analogWrite(PWM_A, 0);
//analogWrite(PWM_B, 0);
}
// function to beep a buzzer
void BeepHorn(){
digitalWrite(buzPin, HIGH);
delay(150);
digitalWrite(buzPin, LOW);
delay(80);
}
// function to turn on LED
void TurnLightOn(){
digitalWrite(ledPin, HIGH);
}
// function to turn off LED
void TurnLightOff(){
digitalWrite(ledPin, LOW);
}
// Arduino IDE versi 2.2.1
// BOARD : LOLIN(WEMOS) D1 mini Lite (esp8266:esp8266:d1_mini_lite)
// ROBOT SOCKER NODEMCU BY ASUN86 10 FEB 2025
// OUT A = GEAR kiri
// OUT B = GEAR kanan
/******* WiFi Robot Remote Control Mode ********/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>
// connections for drive Motors (hanya menggunakan pin direction)
int GEAR_KIRI_MAJU = D1;
int GEAR_KIRI_MUNDUR = D2;
int GEAR_KANAN_MAJU = D3;
int GEAR_KANAN_MUNDUR = D4;
const int buzPin = D5; // pin buzzer (active buzzer)
const int ledPin = D8; // pin LED
const int wifiLedPin = D0; // indikator WiFi STA mode
String command; // String untuk menyimpan perintah
ESP8266WebServer server(80); // Webserver pada port 80
unsigned long previousMillis = 0;
String sta_ssid = ""; // SSID WiFi
String sta_password = ""; // Password WiFi
// Deklarasi fungsi
void HTTP_handleRoot(void);
void stopMotor();
void maju();
void mundur();
void putarKanan();
void putarKiri();
void majuKiri();
void mundurKiri();
void majuKanan();
void mundurKanan();
void bunyiBuzzer();
void nyalaLampu();
void matiLampu();
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("WiFi Robot Remote Control Mode - SIMPLE");
Serial.println("--------------------------------------");
// Setup pin mode
pinMode(buzPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(wifiLedPin, OUTPUT);
digitalWrite(buzPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(wifiLedPin, HIGH);
// Setup pin motor
pinMode(GEAR_KIRI_MAJU, OUTPUT);
pinMode(GEAR_KIRI_MUNDUR, OUTPUT);
pinMode(GEAR_KANAN_MAJU, OUTPUT);
pinMode(GEAR_KANAN_MUNDUR, OUTPUT);
// Matikan semua motor - State awal
stopMotor();
// Setup hostname berdasarkan chip ID
String chip_id = String(ESP.getChipId(), HEX);
int i = chip_id.length()-4;
chip_id = chip_id.substring(i);
String hostname = "wificar-" + chip_id;
Serial.println("Hostname: " + hostname);
// Koneksi WiFi STA mode
WiFi.mode(WIFI_STA);
WiFi.begin(sta_ssid.c_str(), sta_password.c_str());
Serial.println("");
Serial.print("Connecting to: ");
Serial.println(sta_ssid);
// Tunggu koneksi WiFi 10 detik
unsigned long currentMillis = millis();
previousMillis = currentMillis;
while (WiFi.status() != WL_CONNECTED && currentMillis - previousMillis <= 10000) {
delay(500);
Serial.print(".");
currentMillis = millis();
}
// Jika gagal konek, mode AP
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi-STA-Mode");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
digitalWrite(wifiLedPin, LOW); // LED nyala saat STA mode
} else {
WiFi.mode(WIFI_AP);
WiFi.softAP(hostname.c_str());
Serial.println("\nWiFi failed to: " + sta_ssid);
Serial.println("WiFi-AP-Mode");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
digitalWrite(wifiLedPin, HIGH); // LED mati saat AP mode
}
server.on("/", HTTP_handleRoot);
server.onNotFound(HTTP_handleRoot);
server.begin();
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
server.handleClient();
command = server.arg("State");
if (command == "F") maju();
else if (command == "B") mundur();
else if (command == "L") putarKanan();
else if (command == "R") putarKiri();
else if (command == "G") majuKiri();
else if (command == "H") mundurKiri();
else if (command == "I") majuKanan();
else if (command == "J") mundurKanan();
else if (command == "S") stopMotor();
else if (command == "V") bunyiBuzzer();
else if (command == "W") nyalaLampu();
else if (command == "w") matiLampu();
delay(10);
}
void HTTP_handleRoot(void) {
server.send(200, "text/html", "");
if(server.hasArg("State")) {
Serial.println(server.arg("State"));
}
}
// Fungsi kontrol motor yang disederhanakan
void stopMotor() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void maju() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundur() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void putarKanan() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void putarKiri() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void majuKiri() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundurKiri() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void majuKanan() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundurKanan() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void bunyiBuzzer() {
digitalWrite(buzPin, HIGH);
delay(150);
digitalWrite(buzPin, LOW);
}
void nyalaLampu() {
digitalWrite(ledPin, HIGH);
}
void matiLampu() {
digitalWrite(ledPin, LOW);
}
// Arduino IDE versi 2.2.1
// BOARD : LOLIN(WEMOS) D1 mini Lite (esp8266:esp8266:d1_mini_lite)
// ROBOT SOCKER NODEMCU BY ASUN86 10 FEB 2025
// OUT A = GEAR kiri
// OUT B = GEAR kanan
/******* WiFi Robot Remote Control Mode ********/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>
// connections for drive Motors (hanya menggunakan pin direction)
int GEAR_KIRI_MAJU = D1;
int GEAR_KIRI_MUNDUR = D2;
int GEAR_KANAN_MAJU = D3;
int GEAR_KANAN_MUNDUR = D4;
// Sensor HC-SR04
const int trigPin = D6; // Pin Trigger HC-SR04
const int echoPin = D7; // Pin Echo HC-SR04
const int buzPin = D5; // pin buzzer (active buzzer)
const int ledPin = D8; // pin LED
const int wifiLedPin = D0; // indikator WiFi STA mode
String command; // String untuk menyimpan perintah
String lastCommand = ""; // Menyimpan perintah terakhir dari remote
ESP8266WebServer server(80); // Webserver pada port 80
unsigned long previousMillis = 0;
unsigned long lastRemoteTime = 0; // Waktu terakhir menerima perintah remote
bool autoMode = false; // Mode automatic ultrasonic
const unsigned long AUTO_MODE_DELAY = 5000; // 5 detik delay sebelum auto mode
const int OBSTACLE_DISTANCE = 10; // Jarak obstacle 10 cm
// WiFi Credentials - ISI DENGAN SSID DAN PASSWORD ANDA
const char* sta_ssid = "NAMA_WIFI_ANDA"; // Ganti dengan SSID WiFi Anda
const char* sta_password = "PASSWORD_WIFI_ANDA"; // Ganti dengan password WiFi Anda
// Deklarasi fungsi
void HTTP_handleRoot(void);
void stopMotor();
void maju();
void mundur();
void putarKanan();
void putarKiri();
void majuKiri();
void mundurKiri();
void majuKanan();
void mundurKanan();
void bunyiBuzzer();
void nyalaLampu();
void matiLampu();
long bacaJarakUltrasonic();
void handleAutoMode();
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("WiFi Robot Remote Control Mode - WITH ULTRASONIC");
Serial.println("--------------------------------------");
// Setup pin mode
pinMode(buzPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(wifiLedPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(buzPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(wifiLedPin, HIGH);
// Setup pin motor
pinMode(GEAR_KIRI_MAJU, OUTPUT);
pinMode(GEAR_KIRI_MUNDUR, OUTPUT);
pinMode(GEAR_KANAN_MAJU, OUTPUT);
pinMode(GEAR_KANAN_MUNDUR, OUTPUT);
// Matikan semua motor - State awal
stopMotor();
// Setup hostname berdasarkan chip ID
String chip_id = String(ESP.getChipId(), HEX);
int i = chip_id.length()-4;
chip_id = chip_id.substring(i);
String hostname = "wificar-" + chip_id;
Serial.println("Hostname: " + hostname);
// Koneksi WiFi STA mode
WiFi.mode(WIFI_STA);
WiFi.begin(sta_ssid, sta_password);
Serial.println("");
Serial.print("Connecting to: ");
Serial.println(sta_ssid);
Serial.print("Password: ");
Serial.println(sta_password);
// Tunggu koneksi WiFi 10 detik
unsigned long currentMillis = millis();
previousMillis = currentMillis;
while (WiFi.status() != WL_CONNECTED && currentMillis - previousMillis <= 10000) {
delay(500);
Serial.print(".");
currentMillis = millis();
}
// Jika gagal konek, mode AP
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi-STA-Mode");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
digitalWrite(wifiLedPin, LOW); // LED nyala saat STA mode
} else {
WiFi.mode(WIFI_AP);
WiFi.softAP(hostname.c_str());
Serial.println("\nWiFi failed to: " + String(sta_ssid));
Serial.println("WiFi-AP-Mode");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
digitalWrite(wifiLedPin, HIGH); // LED mati saat AP mode
}
server.on("/", HTTP_handleRoot);
server.onNotFound(HTTP_handleRoot);
server.begin();
ArduinoOTA.begin();
// Inisialisasi waktu terakhir remote
lastRemoteTime = millis();
bunyiBuzzer(); // Indikator startup
}
void loop() {
ArduinoOTA.handle();
server.handleClient();
command = server.arg("State");
if (command != "") {
lastCommand = command;
lastRemoteTime = millis(); // Reset timer auto mode
autoMode = false; // Keluar dari auto mode
if (command == "F") maju();
else if (command == "B") mundur();
else if (command == "L") putarKanan();
else if (command == "R") putarKiri();
else if (command == "G") majuKiri();
else if (command == "H") mundurKiri();
else if (command == "I") majuKanan();
else if (command == "J") mundurKanan();
else if (command == "S") stopMotor();
else if (command == "V") bunyiBuzzer();
else if (command == "W") nyalaLampu();
else if (command == "w") matiLampu();
} else {
// Jika tidak ada perintah remote, cek apakah sudah waktunya auto mode
if (!autoMode && (millis() - lastRemoteTime > AUTO_MODE_DELAY)) {
autoMode = true;
Serial.println("Auto Mode Activated - Ultrasonic");
bunyiBuzzer(); // Indikator masuk auto mode
}
// Jika dalam auto mode, handle pergerakan ultrasonic
if (autoMode) {
handleAutoMode();
}
}
delay(50); // Delay sedikit lebih lama untuk stabilitas
}
void HTTP_handleRoot(void) {
server.send(200, "text/html", "");
if(server.hasArg("State")) {
Serial.println(server.arg("State"));
}
}
// Fungsi membaca jarak dari HC-SR04
long bacaJarakUltrasonic() {
long duration, distance;
// Clear trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Set trigPin HIGH untuk 10 microsecond
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Baca echoPin, mengembalikan waktu tempuh suara dalam microsecond
duration = pulseIn(echoPin, HIGH, 30000); // Timeout 30ms
// Hitung jarak (dalam cm)
distance = duration * 0.034 / 2;
// Jika timeout atau jarak tidak valid, return -1
if (duration == 0 || distance > 400) {
return -1;
}
return distance;
}
// Fungsi handle auto mode dengan ultrasonic
void handleAutoMode() {
long jarak = bacaJarakUltrasonic();
if (jarak != -1) {
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
// Jika ada obstacle dalam jarak 10 cm atau kurang
if (jarak <= OBSTACLE_DISTANCE && jarak > 0) {
Serial.println("Obstacle detected! Moving...");
maju(); // Bergerak maju menghindari obstacle
} else {
Serial.println("No obstacle, stopping...");
stopMotor(); // Berhenti jika tidak ada obstacle
}
} else {
Serial.println("Error reading ultrasonic sensor");
stopMotor();
}
delay(100); // Delay antara pembacaan ultrasonic
}
// Fungsi kontrol motor yang disederhanakan
void stopMotor() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void maju() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundur() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void putarKanan() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void putarKiri() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void majuKiri() {
digitalWrite(GEAR_KIRI_MAJU, HIGH);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundurKiri() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, HIGH);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void majuKanan() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, HIGH);
digitalWrite(GEAR_KANAN_MUNDUR, LOW);
}
void mundurKanan() {
digitalWrite(GEAR_KIRI_MAJU, LOW);
digitalWrite(GEAR_KIRI_MUNDUR, LOW);
digitalWrite(GEAR_KANAN_MAJU, LOW);
digitalWrite(GEAR_KANAN_MUNDUR, HIGH);
}
void bunyiBuzzer() {
digitalWrite(buzPin, HIGH);
delay(150);
digitalWrite(buzPin, LOW);
delay(80);
}
void nyalaLampu() {
digitalWrite(ledPin, HIGH);
}
void matiLampu() {
digitalWrite(ledPin, LOW);
}
PENJELASAN CODING ROBOT KENDALI WIFI
KONSEP DASAR:
Coding ini membuat robot yang dikendalikan via WiFi menggunakan NodeMCU ESP8266. Robot dapat menerima perintah dari aplikasi "WIFI ROBOT RC" melalui koneksi WiFi dan menggerakkan motor sesuai perintah yang diterima.
KOMPONEN UTAMA DALAM CODING:
Koneksi WiFi - Robot bisa berjalan dalam mode STA (terhubung ke router) atau AP (membuat hotspot sendiri)
Web Server - Melayani perintah HTTP dari aplikasi remote control
Kontrol Motor - Menggerakkan motor DC melalui driver L298N
Fitur Tambahan - Buzzer, LED, dan OTA update firmware
PENJELASAN PIN DAN WIRING:
Koneksi Motor Driver L298N:
NodeMCU D1 → IN1 L298N (Motor A - Direction)
NodeMCU D2 → IN2 L298N (Motor A - Direction)
NodeMCU D3 → IN3 L298N (Motor B - Direction)
NodeMCU D4 → IN4 L298N (Motor B - Direction)
NodeMCU D6 → ENA L298N (Motor A - PWM) - saat ini tidak aktif
NodeMCU D7 → ENB L298N (Motor B - PWM) - saat ini tidak aktif
Koneksi Motor ke L298N:
Motor kiri terhubung ke OUT1 dan OUT2 L298N
Motor kanan terhubung ke OUT3 dan OUT4 L298N
Koneksi Komponen Lain:
NodeMCU D5 → Buzzer aktif
NodeMCU D8 → LED depan robot
NodeMCU D0 → LED status koneksi WiFi
CARA PENGGUNAAN LENGKAP:
LANGKAH 1 - PERSIAPAN HARDWARE:
Rangkai kedua motor DC dengan driver L298N
Hubungkan NodeMCU ke L298N sesuai wiring di atas
Berikan power external 7-12V ke L298N untuk motor
Pastikan ground L298N dan NodeMCU disatukan
Pasang buzzer dan LED sesuai pin yang ditentukan
LANGKAH 2 - UPLOAD CODING:
Buka Arduino IDE versi 2.2.1
Pilih board "LOLIN(WEMOS) D1 mini Lite"
Upload coding ke NodeMCU
Buka Serial Monitor dengan baud rate 115200
LANGKAH 3 - KONEKSI WIFI:
Robot akan otomatis mencoba terkoneksi ke WiFi "www.asu86.com"
Jika berhasil, Serial Monitor akan menampilkan IP address
Jika gagal, robot akan membuat hotspot dengan nama "wificar-xxxx"
Catat IP address yang ditampilkan di Serial Monitor
LANGKAH 4 - KENDALI VIA APLIKASI:
Install aplikasi "WIFI ROBOT RC" di smartphone Android
Buka aplikasi dan pilih mode "WiFi Mode"
Masukkan IP address yang didapat dari Serial Monitor
Gunakan joystick atau tombol pada aplikasi untuk mengontrol robot
FITUR DAN FUNGSI TOMBOL:
KONTROL GERAKAN:
Tombol F = Maju (Forward)
Tombol B = Mundur (Backward)
Tombol L = Belok Kiri (Left)
Tombol R = Belok Kanan (Right)
Tombol G = Maju Kiri (Forward Left)
Tombol H = Mundur Kiri (Backward Left)
Tombol I = Maju Kanan (Forward Right)
Tombol J = Mundur Kanan (Backward Right)
Tombol S = Berhenti (Stop)
KONTROL KECEPATAN:
Tombol 0 = Kecepatan 330
Tombol 1 = Kecepatan 400
Tombol 2 = Kecepatan 470
Tombol 3 = Kecepatan 540
Tombol 4 = Kecepatan 610
Tombol 5 = Kecepatan 680
Tombol 6 = Kecepatan 750
Tombol 7 = Kecepatan 820
Tombol 8 = Kecepatan 890
Tombol 9 = Kecepatan 960
Tombol q = Kecepatan maksimal 1023
FITUR TAMBAHAN:
Tombol V = Bunyikan buzzer (Beep)
Tombol W = Nyalakan LED depan
Tombol w = Matikan LED depan
PENJELASAN FUNGSI GERAKAN ROBOT:
GERAKAN MAJU:
Motor kiri dan kanan berputar maju secara bersamaan dengan mengatur:
D1 HIGH, D2 LOW untuk motor kiri
D3 HIGH, D4 LOW untuk motor kanan
GERAKAN MUNDUR:
Motor kiri dan kanan berputar mundur secara bersamaan dengan mengatur:
D1 LOW, D2 HIGH untuk motor kiri
D3 LOW, D4 HIGH untuk motor kanan
BELOK KANAN:
Hanya motor kanan yang berputar maju:
Motor kiri: D1 LOW, D2 LOW (berhenti)
Motor kanan: D3 HIGH, D4 LOW (maju)
BELOK KIRI:
Hanya motor kiri yang berputar maju:
Motor kiri: D1 HIGH, D2 LOW (maju)
Motor kanan: D3 LOW, D4 LOW (berhenti)
GERAKAN DIAGONAL:
Kombinasi putaran motor yang berbeda untuk gerakan maju/mundur sambil belok
KEUNGGULAN SISTEM INI:
Dual Mode WiFi - Bisa terkoneksi ke router atau membuat hotspot sendiri
OTA Update - Dapat update firmware melalui WiFi tanpa kabel USB
Responsif - Perintah dari aplikasi langsung diproses tanpa delay
Multi Level Kecepatan - 10 level kecepatan yang dapat disesuaikan
Fitur Lengkap - Dilengkapi LED, buzzer, dan indikator status WiFi
Stabil - Web server yang handal untuk koneksi yang stabil
TROUBLESHOOTING MASALAH UMUM:
Jika motor tidak berjalan: Periksa koneksi power external ke L298N
Jika tidak bisa connect WiFi: Pastikan SSID dan password sudah benar
Jika aplikasi tidak connect: Cek IP address yang ditampilkan di Serial Monitor
Jika gerakan salah: Periksa wiring motor ke L298N dan urutan kabelnya
Jika buzzer/LED tidak bekerja: Pastikan menggunakan komponen yang sesuai
CATATAN PENTING:
Driver L298N membutuhkan power external terpisah untuk motor
Ground NodeMCU dan L298N harus disambungkan
Kecepatan motor dapat disesuaikan dengan tombol 0-9 dan q
Robot sudah siap digunakan setelah mendapatkan IP address dan terkoneksi dengan aplikasi
Dengan mengikuti semua langkah di atas, robot WiFi Anda akan berfungsi dengan baik dan siap dikendalikan melalui aplikasi WIFI ROBOT RC dari jarak jauh.