#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED显示屏尺寸
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// OLED重置引脚配置
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 圆心坐标
#define C_x 63
#define C_y 31
void setup() {
Serial.begin(9600);
// 初始化显示屏
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
delay(1000);
// 绘制初始静态背景
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// 绘制圆形
display.drawCircle(C_x, C_y, 31, SSD1306_WHITE);
// 绘制每30度的12个刻度
for (int angle = 0; angle < 360; angle += 30) {
float theta_r = angle * (PI / 180.0); // 将角度转换为弧度
int x1 = C_x + 30 * cos(-theta_r); // 刻度的起点
int y1 = C_y - 30 * sin(-theta_r);
int x2 = C_x + 25 * cos(-theta_r); // 将刻度线的终点设置在圆内
int y2 = C_y - 25 * sin(-theta_r);
display.drawLine(x1, y1, x2, y2, SSD1306_WHITE); // 绘制刻度线
}
display.display();
}
float angleDeg = 0; // 角度(度)用于圆周运动
float theta_r, x, y;
void loop() {
// 清除上次的运动点
display.clearDisplay();
// 重新绘制基础静态圆形
display.drawCircle(C_x, C_y, 31, SSD1306_WHITE);
// 重新绘制每30度的12个刻度
for (int angle = 0; angle < 360; angle += 30) {
float theta_r = angle * (PI / 180.0); // 将角度转换为弧度
int x1 = C_x + 30 * cos(-theta_r); // 刻度的起点
int y1 = C_y - 30 * sin(-theta_r);
int x2 = C_x + 25 * cos(-theta_r); // 将刻度线的终点设置在圆内
int y2 = C_y - 25 * sin(-theta_r);
display.drawLine(x1, y1, x2, y2, SSD1306_WHITE); // 绘制刻度线
}
// 更新运动点的位置
theta_r = angleDeg * (PI / 180.0); // 将角度转换为弧度
// 顺时针运动
x = C_x + 25 * cos(-theta_r);
y = C_y - 25 * sin(-theta_r);
// 从圆心到运动点绘制一条线
display.drawLine(C_x, C_y, x, y, SSD1306_WHITE);
// 更新显示
display.display();
// 增加角度,保持平滑的动画
angleDeg += 1; // 持续增加角度
if (angleDeg >= 360) angleDeg = 0; // 角度超过360时重新开始
// 延时以平滑动画
delay(100);
}