#include <PubSubClient.h>
#include <WiFi.h>
#include <ESP32Servo.h>
#define ON 1
#define OFF 0
Servo myServo;
WiFiClient espClient;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "mqtt.netpie.io";
const int mqttPort = 1883;
const char* clientID = "c61fb73f-6caf-4bf0-87fe-2f87acd0104b";
const char* mqttUser = "4aigSaeuurMZaaV4Y7LyAcN8oriJiDVy";
const char* mqttPassword = "QZ1C9hMyy3TUNunCN2L5eKkoej3jXd1B";
const char* topic_pub = "@shadow/data/update";
const char* topic_sub = "@msg/lab_ict_kps/command";
String publishMessage;
PubSubClient client(espClient);
const int TRIGGER_PIN = 16;
const int ECHO_PIN = 17;
const int SERVO_PIN = 4;
const int button = 12;
int servo_status = OFF;
int current_mode = 0;
const int mode_1 = 32;
const int mode_2 = 33;
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
String clientId = clientID;
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
client.subscribe(topic_sub);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void messageReceivedCallback(char* topic, byte* payload, unsigned int length) {
char payloadMsg[80];
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
payloadMsg[i] = (char) payload[i];
}
payloadMsg[length] = '\0';
Serial.println();
Serial.println("-----------------------");
processMessage(payloadMsg);
}
void processMessage(String recvCommand) {
if (recvCommand == "SERVO_OPEN") {
myServo.write(180);
servo_status = ON;// Set Servo to 0 degrees (open position)
} else if (recvCommand == "SERVO_CLOSE") {
myServo.write(0);
servo_status = OFF; // Set Servo to 180 degrees (closed position)
}
// You can add more conditions for controlling the Servo based on other commands
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqttServer, mqttPort);
client.setCallback(messageReceivedCallback);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
myServo.attach(4);
servo_status = OFF;
pinMode(button, INPUT_PULLUP);
pinMode(mode_1, OUTPUT);
pinMode(mode_2, OUTPUT);
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
long duration, distance;
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
if(digitalRead(button) == 0){
current_mode = current_mode +1;
if (current_mode > 1){
current_mode = 0;
}
delay(100);
}
if (current_mode == 0)
{
int angle = map(distance, 2, 400, 0, 180);
myServo.write(angle);
digitalWrite(mode_1, HIGH);
digitalWrite(mode_2, LOW);
}
else if (current_mode == 1)
{
digitalWrite(mode_1, LOW);
digitalWrite(mode_2, HIGH);
}
String distanceStr = String(distance);
publishMessage = "{\"data\": {\"distance\": " + distanceStr + ",\"servo\":" + String(servo_status)+ "}}";
client.publish(topic_pub, publishMessage.c_str());
Serial.println(publishMessage);
delay(100);
}