" Y ___ Y",
" |Y( )Y|",
" ( 0 0 ) ",
" | |",
" | WWW |",
" |V V|",
" | |",
" ----- "
this is a porkchop inspired project Love Ya Octo
Only test your own Hardware, i dont condone hunting and deauthing outside of your own network, always test your OWN Hardware
Hardware
Board: ESP32 Dev Module (Cheap Yellow Display / CYD, ESP32-2432S028R) Flash: 4MB QIO @ 80MHz, "Huge APP" partition scheme Display: ILI9341 320x240 TFT via TFT_eSPI Touch: XPT2046 resistive touchscreen Storage: microSD over a dedicated HSPI bus Status LED: common-cathode RGB, active LOW
Pin map
FunctionPinTFT MISO12TFT MOSI13TFT SCLK14TFT CS15TFT DC2TFT RST4TFT Backlight21Touch CS33Touch IRQ36SD CS5LED Red4LED Green16LED Blue17
Required User_Setup.h (TFT_eSPI library folder)
cpp#define ILI9341_DRIVER #define TFT_MISO 12 #define TFT_MOSI 13 #define TFT_SCLK 14 #define TFT_CS 15 #define TFT_DC 2 #define TFT_RST 4 #define TFT_BL 21 #define TFT_BACKLIGHT_ON HIGH #define TOUCH_CS 33 #define LOAD_GLCD #define LOAD_FONT2 #define LOAD_FONT4 #define LOAD_GFXFF #define SMOOTH_FONT #define SPI_FREQUENCY 40000000 #define SPI_READ_FREQUENCY 20000000 #define SPI_TOUCH_FREQUENCY 2500000
Libraries
TFT_eSPI XPT2046_Touchscreen Preferences (bundled with ESP32 core) SD (bundled with ESP32 core)
Screen layout
The 320x240 display is split into four regions:
Top bar (20px) — title and a status line Left panel (148x198) — the animated skull/mask sprite and stats Right panel (172x198) — a scrolling text feed Bottom bar (22px) — four mode tabs, rendered as touch targets
I draw the mask and feed panels into separate TFT_eSprite buffers and push them independently, so each region only redraws when its own content changes — this keeps the UI responsive without repainting the whole screen every frame.
Animated mask
The mask is drawn as 8 rows of monospaced ASCII art per frame, colored in three bands (amber antlers, bone-white skull, rust-colored jaw). It cycles through mood and idle states:
Idle sub-states: calm, blink, look-left, look-right, alert, sniff — picked at random with randomized hold times so it doesn't look robotic Mood states: idle, hunt, chomp, flicker, sleep — driven by whatever mode the UI is in
Each state just swaps which string array gets drawn into the sprite, so adding a new expression is a matter of writing a new 8-row ASCII frame and adding a case to getFrame().
Touch handling
Touch input is polled every loop and debounced into two gesture types:
Tap — quick touch and release Hold — touch held ~1.4 seconds, used here to cycle color themes
Only the bottom bar is treated as a touch target in this build; tapping a tab switches the active mode, and tapping the already-active tab returns to idle.
Status LED
The RGB LED pulses in different colors depending on the active mode (handled in updateLED()), giving an at-a-glance indicator visible without looking at the screen.
Persistent state
Preferences (ESP32's NVS-backed key/value store) is used to persist an XP counter and level across reboots, saved on a timer rather than every change to reduce flash wear.
SD card
The SD card is mounted over a separate HSPI bus from the display, with its own CS line. On boot, I check for a card and create a /captures directory if one is present — I'm not covering what gets written there.