OpenLab_Slave1_2Fans_Working (slave failure detection) — 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>
#include <Wire.h>
#include <math.h>
#include <stdio.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// CHANGE THIS BEFORE UPLOADING:
// Slave 1 = 1, Slave 2 = 2, Slave 3 = 3
#define SLAVE_ID 3

// -------- Wi-Fi and MQTT --------
const char* WIFI_SSID = "Velxio-GUEST";
const char* WIFI_PASSWORD = "";

const char* MQTT_SERVER = "broker.hivemq.com";
const int MQTT_PORT = 1883;

WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);

// -------- Pins --------
#define RPM_PIN_FAN1 34
#define RPM_PIN_FAN2 35
#define SDA_PIN 21
#define SCL_PIN 22

// -------- Sensors --------
Adafruit_MPU6050 mpuFan1;
Adafruit_MPU6050 mpuFan2;

bool fan1SensorOK = false;
bool fan2SensorOK = false;

// -------- OLED --------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(
  SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET
);

bool oledOK = false;

// -------- Timings --------
const unsigned long HEARTBEAT_INTERVAL = 1000;
const unsigned long SENSOR_INTERVAL = 5000;
const unsigned long STATUS_INTERVAL = 2000;
const unsigned long WIFI_RETRY = 5000;
const unsigned long MQTT_RETRY = 3000;

unsigned long lastHeartbeat = 0;
unsigned long lastSensorUpdate = 0;
unsigned long lastStatusUpdate = 0;
unsigned long lastWiFiAttempt = 0;
unsigned long lastMQTTAttempt = 0;

// -------- Fan readings --------
float rpm1 = 0;
float rpm2 = 0;
float vibration1 = 0;
float vibration2 = 0;

// -------- MQTT topics and client ID --------
char heartbeatTopic[60];
char fan1Topic[60];
char fan2Topic[60];
char clientID[40];

void configureTopics() {
  snprintf(heartbeatTopic, sizeof(heartbeatTopic),
           "fanmonitor/slave%d/heartbeat", SLAVE_ID);

  snprintf(fan1Topic, sizeof(fan1Topic),
           "fanmonitor/slave%d/fan1", SLAVE_ID);

  snprintf(fan2Topic, sizeof(fan2Topic),
           "fanmonitor/slave%d/fan2", SLAVE_ID);

  snprintf(clientID, sizeof(clientID),
           "FAN_MONITOR_SLAVE_%d", SLAVE_ID);
}

// -------- Wi-Fi connection --------
void connectWiFi() {
  if (WiFi.status() == WL_CONNECTED) return;

  if (millis() - lastWiFiAttempt >= WIFI_RETRY) {
    lastWiFiAttempt = millis();

    Serial.println("Connecting to Wi-Fi...");
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  }
}

// -------- MQTT connection --------
void connectMQTT() {
  if (WiFi.status() != WL_CONNECTED || mqtt.connected()) return;

  if (millis() - lastMQTTAttempt < MQTT_RETRY) return;
  lastMQTTAttempt = millis();

  Serial.println("Connecting to MQTT...");

  if (mqtt.connect(clientID)) {
    Serial.print("SLAVE ");
    Serial.print(SLAVE_ID);
    Serial.println(" MQTT CONNECTED");

    // Send an immediate heartbeat after connection.
    if (mqtt.publish(heartbeatTopic, "1")) {
      lastHeartbeat = millis();
      Serial.println("Initial heartbeat sent");
    }
  } else {
    Serial.print("MQTT connection failed, state = ");
    Serial.println(mqtt.

More projects by sravanalakshmigangisetty