#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 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Right eye display object
// === Eye Size and Center Position ===
int eyeX2 = 44; // X-position of eye (centered)
int eyeY2 = 12; // Y-position of eye (centered)
int eyeWidth2 = 40;
int eyeHeight2 = 40;
// === Eye Movement Variables ===
int targetOffsetX2 = 0;
int targetOffsetY2 = 0;
int moveSpeed2 = 3;
// === Blinking Logic ===
int blinkState2 = 0;
int blinkDelay2 = 4000;
unsigned long lastBlinkTime2 = 0;
unsigned long moveTime2 = 0;
void setup() {
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Use 0x3D if second display has different address
display2.display();
delay(1000);
display2.clearDisplay();
}
void loop() {
unsigned long currentTime = millis();
// === Blink Start ===
if (currentTime - lastBlinkTime2 > blinkDelay2 && blinkState2 == 0) {
blinkState2 = 1;
lastBlinkTime2 = currentTime;
}
// === Blink End ===
if (currentTime - lastBlinkTime2 > 150 && blinkState2 == 1) {
blinkState2 = 0;
lastBlinkTime2 = currentTime;
}
// === Random Movement Trigger ===
if (currentTime - moveTime2 > random(1500, 3000) && blinkState2 == 0) {
int direction2 = random(0, 6);
if (direction2 == 0) {
targetOffsetX2 = -8;
targetOffsetY2 = 0;
} else if (direction2 == 1) {
targetOffsetX2 = 8;
targetOffsetY2 = 0;
} else if (direction2 == 2) {
targetOffsetX2 = 0;
targetOffsetY2 = -6;
} else if (direction2 == 3) {
targetOffsetX2 = 0;
targetOffsetY2 = 6;
} else {
targetOffsetX2 = 0;
targetOffsetY2 = 0;
}
moveTime2 = currentTime;
}
// === Smooth Movement ===
static int offsetX2 = 0;
static int offsetY2 = 0;
offsetX2 += (targetOffsetX2 - offsetX2) / moveSpeed2;
offsetY2 += (targetOffsetY2 - offsetY2) / moveSpeed2;
// === Drawing ===
display2.clearDisplay();
if (blinkState2 == 0) {
drawEye2(eyeX2 + offsetX2, eyeY2 + offsetY2, eyeWidth2, eyeHeight2);
} else {
display2.fillRect(eyeX2 + offsetX2, eyeY2 + offsetY2 + eyeHeight2 / 2 - 2,
eyeWidth2, 4, WHITE);
}
display2.display();
delay(30);
}
// === Custom Function for Right Eye ===
void drawEye2(int x, int y, int w, int h) {
display2.fillRoundRect(x, y, w, h, 8, WHITE);
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1