#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define SDA_PIN 4
#define SCL_PIN 5
int ekspresi = 0;
int frame = 0;
bool blink = false;
int loveY = 0;
// ❤️ LOVE
void drawHeart(int x, int y){
display.fillCircle(x-4, y, 4, SSD1306_WHITE);
display.fillCircle(x+4, y, 4, SSD1306_WHITE);
display.fillTriangle(x-8, y, x+8, y, x, y+10, SSD1306_WHITE);
}
// 🌸 BLUSH
void drawBlush(){
display.fillCircle(36, 42, 4, SSD1306_WHITE);
display.fillCircle(92, 42, 4, SSD1306_WHITE);
}
// 👀 MATA BESAR + SPARKLE
void drawEyes(bool blinkMode){
if(!blinkMode){
display.fillRoundRect(24, 10, 36, 44, 14, SSD1306_WHITE);
display.fillRoundRect(68, 10, 36, 44, 14, SSD1306_WHITE);
// sparkle animasi
display.fillCircle(38 + (frame%6), 20, 3, SSD1306_BLACK);
display.fillCircle(82 + (frame%6), 20, 3, SSD1306_BLACK);
} else {
display.drawLine(30, 32, 54, 32, SSD1306_WHITE);
display.drawLine(74, 32, 98, 32, SSD1306_WHITE);
}
}
// 🙂 Mulut senyum kecil
void drawSmile(){
display.drawCircle(64, 54, 10, SSD1306_WHITE);
display.fillRect(54, 54, 20, 12, SSD1306_BLACK);
}
// 😮 Mulut O
void drawMouthO(){
display.fillCircle(64, 54, 6, SSD1306_WHITE);
}
// 😭 Cry
void drawCry(){
display.fillCircle(44, 30, 8, SSD1306_WHITE);
display.fillCircle(84, 30, 8, SSD1306_WHITE);
display.drawLine(44, 38, 44, 50, SSD1306_WHITE);
display.drawLine(84, 38, 84, 50, SSD1306_WHITE);
}
// 😆 > <
void drawXEyes(){
display.drawLine(30, 18, 58, 44, SSD1306_WHITE);
display.drawLine(58, 18, 30, 44, SSD1306_WHITE);
display.drawLine(70, 18, 98, 44, SSD1306_WHITE);
display.drawLine(98, 18, 70, 44, SSD1306_WHITE);
}
void setup(){
Wire.begin(SDA_PIN, SCL_PIN);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop(){
display.clearDisplay();
switch(ekspresi){
case 0: // NORMAL KAWAII
drawEyes(blink);
drawBlush();
drawSmile();
break;
case 1: // LOVE FALLING
drawEyes(false);
drawBlush();
drawSmile();
drawHeart(40, loveY);
drawHeart(88, loveY+10);
loveY += 3;
if(loveY > 64) loveY = 0;
break;
case 2: // CRY
drawCry();
drawMouthO();
break;
case 3: // > <
drawXEyes();
drawSmile();
break;
}
display.display();
delay(80);
frame++;
// kedip smooth
if(frame % 40 == 0) blink = true;
if(frame % 45 == 0) blink = false;
// ganti ekspresi tiap beberapa detik
if(frame % 300 == 0){
ekspresi++;
if(ekspresi > 3) ekspresi = 0;
}
}Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1