#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)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Smiley bitmap: 8x8 pixels
const uint8_t smiley[8] = {
0b00111100,
0b01000010,
0b10100101,
0b10000001,
0b10100101,
0b10011001,
0b01000010,
0b00111100
};
int xPos = 0; // Initial x position
int yPos = 0; // Initial y position
int xMove = 2; // x movement speed
int yMove = 1; // y movement speed
int scale = 4; // Scaling factor for the bitmap
void setup() {
Serial.begin(9600);
// Initialize OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.clearDisplay(); // Clear the buffer
}
void loop() {
display.clearDisplay(); // Clear the display buffer
// Update the position
xPos += xMove;
yPos += yMove;
// Boundary detection for bouncing
if (xPos <= 0 || xPos >= SCREEN_WIDTH - 8 * scale) {
xMove = -xMove; // Reverse direction on x-axis
}
if (yPos <= 0 || yPos >= SCREEN_HEIGHT - 8 * scale) {
yMove = -yMove; // Reverse direction on y-axis
}
// Draw the scaled bitmap at the new position
displayScaledBitmap(xPos, yPos, scale);
display.display(); // Show the updated frame
delay(10); // Delay to control animation speed
}
void displayScaledBitmap(int x, int y, int scaleFactor) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (smiley[i] & (1 << (7 - j))) { // Check each bit (note the bit order reversal)
display.fillRect(x + j * scaleFactor, y + i * scaleFactor, scaleFactor, scaleFactor, SSD1306_WHITE);
}
}
}
}
Comments
0 B
|👍
/👎