#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// OLED Config
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Eye and Pupil Sizes (lebih besar dan proporsional)
int eyeW = 40; // Lebar mata
int eyeH = 40; // Tinggi mata
int pupilW = 12; // Lebar pupil
int pupilH = 12; // Tinggi pupil
// Eye positions
int leftEyeX = 32;
int rightEyeX = 96;
int eyeY = 32;
// Variables for random movement and blinking
unsigned long lastMoveTime = 0;
unsigned long moveInterval = 1000;
unsigned long lastBlinkTime = 0;
unsigned long blinkInterval = 3000;
int pupilOffsetX = 0;
int pupilOffsetY = 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
randomSeed(analogRead(A0)); // Seed for random numbers
}
void loop() {
unsigned long now = millis();
// Acak gerakan mata setiap interval
if (now - lastMoveTime > moveInterval) {
pupilOffsetX = random(-8, 9);
pupilOffsetY = random(-8, 9);
lastMoveTime = now;
}
// Animasi kedip acak
if (now - lastBlinkTime > blinkInterval) {
blink();
lastBlinkTime = now;
blinkInterval = random(1000, 5000); // Kedip antara 1 hingga 5 detik
}
// Tampilkan ekspresi kaget secara acak
if (random(0, 500) == 1) { // Peluang kecil untuk kaget
surpriseEyes();
delay(1000); // Tahan ekspresi kaget
}
// Tampilkan mata normal dengan gerakan acak
drawEyes(pupilOffsetX, pupilOffsetY);
}
// ====== FUNCTION: DRAW TWO BOX EYES + MOVING PUPIL ======
void drawEyes(int offsetX, int offsetY) {
display.clearDisplay();
// Left Eye Outline
display.fillRoundRect(leftEyeX - eyeW / 2, eyeY - eyeH / 2, eyeW, eyeH, 4, SSD1306_WHITE);
// Right Eye Outline
display.fillRoundRect(rightEyeX - eyeW / 2, eyeY - eyeH / 2, eyeW, eyeH, 4, SSD1306_WHITE);
// Pupils (black squares)
display.fillRoundRect(leftEyeX - pupilW / 2 + offsetX, eyeY - pupilH / 2 + offsetY, pupilW, pupilH, 2, SSD1306_BLACK);
display.fillRoundRect(rightEyeX - pupilW / 2 + offsetX, eyeY - pupilH / 2 + offsetY, pupilW, pupilH, 2, SSD1306_BLACK);
display.display();
delay(50); // Tambahkan jeda agar animasi lebih halus
}
// ====== FUNCTION: BLINK ANIMATION ======
void blink() {
drawEyes(0, 0); // Open
delay(50);
display.clearDisplay();
// Eyes closed - draw lines
display.drawLine(leftEyeX - eyeW / 2, eyeY, leftEyeX + eyeW / 2, eyeY, SSD1306_WHITE);
display.drawLine(rightEyeX - eyeW / 2, eyeY, rightEyeX + eyeW / 2, eyeY, SSD1306_WHITE);
display.display();
delay(150);
drawEyes(0, 0); // open again
}
// ====== FUNCTION: SURPRISE EYES ======
void surpriseEyes() {
display.clearDisplay();
// Draw open circles for a surprised look
display.fillCircle(leftEyeX, eyeY, eyeW / 2, SSD1306_WHITE);
display.fillCircle(rightEyeX, eyeY, eyeW / 2, SSD1306_WHITE);
// Draw small, centered pupils
display.fillRoundRect(leftEyeX - pupilW / 2, eyeY - pupilH / 2, pupilW, pupilH, 2, SSD1306_BLACK);
display.fillRoundRect(rightEyeX - pupilW / 2, eyeY - pupilH / 2, pupilW, pupilH, 2, SSD1306_BLACK);
display.display();
}
// happyEyes() dan sadEyes()
// Anda bisa tambahkan kembali fungsi happyEyes() dan sadEyes() ke dalam loop utama
// jika ingin ekspresi tersebut muncul.