#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED Configuration
#define OLED_RESET -1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define SSD1306_I2C_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Button Pin Definitions
#define STOP_BUTTON_PIN 2
// Function Prototypes
void showSplashScreen();
bool checkButtonInterrupt();
void setup() {
Serial.begin(115200);
// Initialize buttons with pull-up resistors
pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS)) {
Serial.println(F("SSD1306 initialization failed"));
for (;;);
}
showSplashScreen(); // STARTS UNSTOPPABLE ANIMATION
}
void loop() {
// Your main code goes here AFTER interrupt
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println(F("Main Menu Ready!"));
display.display();
while (true) { // Stay in main menu forever
delay(1000);
}
}
// === UNSTOPPABLE ANIMATION ===
void showSplashScreen() {
int dotCount = 0;
Serial.println(F("đ UNSTOPPABLE PAKFONES Animation Started!"));
// FOREVER LOOP until button interrupt
while (true) {
// CHECK FOR ANY BUTTON PRESS (interrupt)
if (checkButtonInterrupt()) {
Serial.println(F("âšī¸ Animation interrupted!"));
display.clearDisplay();
display.display();
return; // EXIT to main loop
}
display.clearDisplay();
// MAIN TITLE
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(15, 20);
display.println(F("PAKFONES"));
// THREE DOTS ANIMATION (smaller, centered)
display.setTextSize(1);
display.setCursor(60, 35);
// CYCLE: . â .. â ...
switch (dotCount % 3) {
case 0:
display.print(F("."));
Serial.println(F("PAKFONES ."));
break;
case 1:
display.print(F(".."));
Serial.println(F("PAKFONES .."));
break;
case 2:
display.print(F("..."));
Serial.println(F("PAKFONES ..."));
break;
}
display.display();
delay(500); // Animation speed
dotCount++; // RESTARTS from 0 automatically (%3)
}
}
// === INTERRUPT CHECKER ===
bool checkButtonInterrupt() {
// ANY BUTTON PRESS STOPS ANIMATION
if (digitalRead(STOP_BUTTON_PIN) == LOW) {
delay(50); // Debounce
return true;
}
return false;
}