#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Timer animasi
unsigned long lastBlink = 0;
unsigned long lastMouth = 0;
bool blinkState = false;
bool mouthOpen = false;
void setup() {
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
display.clearDisplay();
}
void loop() {
// Kedip tiap 4 detik
if (millis() - lastBlink > 2000) {
blinkState = true;
drawFace();
delay(200);
blinkState = false;
lastBlink = millis();
}
// Mulut buka tiap 10 detik
if (millis() - lastMouth > 7000) {
mouthOpen = true;
drawFace();
delay(700);
mouthOpen = false;
lastMouth = millis();
}
drawFace();
}
void drawFace() {
display.clearDisplay();
// Mata kiri
if (blinkState) {
display.fillRect(38, 26, 14, 3, WHITE);
} else {
display.fillRoundRect(38, 20, 14, 20, 5, WHITE);
}
// Mata kanan
if (blinkState) {
display.fillRect(76, 26, 14, 3, WHITE);
} else {
display.fillRoundRect(76, 20, 14, 20, 5, WHITE);
}
// Mulut
if (mouthOpen) {
// Mulut terbuka
display.fillRoundRect(56, 42, 16, 10, 4, WHITE);
} else {
// Senyum kecil
display.drawRoundRect(56, 42, 16, 6, 3, WHITE);
}
display.display();
}