#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define JOY1_X 34  // Player 1 joystick X-axis
#define JOY2_X 35  // Player 2/Bot joystick X-axis
#define BUTTON 32  // Button to toggle bot mode

bool botMode = false;

int paddleWidth = 20, paddleHeight = 4;
int ballSize = 4;
int paddle1X = 54, paddle2X = 54;
int ballX = 62, ballY = 32, ballSpeedX = 2, ballSpeedY = 2;

void setup() {
    pinMode(BUTTON, INPUT_PULLUP);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        while (1);
    }
    display.clearDisplay();
}

void loop() {
    if (digitalRead(BUTTON) == LOW) {
        botMode = !botMode;
        delay(500);
    }

    int joy1X = analogRead(JOY1_X);
    paddle1X = map(joy1X, 0, 4095, 0, SCREEN_WIDTH - paddleWidth);
    
    if (botMode) {
        paddle2X = ballX - paddleWidth / 2; // Simple AI to track ball
    } else {
        int joy2X = analogRead(JOY2_X);
        paddle2X = map(joy2X, 0, 4095, 0, SCREEN_WIDTH - paddleWidth);
    }

    ballX += ballSpeedX;
    ballY += ballSpeedY;

    if (ballX <= 0 || ballX >= SCREEN_WIDTH - ballSize) ballSpeedX = -ballSpeedX;
    if (ballY <= 0) ballSpeedY = -ballSpeedY;
    
    if (ballY >= SCREEN_HEIGHT - paddleHeight - ballSize) {
        if (ballX >= paddle1X && ballX <= paddle1X + paddleWidth) ballSpeedY = -ballSpeedY;
    }
    
    if (ballY <= paddleHeight) {
        if (ballX >= paddle2X && ballX <= paddle2X + paddleWidth) ballSpeedY = -ballSpeedY;
    }

    display.clearDisplay();
    display.fillRect(paddle1X, SCREEN_HEIGHT - paddleHeight, paddleWidth, paddleHeight, SSD1306_WHITE);
    display.fillRect(paddle2X, 0, paddleWidth, paddleHeight, SSD1306_WHITE);
    display.fillRect(ballX, ballY, ballSize, ballSize, SSD1306_WHITE);
    display.display();
    
    delay(10);
}
Loading
esp32-devkit-c-v4
Loading
ssd1306
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND
joystick2:VCC
joystick2:VERT
joystick2:HORZ
joystick2:SEL
joystick2:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r