#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SDA_PIN 13
#define SCL_PIN 15
#define OLED_RESET -1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32 // Change this if you have a different size display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define EYE_HEIGHT display.height() / 2
#define DEFAULT_EYE_RADIUS 12
#define DEFAULT_LEFT_EYE_CENTER_POS display.width() / 4
#define DEFAULT_RIGHT_EYE_CENTER_POS display.width() * 3/4
#define DEFAULT_LEFT_EYE_CLOSED_CENTER_POS DEFAULT_LEFT_EYE_CENTER_POS - DEFAULT_EYE_RADIUS
#define DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS DEFAULT_RIGHT_EYE_CENTER_POS - DEFAULT_EYE_RADIUS
#define DEFAULT_EYE_CLOSED_WIDTH DEFAULT_EYE_RADIUS * 2
void setup() {
pinMode(17, OUTPUT); // Set GPIO 18 as an output
digitalWrite(17, HIGH); // Set GPIO 18 to HIGH
Wire.begin(SDA_PIN, SCL_PIN);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Freeze if OLED fails to initialize
}
// display.setRotation(2);
display.clearDisplay(); // Clear the display
display.setTextSize(1); // Set text size
display.setTextColor(SSD1306_WHITE); // Set text color
display.setCursor(0, 0); // Set cursor position
}
void loop() {
animateEyes();
}
void animateEyes(void) {
animate(neutralEyes, 0, 0, 2000);
animate(blink, 0, 0, 200);
animate(neutralEyes, 0, 0, 2000);
animate(blink, 0, 0, 200);
animate(neutralEyes, 0, 0, 2000);
animate(neutralEyes, DEFAULT_EYE_RADIUS, 0, 2000);
animate(neutralEyes, -DEFAULT_EYE_RADIUS, 0, 2000);
animate(blink, -DEFAULT_EYE_RADIUS, 200);
animate(neutralEyes, -DEFAULT_EYE_RADIUS, 0, 2000);
animate(neutralEyes, 0, 0, 2000);
animate(blink, 0, 0, 200);
animate(neutralEyes, 0, 0, 2000);
animate(smileyEyes, 0, 0, 2000);
}
void animate(void(*animation)(int, int), int xOffset, int yOffset, int delayTime) {
if (xOffset == NULL) {
xOffset = 0;
}
if (yOffset == NULL) {
yOffset = 0;
}
display.clearDisplay();
animation(xOffset, yOffset);
display.display();
delay(delayTime);
}
void blink(int xOffset, int yOffset){
display.drawRect(DEFAULT_LEFT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
display.fillRect(DEFAULT_LEFT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
display.drawRect(DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
display.fillRect(DEFAULT_RIGHT_EYE_CLOSED_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_CLOSED_WIDTH, 2, SSD1306_WHITE);
}
void neutralEyes(int xOffset, int yOffset) {
display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
}
void smileyEyes(int xOffset, int yOffset){
display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.drawCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
display.fillCircle(DEFAULT_LEFT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset, DEFAULT_EYE_RADIUS, SSD1306_WHITE);
display.drawCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
display.fillCircle(DEFAULT_RIGHT_EYE_CENTER_POS+xOffset, EYE_HEIGHT+yOffset+4, DEFAULT_EYE_RADIUS, SSD1306_BLACK);
}