Node2 3

*
  NODE 2 ESP32-C6  Light Chase Game (RIGHT node)
  MAC: B4:3A:45:89:F2:B4

  - D6 = GPIO16 = TOP LED
  - D2 = GPIO2  = BOTTOM LED
  - GPIO 0  = Hall sensor (LOW when magnet present)
  No speaker  speaker is on master only.
*/

#include <esp_now.h>
#include <WiFi.h>

#define LED_TOP    16
#define LED_BOTTOM 2
#define HALL_PIN   1
#define NODE_ID    2

// Master: 58:E6:C5:1A:7F:28
uint8_t masterMac[] = {0x58, 0xE6, 0xC5, 0x1A, 0x7F, 0x28};

typedef struct {
  int  nodeID;
  char type[8];
  int  value;
} OutgoingMsg;

typedef struct {
  char cmd[16];
} IncomingCmd;

bool lastHallState = false;

void sendHall(int val) {
  OutgoingMsg msg;
  msg.nodeID = NODE_ID;
  strncpy(msg.type, "HALL", sizeof(msg.type));
  msg.value = val;
  esp_now_send(masterMac, (uint8_t*)&msg, sizeof(msg));
}

void onReceive(const esp_now_recv_info_t *info, const uint8_t *data, int len) {
  IncomingCmd cmd;
  memcpy(&cmd, data, sizeof(cmd));

  if      (strcmp(cmd.cmd, "LED_TOP_ON")  == 0) digitalWrite(LED_TOP,    HIGH);
  else if (strcmp(cmd.cmd, "LED_TOP_OFF") == 0) digitalWrite(LED_TOP,    LOW);
  else if (strcmp(cmd.cmd, "LED_BOT_ON")  == 0) digitalWrite(LED_BOTTOM, HIGH);
  else if (strcmp(cmd.cmd, "LED_BOT_OFF") == 0) digitalWrite(LED_BOTTOM, LOW);
}

void setup() {
  pinMode(LED_TOP,    OUTPUT);
  pinMode(LED_BOTTOM, OUTPUT);
  pinMode(HALL_PIN,   INPUT_PULLUP);

  digitalWrite(LED_TOP,    LOW);
  digitalWrite(LED_BOTTOM, LOW);

  WiFi.mode(WIFI_STA);
  esp_now_init();
  esp_now_register_recv_cb(onReceive);

  esp_now_peer_info_t peer = {};
  memcpy(peer.peer_addr, masterMac, 6);
  peer.channel = 0;
  peer.encrypt = false;
  esp_now_add_peer(&peer);

  OutgoingMsg msg;
  msg.nodeID = NODE_ID;
  strncpy(msg.type, "STATUS", sizeof(msg.type));
  msg.value = 1;
  esp_now_send(masterMac, (uint8_t*)&msg, sizeof(msg));
}

void loop() {
  bool hallNow = (digitalRead(HALL_PIN) == LOW);
  if (hallNow != lastHallState) {
    lastHallState = hallNow;
    sendHall(hallNow ? 1 : 0);
  }
  delay(20);
}