#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Указываем пины SDA и SCL для Raspberry Pi Pico
#define PIN_SDA 4
#define PIN_SCL 5
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
float pupilX = 64, pupilY = 32;
float targetX = 64, targetY = 32;
float blinkState = 0;
float blinkSpeed = 0.35;
bool isBlinking = false;
unsigned long nextBlinkTime = 0;
void setup() {
// Инициализация I2C на нужных пинах Pico
Wire.setSDA(PIN_SDA);
Wire.setSCL(PIN_SCL);
Wire.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;); // Если экран не найден, стоп
}
display.clearDisplay();
nextBlinkTime = millis() + 2000;
}
void drawRealisticEye(float x, float y, float blink) {
display.fillEllipse(64, 32, 58, 28, SSD1306_WHITE);
display.fillCircle(x, y, 20, SSD1306_BLACK);
display.fillCircle(x, y, 9, SSD1306_WHITE);
display.fillCircle(x, y, 8, SSD1306_BLACK);
display.fillCircle(x - 6, y - 7, 4, SSD1306_WHITE);
display.fillCircle(x + 8, y + 6, 2, SSD1306_WHITE);
int lidHeight = blink * 32;
display.fillRect(0, 0, 128, lidHeight, SSD1306_BLACK);
display.fillEllipse(64, lidHeight - 2, 75, 25, SSD1306_BLACK);
int bottomLidHeight = blink * 10;
display.fillRect(0, 64 - bottomLidHeight, 128, bottomLidHeight, SSD1306_BLACK);
display.fillEllipse(64, 66 - bottomLidHeight, 75, 20, SSD1306_BLACK);
display.fillTriangle(0,0, 40,0, 0,32, SSD1306_BLACK);
display.fillTriangle(128,0, 88,0, 128,32, SSD1306_BLACK);
display.fillTriangle(0,64, 40,64, 0,32, SSD1306_BLACK);
display.fillTriangle(128,64, 88,64, 128,32, SSD1306_BLACK);
}
void loop() {
display.clearDisplay();
if (millis() > nextBlinkTime && !isBlinking) {
isBlinking = true;
}
if (isBlinking) {
blinkState += blinkSpeed;
if (blinkState >= 1.0) {
blinkState = 1.0;
blinkSpeed = -0.25;
}
if (blinkState <= 0) {
blinkState = 0;
isBlinking = false;
blinkSpeed = 0.35;
nextBlinkTime = millis() + random(1500, 6000);
}
}
if (!isBlinking && random(200) > 196) {
targetX = 64 + random(-18, 18);
targetY = 32 + random(-10, 10);
}
pupilX += (targetX - pupilX) * 0.15;
pupilY += (targetY - pupilY) * 0.15;
drawRealisticEye(pupilX, pupilY, blinkState);
display.display();
delay(10);
}