OpenLab_Slave_master_perfect (master failure detection) (no com) — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by sravanalakshmigangisetty.

Components

Sketch code

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "Velxio-GUEST";
const char* MQTT_BROKER = "broker.hivemq.com";
const int MQTT_PORT = 1883;

const char* MASTER_STATUS_TOPIC = "fanmonitor/master/status";
const char* MASTER_HEARTBEAT_TOPIC = "fanmonitor/master/heartbeat";

WiFiClient espClient;
PubSubClient mqttClient(espClient);

String fanData[3][2];

bool fanReceived[3][2] = {
  {false, false},
  {false, false},
  {false, false}
};

bool slaveEnabled[3] = {true, true, true};

bool masterActive = true;

unsigned long lastDisplayTime = 0;
const unsigned long DISPLAY_INTERVAL = 5000;
int currentSlave = 0;

unsigned long lastHeartbeatTime = 0;
const unsigned long HEARTBEAT_INTERVAL = 2000;

String commandBuffer = "";

String getTopic(int slave, int fan) {
  return "fanmonitor/slave" + String(slave) +
         "/fan" + String(fan);
}

String getControlTopic(int slave) {
  return "fanmonitor/slave" + String(slave) +
         "/control";
}

void connectWiFi() {
  Serial.println("Connecting to WiFi...");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi Connected!");
  Serial.print("Master IP Address: ");
  Serial.println(WiFi.localIP());
}

void mqttCallback(char* topic, byte* payload, unsigned int length) {
  String message = "";

  for (unsigned int i = 0; i < length; i++) {
    message += (char)payload[i];
  }

  String receivedTopic = String(topic);

  for (int s = 1; s <= 3; s++) {
    for (int f = 1; f <= 2; f++) {
      if (receivedTopic == getTopic(s, f)) {
        fanData[s - 1][f - 1] = message;
        fanReceived[s - 1][f - 1] = true;
        return;
      }
    }
  }
}

void sendSlaveCommand(int slave, bool turnOn) {
  if (!mqttClient.connected()) {
    Serial.println("MQTT not connected. Slave command not sent.");
    return;
  }

  String topic = getControlTopic(slave);
  String command = turnOn ? "ON" : "OFF";

  if (mqttClient.publish(topic.c_str(), command.c_str())) {
    slaveEnabled[slave - 1] = turnOn;

    if (turnOn) {
      fanReceived[slave - 1][0] = false;
      fanReceived[slave - 1][1] = false;
      Serial.println("Slave ON command published. Waiting for fresh data.");
    } else {
      Serial.println("Slave OFF command published.");
    }

    Serial.print("SLAVE ");
    Serial.print(slave);
    Serial.print(" COMMAND: ");
    Serial.println(command);
  } else {
    Serial.println("Failed to publish Slave command.");
  }
}

void setMasterRole(bool turnOn) {
  if (!mqttClient.connected()) {
    Serial.println("MQTT not connected. Master role command not sent.");
    return;
  }

  if (!turnOn && !slaveEnabled[0]) {
    Serial.println("Cannot turn MASTER OFF: SLAVE 1 is marked OFF.");
    Serial.println("Turn SLAVE1 ON first.");
    return;
  }

  const char* state = turnOn ? "ON" : "OFF";

  if (mqttClient.publish(MASTER_STATUS_TOPIC, state, true)) {
    masterActive = turnOn;

More projects by sravanalakshmigangisetty