📝 Step 4: Complete ESP32 MQTT Sketch
Complete working ESP32 sketch jisme WiFi + MQTT + Relay Control + Telemetry sab kuch hai:
#include <WiFi.h>
#include <PubSubClient.h>
const char* WIFI_SSID = "Airtel_Yarana";
const char* WIFI_PASSWORD = "Abhishek@7052";
const char* MQTT_BROKER = "192.168.1.6";
const int MQTT_PORT = 1883;
const char* MQTT_USER = "";
const char* MQTT_PASSWORD = "";
const char* DEVICE_ID = "esp32-001";
const char* TOPIC_CMD = "home/relay/esp32-001/command";
const char* TOPIC_STATUS = "home/relay/esp32-001/status";
const char* TOPIC_TELEMETRY = "home/relay/esp32-001/telemetry";
const char* TOPIC_RESPONSE = "home/relay/esp32-001/response";
const int RELAY_PIN = 26;
const int LED_PIN = 2;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
bool relayState = false;
unsigned long lastTelemetry = 0;
unsigned long lastWiFiRetry = 0;
const int TELEMETRY_INTERVAL = 30000;
void setup() {
Serial.begin(115200);
Serial.println("ESP32 MQTT Relay Starting...");
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
setupWiFi();
mqttClient.setServer(MQTT_BROKER, MQTT_PORT);
mqttClient.setCallback(mqttCallback);
Serial.println("✅ Setup Complete!");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
if (millis() - lastWiFiRetry > 10000) {
lastWiFiRetry = millis();
Serial.println("WiFi disconnected. Connecting again...");
setupWiFi();
}
delay(100);
return;
}
if (!mqttClient.connected()) {
reconnectMQTT();
}
mqttClient.loop();
if (millis() - lastTelemetry > TELEMETRY_INTERVAL) {
sendTelemetry();
lastTelemetry = millis();
}
delay(10);
}
void setupWiFi() {
Serial.print("Connecting to WiFi: ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(500);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 30) {
delay(500);
Serial.print(".");
digitalWrite(LED_PIN, millis() % 1000 < 500 ? HIGH : LOW);
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("WiFi Connected!");
Serial.printf("IP: %s\n", WiFi.localIP().toString().c_str());
Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
digitalWrite(LED_PIN, HIGH);
} else {
Serial.println();
Serial.println("WiFi Failed!");
}
}
void reconnectMQTT() {
while (!mqttClient.connected()) {
Serial.print("MQTT connecting...");
char clientID[50];
snprintf(clientID, sizeof(clientID), "%s-%d", DEVICE_ID, millis());
bool connected;
if (strlen(MQTT_USER) > 0) {
connected = mqttClient.connect(clientID, MQTT_USER, MQTT_PASSWORD);
} else {
connected = mqttClient.connect(clientID);
}
if (connected) {
Serial.println(" Connected!");
mqttClient.subscribe(TOPIC_CMD);
Serial.printf("Subscribed: %s\n", TOPIC_CMD);
mqttClient.publish(TOPIC_STATUS, "{\"state\":\"online\"}", true);
} else {
Serial.printf(" Failed (rc=%d)\n", mqttClient.state());
delay(5000);
}
}
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
char msg[length + 1];
memcpy(msg, payload, length);
msg[length] = '\0';
Serial.printf("[%s]: %s\n", topic, msg);
if (strcmp(msg, "ON") == 0) {
relayState = true;
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
Serial.println("Relay: ON");
mqttClient.publish(TOPIC_RESPONSE, "{\"result\":\"ok\",\"relay\":\"on\"}");
publishStatus();
}
else if (strcmp(msg, "OFF") == 0) {
relayState = false;
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Serial.println("Relay: OFF");
mqttClient.publish(TOPIC_RESPONSE, "{\"result\":\"ok\",\"relay\":\"off\"}");
publishStatus();
}
else if (strcmp(msg, "TOGGLE") == 0) {
relayState = !relayState;
digitalWrite(RELAY_PIN, relayState ? HIGH : LOW);
digitalWrite(LED_PIN, relayState ? HIGH : LOW);
Serial.printf("Relay: %s\n", relayState ? "ON" : "OFF");
char response[100];
snprintf(response, sizeof(response),
"{\"result\":\"ok\",\"relay\":\"%s\"}", relayState ? "on" : "off");
mqttClient.publish(TOPIC_RESPONSE, response);
publishStatus();
}
else if (strcmp(msg, "STATUS") == 0) {
Serial.println("Status requested");
publishStatus();
}
}
void publishStatus() {
char payload[200];
snprintf(payload, sizeof(payload),
"{\"device\":\"%s\",\"relay\":%s,\"rssi\":%d,\"uptime\":%lu,\"ip\":\"%s\"}",
DEVICE_ID,
relayState ? "\"on\"" : "\"off\"",
WiFi.RSSI(),
millis() / 1000,
WiFi.localIP().toString().c_str()
);
mqttClient.publish(TOPIC_STATUS, payload, true);
Serial.printf("Status: %s\n", payload);
}
void sendTelemetry() {
char payload[200];
snprintf(payload, sizeof(payload),
"{\"device\":\"%s\",\"rssi\":%d,\"uptime\":%lu,\"freeheap\":%lu}",
DEVICE_ID,
WiFi.RSSI(),
millis() / 1000,
(unsigned long) ESP.getFreeHeap()
);
mqttClient.publish(TOPIC_TELEMETRY, payload);
Serial.printf("Telemetry: %s\n", payload);
}
💡
Testing the ESP32:
1. Upload sketch to ESP32
2. Open Serial Monitor at 115200 baud
3. From another terminal: `mosquitto_pub -h 192.168.1.6 -t "home/relay/esp32-001/command" -m "ON"`
4. ESP32 will respond and relay will activate!