OpenLab_Slave1_2Fans_Working (copy) — ESP32 simulation

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

Components

Sketch code

/*
  COMMON MQTT SLAVE CODE

  Upload this code to all three Slave ESP32 boards.

  Change SLAVE_ID:
  Slave 1 -> 1
  Slave 2 -> 2
  Slave 3 -> 3

  MPU6050 connections:
  Fan 1 MPU6050 -> I2C address 0x68
  Fan 2 MPU6050 -> I2C address 0x69

  IMPORTANT:
  Set AD0 LOW on the first MPU6050.
  Set AD0 HIGH on the second MPU6050.
*/

#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 THIS FOR EACH SLAVE
#define SLAVE_ID 3


// WiFi and MQTT configuration
const char* WIFI_SSID = "Velxio-GUEST";

const char* MQTT_BROKER = "broker.hivemq.com";

const int MQTT_PORT = 1883;


// Pin configuration
#define FAN1_RPM_PIN 34
#define FAN2_RPM_PIN 35

#define SDA_PIN 21
#define SCL_PIN 22


// OLED configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_ADDRESS 0x3C
#define OLED_RESET -1


// MPU6050 I2C addresses
const uint8_t MPU1_ADDR = 0x68;
const uint8_t MPU2_ADDR = 0x69;


// Timing configuration
const unsigned long SENSOR_INTERVAL = 5000;

const unsigned long HEARTBEAT_INTERVAL = 2000;


// Vibration threshold
const float VIBRATION_THRESHOLD = 0.50;


// MQTT objects
WiFiClient espClient;

PubSubClient mqttClient(espClient);


// Sensor objects
Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;


// OLED object
Adafruit_SSD1306 display(
  SCREEN_WIDTH,
  SCREEN_HEIGHT,
  &Wire,
  OLED_RESET
);


// Sensor availability
bool mpu1Ready = false;
bool mpu2Ready = false;

bool oledReady = false;


// Fan measurements
int rpm1 = 0;
int rpm2 = 0;

float vibration1 = NAN;
float vibration2 = NAN;


// Fan status
String status1 = "SENSOR_ERROR";
String status2 = "SENSOR_ERROR";


// Timing variables
unsigned long lastSensor = 0;

unsigned long lastHeartbeat = 0;

unsigned long lastWiFiTry = 0;

unsigned long lastMQTTTry = 0;


// Generate heartbeat topic
String heartbeatTopic() {

  return "fanmonitor/slave" +
         String(SLAVE_ID) +
         "/heartbeat";
}


// Generate fan topic
String fanTopic(int fan) {

  return "fanmonitor/slave" +
         String(SLAVE_ID) +
         "/fan" +
         String(fan);
}


// Maintain WiFi connection
void maintainWiFi() {

  if (WiFi.status() == WL_CONNECTED ||
      millis() - lastWiFiTry < 5000)
    return;

  lastWiFiTry = millis();

  WiFi.mode(WIFI_STA);

  WiFi.begin(WIFI_SSID);

  Serial.printf(
    "Slave %d: attempting WiFi connection\n",
    SLAVE_ID
  );
}


// Publish heartbeat
void publishHeartbeat() {

  if (mqttClient.connected()) {

    mqttClient.publish(
      heartbeatTopic().c_str(),
      "ONLINE",
      true
    );
  }
}


// Maintain MQTT connection
void maintainMQTT() {

  if (mqttClient.connected() ||
      WiFi.status() != WL_CONNECTED ||
      millis() - lastMQTTTry < 3000)
    return;


  lastMQTTTry = millis();


  // Unique client ID for each ESP32
  String clientId =
    "SLAVE" +
    String(SLAVE_ID) +
    "_ESP32_" +
 

More projects by sravanalakshmigangisetty