#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "New Boys Hostel";
const char* password = "nithostel%boys";
const char* mqtt_server = "broker.hivemq.com";
const char* topic_brake = "train/command/brake";
const char* topic_obstacle = "train/sensor/obstacle";
const int stepPin = 17;
const int dirPin = 16;
const int enablePin = 19;
const int trigPin = 5;
const int echoPin = 18;
long duration;
int distance;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(dirPin, HIGH);
digitalWrite(enablePin, LOW);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin("New Boys Hostel"," nithostel%boys");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("WiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message arrived: ");
Serial.println(message);
if (String(topic) == topic_brake) {
if (message == "STOP") {
stopMotor();
} else if (message == "START") {
startMotor();
}
}
}
void startMotor() {
digitalWrite(enablePin, LOW);
digitalWrite(dirPin, HIGH);
for (int i = 0; i < 2000; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
Serial.println("Motor started!");
}
void stopMotor() {
digitalWrite(enablePin, HIGH);
Serial.println("Motor stopped!");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance < 20) {
String obstacleMsg = String(distance);
client.publish(topic_obstacle, obstacleMsg.c_str());
Serial.println("Obstacle detected: " + obstacleMsg + " cm");
}
delay(2000);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
client.subscribe(topic_brake);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}