/*
* Simple OLED Animation for XIAO ESP32-C3
* Display: 0.96" SSD1306 OLED (128x64)
* Connection: I2C
*
* Wiring:
* XIAO ESP32-C3 OLED Display
* 3V3 VCC
* GND GND
* D4 (SDA) SDA
* D5 (SCL) SCL
*
* Libraries required:
* - Adafruit SSD1306
* - Adafruit GFX Library
*/
#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
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for XIAO ESP32-C3 are D4 (SDA) and D5 (SCL)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C /// < See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Animation variables for bouncing ball
int ballX = 64;
int ballY = 32;
int ballDX = 2;
int ballDY = 1;
int ballRadius = 4;
// Animation variables for starfield
#define NUM_STARS 30
int starX[NUM_STARS];
int starY[NUM_STARS];
int starSpeed[NUM_STARS];
void setup() {
Serial.begin(115200);
// Initialize I2C with XIAO ESP32-C3 default pins
// Wire.begin(SDA, SCL); // For ESP32-C3, D4 is 6, D5 is 7
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 20);
display.println("XIAO ESP32-C3");
display.setCursor(25, 35);
display.println("Animation Start!");
display.display();
delay(2000);
// Initialize stars
for (int i = 0; i < NUM_STARS; i++) {
starX[i] = random(0, SCREEN_WIDTH);
starY[i] = random(0, SCREEN_HEIGHT);
starSpeed[i] = random(1, 4);
}
}
void loop() {
display.clearDisplay();
// 1. Draw Starfield (Background)
for (int i = 0; i < NUM_STARS; i++) {
display.drawPixel(starX[i], starY[i], SSD1306_WHITE);
starX[i] -= starSpeed[i]; // Move stars to the left
if (starX[i] < 0) {
starX[i] = SCREEN_WIDTH;
starY[i] = random(0, SCREEN_HEIGHT);
}
}
// 2. Draw Bouncing Ball (Foreground)
display.fillCircle(ballX, ballY, ballRadius, SSD1306_WHITE);
// Update ball position
ballX += ballDX;
ballY += ballDY;
// Bounce off edges
if (ballX + ballRadius >= SCREEN_WIDTH || ballX - ballRadius <= 0) {
ballDX = -ballDX;
}
if (ballY + ballRadius >= SCREEN_HEIGHT || ballY - ballRadius <= 0) {
ballDY = -ballDY;
}
// 3. Draw some text
display.setTextSize(1);
display.setCursor(0, 0);
display.print("XIAO ESP32-C3");
display.display();
delay(20); // Adjust for animation speed
}