OpenLab_Slave_master_perfect (master failure detection) (rpmdepend) — ESP32 simulation

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

Components

Sketch code

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

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <math.h>

// CHANGE ONLY THIS ID FOR EACH SLAVE
#define SLAVE_ID 3

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);

// RPM INPUT PINS
#define FAN1_RPM_PIN 34
#define FAN2_RPM_PIN 35

// I2C PINS
#define SDA_PIN 21
#define SCL_PIN 22

// OLED SETTINGS
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDRESS 0x3C

Adafruit_SSD1306 display(
  SCREEN_WIDTH,
  SCREEN_HEIGHT,
  &Wire,
  -1
);

bool oledReady = false;

// MPU6050 SENSORS
Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;

bool mpu1Ready = false;
bool mpu2Ready = false;

// FAN VALUES
int rpm1 = 0;
int rpm2 = 0;

float vibration1 = 0;
float vibration2 = 0;

float actualVibration1 = 0;
float actualVibration2 = 0;

float simulatedVibration1 = 0;
float simulatedVibration2 = 0;

String condition1 = "NORMAL";
String condition2 = "NORMAL";

// EXISTING CONDITION THRESHOLD
const float VIBRATION_THRESHOLD = 0.50;

// RPM-DEPENDENT DEMONSTRATION SETTINGS
const float REFERENCE_RPM = 1600.0;
const float SIMULATED_IMBALANCE_LEVEL = 0.60;

bool slaveEnabled = true;

bool backupMaster = false;
bool masterIsOffline = false;

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

String remoteFanData[3][2];

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

unsigned long lastMasterHeartbeat = 0;
const unsigned long MASTER_TIMEOUT = 8000;

unsigned long lastUpdate = 0;
const unsigned long UPDATE_INTERVAL = 5000;

unsigned long lastBackupDisplay = 0;
const unsigned long BACKUP_DISPLAY_INTERVAL = 5000;

int backupDisplaySlave = 1;


// -----------------------------------------
// MQTT TOPICS
// -----------------------------------------

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

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


// -----------------------------------------
// SLAVE OFF DISPLAY
// -----------------------------------------

void showSlaveOff() {

  Serial.println();
  Serial.print("          SLAVE ");
  Serial.print(SLAVE_ID);
  Serial.println(" IS OFF");

  Serial.println("---------------------------------");
  Serial.println("Fan monitoring stopped.");
  Serial.println("Waiting for ON command.");

  if (oledReady) {

    display.clearDisplay();

    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);

    display.setCursor(0, 0);

    display.print("SLAVE ");
    display.println(SLAVE_ID);

    display.println();
    display.println("STATUS: OFF");
    display.println();
    displ

More projects by sravanalakshmigangisetty