/*
* OLED Display Graphics (SSD1306 128x64) with Arduino Uno
* This sketch demonstrates various graphics capabilities including:
* - Text display
* - Shapes (rectangles, circles, lines)
* - Animations
* - Pixel manipulation
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED display dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset pin (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // I2C address for most SSD1306 displays
// Create display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
// Initialize the OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Clear the display buffer
display.clearDisplay();
display.display();
delay(1000);
Serial.println(F("OLED Display Initialized!"));
}
void loop() {
// Demo 1: Text Display
displayTextDemo();
delay(2000);
// Demo 2: Shapes
displayShapesDemo();
delay(2000);
// Demo 3: Animation
displayAnimationDemo();
delay(2000);
// Demo 4: Scrolling Text
displayScrollingText();
delay(2000);
// Demo 5: Graphics Pattern
displayGraphicsPattern();
delay(2000);
}
// Demo 1: Display various text sizes and styles
void displayTextDemo() {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Text Display Demo"));
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);
// Small text
display.setTextSize(1);
display.setCursor(0, 15);
display.println(F("Size 1 Text"));
// Medium text
display.setTextSize(2);
display.setCursor(0, 28);
display.println(F("Size 2"));
// Large text
display.setTextSize(3);
display.setCursor(0, 45);
display.println(F("Big"));
display.display();
}
// Demo 2: Display various shapes
void displayShapesDemo() {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Shapes Demo"));
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);
// Rectangle
display.drawRect(5, 15, 30, 20, SSD1306_WHITE);
// Filled Rectangle
display.fillRect(40, 15, 30, 20, SSD1306_WHITE);
// Circle
display.drawCircle(85, 25, 10, SSD1306_WHITE);
// Filled Circle
display.fillCircle(110, 25, 10, SSD1306_WHITE);
// Triangle
display.drawTriangle(10, 55, 25, 40, 40, 55, SSD1306_WHITE);
// Filled Triangle
display.fillTriangle(50, 55, 65, 40, 80, 55, SSD1306_WHITE);
// Lines
display.drawLine(90, 40, 120, 55, SSD1306_WHITE);
display.drawLine(120, 40, 90, 55, SSD1306_WHITE);
display.display();
}
// Demo 3: Simple animation - bouncing ball
void displayAnimationDemo() {
int x = 64;
int y = 32;
int dx = 2;
int dy = 2;
int radius = 5;
for(int i = 0; i < 100; i++) {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Animation Demo"));
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);
// Draw ball
display.fillCircle(x, y, radius, SSD1306_WHITE);
// Update position
x += dx;
y += dy;
// Bounce off walls
if(x + radius >= SCREEN_WIDTH || x - radius <= 0) {
dx = -dx;
}
if(y + radius >= SCREEN_HEIGHT || y - radius <= 12) {
dy = -dy;
}
display.display();
delay(30);
}
}
// Demo 4: Scrolling text
void displayScrollingText() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// Display scrolling message
for(int x = SCREEN_WIDTH; x > -200; x -= 2) {
display.clearDisplay();
display.setCursor(x, 25);
display.println(F("Scrolling!"));
display.display();
delay(20);
}
}
// Demo 5: Graphics pattern
void displayGraphicsPattern() {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Pattern Demo"));
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);
// Draw a grid pattern
for(int i = 0; i < SCREEN_WIDTH; i += 10) {
display.drawLine(i, 12, i, SCREEN_HEIGHT, SSD1306_WHITE);
}
for(int i = 12; i < SCREEN_HEIGHT; i += 10) {
display.drawLine(0, i, SCREEN_WIDTH, i, SSD1306_WHITE);
}
display.display();
delay(1500);
// Draw concentric circles
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Circles"));
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);
for(int r = 5; r < 30; r += 5) {
display.drawCircle(64, 36, r, SSD1306_WHITE);
}
display.display();
}