#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin (not used with I2C)
#define SCREEN_ADDRESS 0x3C // I2C address for the OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Wire.begin(21, 22); // ESP32 I2C pins (SDA = 21, SCL = 22)
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
drawSmileyFace();
display.display();
}
void loop() {
// Nothing to do here
}
void drawSmileyFace() {
int centerX = SCREEN_WIDTH / 2;
int centerY = SCREEN_HEIGHT / 2;
int radius = 20;
// Draw face circle
display.drawCircle(centerX, centerY, radius, SSD1306_WHITE);
// Draw eyes
display.fillCircle(centerX - 7, centerY - 5, 3, SSD1306_WHITE);
display.fillCircle(centerX + 7, centerY - 5, 3, SSD1306_WHITE);
// Draw smile using an arc approximation with lines
for (int i = -10; i <= 10; i++) {
int x1 = centerX + i;
int y1 = centerY + 10 - (i * i) / 20;
display.drawPixel(x1, y1, SSD1306_WHITE);
}
}