#include <Wire.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ A5, /* data=*/ A4, /* reset=*/ U8X8_PIN_NONE);
#define SHAPE_RADIUS 4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
float triangleX = SCREEN_WIDTH / 2;
float triangleY = SCREEN_HEIGHT / 2;
float triangleSpeedX = 10;
float triangleSpeedY = 10;
float circleX = SCREEN_WIDTH / 3;
float circleY = SCREEN_HEIGHT / 3;
float circleSpeedX = 10;
float circleSpeedY = 10;
float squareX = SCREEN_WIDTH * 2 / 3;
float squareY = SCREEN_HEIGHT * 2 / 3;
float squareSpeedX = 10;
float squareSpeedY = 10;
void setup() {
u8g2.begin();
}
void loop() {
u8g2.clearBuffer();
// Update triangle position
triangleX += triangleSpeedX;
triangleY += triangleSpeedY;
// Bounce off walls
if (triangleX - SHAPE_RADIUS < 0 || triangleX + SHAPE_RADIUS > SCREEN_WIDTH) {
triangleSpeedX = -triangleSpeedX;
}
if (triangleY - SHAPE_RADIUS < 0 || triangleY + SHAPE_RADIUS > SCREEN_HEIGHT) {
triangleSpeedY = -triangleSpeedY;
}
// Update circle position
circleX += circleSpeedX;
circleY += circleSpeedY;
// Bounce off walls
if (circleX - SHAPE_RADIUS < 0 || circleX + SHAPE_RADIUS > SCREEN_WIDTH) {
circleSpeedX = -circleSpeedX;
}
if (circleY - SHAPE_RADIUS < 0 || circleY + SHAPE_RADIUS > SCREEN_HEIGHT) {
circleSpeedY = -circleSpeedY;
}
// Update square position
squareX += squareSpeedX;
squareY += squareSpeedY;
// Bounce off walls
if (squareX - SHAPE_RADIUS < 0 || squareX + SHAPE_RADIUS > SCREEN_WIDTH) {
squareSpeedX = -squareSpeedX;
}
if (squareY - SHAPE_RADIUS < 0 || squareY + SHAPE_RADIUS > SCREEN_HEIGHT) {
squareSpeedY = -squareSpeedY;
}
// Draw shapes
u8g2.drawDisc(triangleX, triangleY, SHAPE_RADIUS);
u8g2.drawCircle(circleX, circleY, SHAPE_RADIUS);
u8g2.drawBox(squareX - SHAPE_RADIUS, squareY - SHAPE_RADIUS, 2 * SHAPE_RADIUS, 2 * SHAPE_RADIUS);
u8g2.sendBuffer();
delay(10); // Adjust the delay to control the speed of the animation
}