OpenLab_Slave1_2Fans_Working — 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 <Wire.h>
#include <PubSubClient.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>

// ---------------- SLAVE CONFIGURATION ----------------

#define SLAVE_ID 3

#define RPM_PIN_1 34
#define RPM_PIN_2 35

#define SDA_PIN 21
#define SCL_PIN 22

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

// ---------------- WIFI AND MQTT ----------------

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

WiFiClient espClient;
PubSubClient mqttClient(espClient);

// ---------------- SENSOR OBJECTS ----------------

Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;

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

// ---------------- SENSOR VARIABLES ----------------

float vibration1 = 0.0;
float vibration2 = 0.0;

int rpm1 = 0;
int rpm2 = 0;

String status1 = "NORMAL";
String status2 = "NORMAL";

bool mpu1Ready = false;
bool mpu2Ready = false;

bool oledReady = false;

const float VIBRATION_THRESHOLD = 0.50;

// ---------------- TIMERS ----------------

unsigned long lastSensorTime = 0;
unsigned long lastHeartbeatTime = 0;

unsigned long sensorInterval = 1000;
unsigned long heartbeatInterval = 2000;

// ---------------- WIFI CONNECTION ----------------

void connectWiFi() {

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

  WiFi.begin(WIFI_SSID);

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

  Serial.println();
  Serial.println("WiFi Connected!");

  Serial.print("Slave 3 IP Address: ");
  Serial.println(WiFi.localIP());
}

// ---------------- MQTT CONNECTION ----------------

void connectMQTT() {

  while (!mqttClient.connected()) {

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

    if (mqttClient.connect("SLAVE3_ESP32")) {

      Serial.println("MQTT Connected!");

    } else {

      Serial.print("MQTT connection failed. State: ");
      Serial.println(mqttClient.state());

      delay(2000);
    }
  }
}

// ---------------- VIBRATION CALCULATION ----------------

float calculateVibration(Adafruit_MPU6050 &mpu, bool sensorReady) {

  if (!sensorReady) {
    return 0.0;
  }

  sensors_event_t accel;
  sensors_event_t gyro;
  sensors_event_t temperature;

  mpu.getEvent(&accel, &gyro, &temperature);

  float magnitude = sqrt(
    accel.acceleration.x * accel.acceleration.x +
    accel.acceleration.y * accel.acceleration.y +
    accel.acceleration.z * accel.acceleration.z
  );

  float vibration = fabs(magnitude - 9.81) / 9.81;

  return vibration;
}

// ---------------- RPM CALCULATION ----------------

int calculateRPM(int pin) {

  int sensorValue = analogRead(pin);

  int rpm = map(sensorValue, 0, 4095, 800, 1600);

  return rpm;
}

// ---------------- FAN CLASSIFICATION ----------------

String classifyFan(float vibration) {

  if (vibration > VIBRATION_THRESHOLD) {
    return "IMBALANCE"

More projects by sravanalakshmigangisetty