OpenLab_Slave1_2Fans_Working (espnow) — 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 <esp_now.h>
#include <esp_wifi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <esp_arduino_version.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C

#define ESPNOW_CHANNEL 1

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

typedef struct __attribute__((packed)) {
  uint8_t type;       // 0 = fan data, 1 = heartbeat
  uint8_t slaveID;
  uint8_t fanID;
  int rpm;
  float vibration;
  char status[12];
} FanPacket;

FanPacket fanData[3][2];

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

unsigned long lastHeartbeat[3] = {0};
unsigned long lastDisplayUpdate = 0;

int displayedSlave = 0;

#if ESP_ARDUINO_VERSION_MAJOR >= 3
void onDataReceive(const esp_now_recv_info_t *info,
                   const uint8_t *incomingData, int len) 
                   {
#else
void onDataReceive(const uint8_t *mac,
                   const uint8_t *incomingData, int len) }
#endif

  if (len != sizeof(FanPacket)) return;

  FanPacket packet;
  memcpy(&packet, incomingData, sizeof(packet));

  if (packet.slaveID < 1 || packet.slaveID > 3) return;

  int s = packet.slaveID - 1;

  if (packet.type == 1) {
    slaveOnline[s] = true;
    lastHeartbeat[s] = millis();
    return;
  }

  if (packet.type == 0 &&
      packet.fanID >= 1 &&
      packet.fanID <= 2) {

    fanData[s][packet.fanID - 1] = packet;
    fanReceived[s][packet.fanID - 1] = true;
    slaveOnline[s] = true;
    lastHeartbeat[s] = millis();
  }
}

void setup() {
  Serial.begin(115200);

  Wire.begin(21, 22);

  if (display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);
    display.setCursor(0, 0);
    display.println("ESP-NOW MASTER");
    display.println("Starting...");
    display.display();
  } else {
    Serial.println("Master OLED not found");
  }

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  esp_wifi_set_channel(ESPNOW_CHANNEL, WIFI_SECOND_CHAN_NONE);

  Serial.print("Master MAC: ");
  Serial.println(WiFi.macAddress());

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW initialization failed");
    return;
  }

  esp_now_register_recv_cb(onDataReceive);

  Serial.println("ESP-NOW Master ready");
  Serial.println("Waiting for slave data...");
}

void loop() {
  unsigned long now = millis();

  if (now - lastDisplayUpdate >= 2000) {
    lastDisplayUpdate = now;

    displayedSlave++;
    if (displayedSlave > 3) displayedSlave = 1;

    int s = displayedSlave - 1;

    Serial.println();
    Serial.print("========== SLAVE ");
    Serial.print(displayedSlave);
    Serial.println(" ==========");

    bool online = (now - lastHeartbeat[s] < 6000);

    Serial.print("Connection: ");
    Serial.println(online ? "ONLINE" : "OFFLINE");

    for (int f = 0; f < 2; f++) {
      if (fanReceived[s][f]) {
        Serial.print("Fan ");
        Serial.pr

More projects by sravanalakshmigangisetty