#include <esp_now.h>
#include <WiFi.h>
// MAC Address of the Receiver ESP32 (Update with your receiver's MAC)
uint8_t receiverMAC[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
typedef struct ControllerPayload {
uint16_t leftStickX;
uint16_t leftStickY;
uint16_t rightStickX;
uint16_t rightStickY;
uint8_t leftTrigger;
uint8_t rightTrigger;
bool btnA;
bool btnB;
bool btnX;
bool btnY;
bool btnLB;
bool btnRB;
bool btnBack;
bool btnStart;
bool btnGuide;
bool btnLS;
bool btnRS;
bool dpadUp;
bool dpadDown;
bool dpadLeft;
bool dpadRight;
} ControllerPayload;
ControllerPayload controllerData;
esp_now_peer_info_t peerInfo;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
memcpy(peerInfo.peer_addr, receiverMAC, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add receiver peer");
return;
}
// --- Pin Modes (Active LOW via Internal Pullups) ---
pinMode(0, INPUT_PULLUP); // Button A
pinMode(4, INPUT_PULLUP); // Button B
pinMode(16, INPUT_PULLUP); // Button X
pinMode(17, INPUT_PULLUP); // Button Y
pinMode(12, INPUT_PULLUP); // D-Pad Up
pinMode(14, INPUT_PULLUP); // D-Pad Left
pinMode(27, INPUT_PULLUP); // D-Pad Right
pinMode(26, INPUT_PULLUP); // D-Pad Down
pinMode(13, INPUT_PULLUP); // Bumper L (LB)
pinMode(5, INPUT_PULLUP); // Bumper R (RB)
pinMode(21, INPUT_PULLUP); //guide
pinMode(22, INPUT_PULLUP); //back
pinMode(23, INPUT_PULLUP); //start
pinMode(25, INPUT_PULLUP); //left_stick_click
pinMode(15, INPUT_PULLUP); //right_stick_click
}
void loop() {
// --- 1. Read Analog Joysticks & Triggers ---
controllerData.leftStickX = analogRead(36); // VP
controllerData.leftStickY = analogRead(39); // VN
controllerData.rightStickX = analogRead(34);
controllerData.rightStickY = analogRead(35);
// Triggers downscaled to 8-bit (0-255)
controllerData.leftTrigger = map(analogRead(32), 0, 4095, 0, 255);
controllerData.rightTrigger = map(analogRead(33), 0, 4095, 0, 255);
// --- 2. Read Digital Buttons (Active LOW) ---
controllerData.btnA = !digitalRead(0);
controllerData.btnB = !digitalRead(4);
controllerData.btnX = !digitalRead(16);
controllerData.btnY = !digitalRead(17);
controllerData.btnLB = !digitalRead(13);
controllerData.btnRB = !digitalRead(5);
controllerData.btnBack = !digitalRead(22);
controllerData.btnStart = !digitalRead(23);
controllerData.btnGuide = !digitalRead(21);
controllerData.btnLS = !digitalRead(25);
controllerData.btnRS = !digitalRead(15);
controllerData.dpadUp = !digitalRead(12);
controllerData.dpadDown = !digitalRead(26);
controllerData.dpadLeft = !digitalRead(14);
controllerData.dpadRight= !digitalRead(27);
// --- 3. Transmit Frame over ESP-NOW ---
esp_now_send(receiverMAC, (uint8_t *)&controllerData, sizeof(controllerData));
}