#include <Arduino.h>
#include <WiFi.h>
#include "PubSubClient.h"
#include "ESP32Servo.h"
// WiFi dan MQTT
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
int port = 1883;
String stMac;
char mac[50];
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
// Servo
Servo servo1, servo2, servo3, servo4, servo5;
const int pinServo1 = 25;
const int pinServo2 = 26;
const int pinServo3 = 27;
const int pinServo4 = 14;
const int pinServo5 = 12;
unsigned long previousMillis = 0;
const long interval = 5000;
// Deklarasi fungsi sebelum digunakan
void wifiConnect();
void callback(char* topic, byte* message, unsigned int length);
void mqttReconnect();
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0));
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
stMac = WiFi.macAddress();
stMac.replace(":", "_");
Serial.println(stMac);
client.setServer(mqttServer, port);
client.setCallback(callback);
// Hubungkan servo ke pin yang benar
servo1.attach(pinServo1);
servo2.attach(pinServo2);
servo3.attach(pinServo3);
servo4.attach(pinServo4);
servo5.attach(pinServo5);
// Set posisi awal servo ke 90 derajat
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
Serial.print(".");
}
}
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
client.subscribe("OpenCV-IoT6601");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
unsigned long currentMillis = millis();
while (millis() - currentMillis < 5000) {
client.loop();
}
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("\n--- MQTT MESSAGE RECEIVED ---\n");
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Message: ");
String receivedMessage = "";
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)message[i]);
receivedMessage += (char)message[i];
}
Serial.println("\n----------------------------");
if (length >= 5) {
// Jika '1', putar servo ke 180 derajat, jika '0' putar ke 90 derajat
servo1.write((receivedMessage[0] == '1') ? 180 : 90);
servo2.write((receivedMessage[1] == '1') ? 180 : 90);
servo3.write((receivedMessage[2] == '1') ? 180 : 90);
servo4.write((receivedMessage[3] == '1') ? 180 : 90);
servo5.write((receivedMessage[4] == '1') ? 180 : 90);
}
}
void loop() {
unsigned long currentMillis = millis();
if (!client.connected()) {
mqttReconnect();
}
client.loop();
}