#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Lebar layar OLED dalam piksel
#define SCREEN_HEIGHT 64 // Tinggi layar OLED dalam piksel
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int BUTTON_UP_PIN = 2; // Pin digital untuk push button ke atas
const int BUTTON_DOWN_PIN = 3; // Pin digital untuk push button ke bawah
const int BUZZER_PIN = 4; // Pin untuk buzzer
const int LED_PIN = 5; // Pin untuk LED
const int PLAYER_SIZE = 5; // Ukuran pemain
int playerX, playerY; // Koordinat pemain
const int OBSTACLE_SIZE = 5; // Ukuran objek penghalang
int obstacleX, obstacleY; // Koordinat objek penghalang
const int OBSTACLE_SPEED = 1; // Kecepatan gerak objek penghalang
void setup() {
Serial.begin(9600);
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
randomSeed(analogRead(0));
initGame();
}
void loop() {
readInput();
moveObstacle();
checkCollision();
updateDisplay();
delay(100);
}
void initGame() {
playerX = SCREEN_WIDTH / 2;
playerY = SCREEN_HEIGHT / 2;
obstacleX = random(0, SCREEN_WIDTH - OBSTACLE_SIZE);
obstacleY = random(0, SCREEN_HEIGHT - OBSTACLE_SIZE);
}
void readInput() {
// Baca input dari push button
if (digitalRead(BUTTON_UP_PIN) == LOW) {
playerY--;
} else if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
playerY++;
}
}
void moveObstacle() {
// Gerakkan objek penghalang secara horizontal
obstacleX += OBSTACLE_SPEED;
if (obstacleX >= SCREEN_WIDTH) {
obstacleX = -OBSTACLE_SIZE;
obstacleY = random(0, SCREEN_HEIGHT - OBSTACLE_SIZE);
}
}
void checkCollision() {
// Periksa tabrakan antara pemain dan objek penghalang
if (playerX < obstacleX + OBSTACLE_SIZE &&
playerX + PLAYER_SIZE > obstacleX &&
playerY < obstacleY + OBSTACLE_SIZE &&
playerY + PLAYER_SIZE > obstacleY) {
// Jika terjadi tabrakan
// Aktifkan LED dan buzzer untuk beberapa saat
for (int i = 0; i < 5; i++) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
delay(100);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
delay(100);
}
// Inisialisasi ulang permainan setelah tabrakan
initGame();
}
}
void updateDisplay() {
// Hapus tampilan sebelumnya
display.clearDisplay();
// Gambar pemain
display.fillRect(playerX, playerY, PLAYER_SIZE, PLAYER_SIZE, SSD1306_WHITE);
// Gambar objek penghalang
display.fillRect(obstacleX, obstacleY, OBSTACLE_SIZE, OBSTACLE_SIZE, SSD1306_WHITE);
// Tampilkan perubahan pada layar OLED
display.display();
}