#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
esp32-devkit-c-v4
Loading
ssd1306
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