#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define W 128
#define H 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(W, H, &Wire, OLED_RESET);
/* Text geometry */
#define TXT_X 22
#define TXT_Y 22
#define TXT_W 72
#define TXT_H 24
#define GROUND_Y 48
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
randomSeed(analogRead(A0));
}
void loop() {
show2025();
manErase2025();
airBombsWithWish();
manReveal2026();
finalWish();
}
/* ---------------- SHOW 2025 ---------------- */
void show2025() {
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.setCursor(TXT_X, TXT_Y);
display.print("2025");
display.display();
delay(1500);
}
/* ---------------- MAN ERASES 2025 ---------------- */
void manErase2025() {
for (int x = -10; x <= W + 10; x++) {
display.clearDisplay();
display.setTextSize(3);
display.setCursor(TXT_X, TXT_Y);
display.print("2025");
int maskW = constrain(x - TXT_X, 0, TXT_W);
display.fillRect(TXT_X, TXT_Y, maskW, TXT_H, SSD1306_BLACK);
drawMan(x, GROUND_Y, true);
display.display();
delay(18);
}
display.clearDisplay();
display.display();
}
/* ---------------- AIR BOMBS + HAPPY NEW YEAR ---------------- */
void airBombsWithWish() {
for (int i = 0; i < 4; i++) {
int cx = random(20, W - 20);
int cy = random(12, 30);
for (int r = 2; r < 26; r++) {
display.clearDisplay();
/* Static Wish Text */
display.setTextSize(1);
display.setCursor(22, 0);
display.print("HAPPY NEW YEAR");
/* Firework */
display.drawCircle(cx, cy, r, SSD1306_WHITE);
for (int s = 0; s < 10; s++) {
display.drawPixel(cx + random(-r, r),
cy + random(-r, r),
SSD1306_WHITE);
}
display.display();
delay(30);
}
}
}
/* ---------------- MAN REVEALS 2026 ---------------- */
void manReveal2026() {
for (int x = W + 10; x >= -10; x--) {
display.clearDisplay();
display.setTextSize(3);
display.setCursor(TXT_X, TXT_Y);
display.print("2026");
int revealW = constrain((TXT_X + TXT_W) - x, 0, TXT_W);
display.fillRect(TXT_X, TXT_Y,
TXT_W - revealW,
TXT_H,
SSD1306_BLACK);
drawMan(x, GROUND_Y, false);
display.display();
delay(18);
}
}
/* ---------------- DRAW WALKING MAN ---------------- */
void drawMan(int x, int y, bool leftToRight) {
int dir = leftToRight ? 1 : -1;
static bool step = false;
step = !step;
display.drawCircle(x, y - 14, 3, SSD1306_WHITE); // head
display.drawLine(x, y - 11, x, y - 2, SSD1306_WHITE); // body
display.drawLine(x, y - 9, x + dir * 4, y - 6, SSD1306_WHITE);
display.drawLine(x, y - 9, x - dir * 4, y - 6, SSD1306_WHITE);
if (step) {
display.drawLine(x, y - 2, x + dir * 4, y + 4, SSD1306_WHITE);
display.drawLine(x, y - 2, x - dir * 2, y + 4, SSD1306_WHITE);
} else {
display.drawLine(x, y - 2, x - dir * 4, y + 4, SSD1306_WHITE);
display.drawLine(x, y - 2, x + dir * 2, y + 4, SSD1306_WHITE);
}
display.drawLine(0, y + 5, W, y + 5, SSD1306_WHITE); // ground
}
/* ---------------- FINAL WISH ---------------- */
void finalWish() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 2);
display.print("HAPPY NEW YEAR");
display.setTextSize(3);
display.setCursor(TXT_X, TXT_Y);
display.print("2026");
display.display();
delay(4000);
}