Hackster is hosting Impact Spotlights: Robotics. Watch the stream live on Thursday!Hackster is hosting Impact Spotlights: Robotics. Stream on Thursday!
irgiElfradaniMuhamad AzisQorianshaHendra KusumahSyahrun Noor
Published © GPL3+

Pacman Table Decorations XIAO ESP32-S3

Interactive table decoration with LED Matrix, displaying interesting animations such as Pac-Man and others.

BeginnerShowcase (no instructions)2 hours187
Pacman Table Decorations XIAO ESP32-S3

Things used in this project

Story

Read more

Schematics

schematics

Github

Code

PACMAN AND GHOST

C/C++
#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define CS_PIN D3
#define MAX_DEVICES 4

MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

const int NUM_COLS = MAX_DEVICES * 8;
bool dots[NUM_COLS];

// Sprite Pac-Man menghadap kanan (mulut terbuka)
byte pacman_open_right[8] = {
  B00111100,
  B01111110,
  B11111101,
  B11110111,
  B11100111,
  B11000011,
  B10000001,
  B01000010
};

// Sprite Pac-Man menghadap kiri (mulut terbuka)
byte pacman_open_left[8] = {
  B01000010,
  B10000001,
  B11000011,
  B11100111,
  B11101111,
  B11111011,
  B01111110,
  B00111100
};

// Pac-Man mulut tertutup (netral)
byte pacman_closed[8] = {
  B00111100,
  B01111110,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100
};

// Ghost menghadap kanan
byte ghost_right[8] = {
0b01111100,
  0b11100110,
  0b01111111,
  0b00100111,
  0b00100111,
  0b01111111,
  0b11100110,
  0b01111100
};

// Ghost menghadap kiri (dibalik horizontal secara manual)
byte ghost_left[8] = {
  0b01111100,
  0b11100110,
  0b01111111,
  0b00100111,
  0b00100111,
  0b01111111,
  0b11100110,
  0b01111100
};

// Fungsi menggambar Pac-Man
void drawPacman(int pos, bool mouthOpen, bool movingRight) {
  const byte* sprite;
  if (mouthOpen) {
    sprite = movingRight ? pacman_open_right : pacman_open_left;
  } else {
    sprite = pacman_closed;
  }

  for (int i = 0; i < 8; i++) {
    int col = pos + i;
    if (col >= 0 && col < NUM_COLS) {
      mx.setColumn(col, sprite[i]);
    }
  }
}

// Fungsi menggambar Ghost dengan arah sesuai Pac-Man
void drawGhost(int pos, bool movingRight) {
  const byte* sprite = movingRight ? ghost_right : ghost_left;

  for (int i = 0; i < 8; i++) {
    int col = pos + i;
    if (col >= 0 && col < NUM_COLS) {
      mx.setColumn(col, sprite[i]);
    }
  }
}

// Fungsi menggambar titik-titik (dot)
void drawDots() {
  for (int i = 0; i < NUM_COLS; i++) {
    if (dots[i]) {
      mx.setPoint(3, i, true);  // Titik di baris tengah
    }
  }
}

// Cek apakah dot dimakan Pac-Man
void checkDotEaten(int pacmanPos, bool movingRight) {
  int mouthCol = movingRight ? pacmanPos + 5 : pacmanPos + 2; // Posisi mulut
  if (mouthCol >= 0 && mouthCol < NUM_COLS && dots[mouthCol]) {
    dots[mouthCol] = false;
  }
}

void setup() {
  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, 5);
  mx.clear();

  // Inisialisasi semua titik
  for (int i = 0; i < NUM_COLS; i++) {
    dots[i] = false;
  }
  for (int i = 4; i < NUM_COLS; i += 6) {
    dots[i] = true;
  }
}

void loop() {
  int ghostOffset = 12;  // Jarak ghost terhadap Pac-Man

  // Pac-Man bergerak ke kiri
  for (int pos = NUM_COLS; pos > -8 - ghostOffset; pos--) {
    mx.clear();
    drawDots();
    drawPacman(pos, (millis() % 200 < 100), false);  // Pac-Man kiri
    drawGhost(pos + ghostOffset, false);            // Ghost kiri
    checkDotEaten(pos, false);
    delay(80);
  }

  // Reset dots setelah satu putaran
  for (int i = 0; i < NUM_COLS; i++) {
    dots[i] = false;
  }
  for (int i = 4; i < NUM_COLS; i += 6) {
    dots[i] = true;
  }

  // Pac-Man bergerak ke kanan
  for (int pos = -8; pos < NUM_COLS + ghostOffset; pos++) {
    mx.clear();
    drawDots();
    drawPacman(pos, (millis() % 200 < 100), true);   // Pac-Man kanan
    drawGhost(pos - ghostOffset, true);              // Ghost kanan
    checkDotEaten(pos, true);
    delay(80);
  }

  // Reset dots lagi
  for (int i = 0; i < NUM_COLS; i++) {
    dots[i] = false;
  }
  for (int i = 4; i < NUM_COLS; i += 6) {
    dots[i] = true;
  }
}

Credits

irgiElfradani
1 project • 2 followers
Muhamad Azis
1 project • 2 followers
Qoriansha
1 project • 3 followers
Hendra Kusumah
49 projects • 162 followers
Love hacking and making new things from IoT to robotics
Syahrun Noor
0 projects • 1 follower

Comments