【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十二:简易旋转万花筒动画
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十二:简易旋转万花筒动画
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_ORANGE, GC9A01A_YELLOW, GC9A01A_GREEN, GC9A01A_CYAN, GC9A01A_BLUE, GC9A01A_MAGENTA, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);
// 动画参数
#define SCREEN_CENTER_X 120
#define SCREEN_CENTER_Y 120
#define RADIUS 100 // 圆形屏幕的半径
#define NUM_SHAPES 12 // 万花筒图形数量
#define ROTATION_SPEED 5 // 旋转速度(度/帧)
#define SHAPE_SIZE 40 // 单个图形的大小
void drawKaleidoscope(float rotationAngle) {
// 清屏
tft.fillScreen(GC9A01A_BLACK);
// 绘制多个图形组成万花筒
for (int i = 0; i < NUM_SHAPES; i++) {
// 计算每个图形的旋转角度
float angle = rotationAngle + i * (360 / NUM_SHAPES);
float radian = angle * 3.14159 / 180;
// 计算图形的中心点
int x = SCREEN_CENTER_X + RADIUS * cos(radian);
int y = SCREEN_CENTER_Y + RADIUS * sin(radian);
// 获取颜色
uint16_t color = colors[(i + (int)(rotationAngle / 20)) % numColors];
// 绘制三角形
int x1 = x;
int y1 = y - SHAPE_SIZE / 2;
int x2 = x + SHAPE_SIZE / 2;
int y2 = y + SHAPE_SIZE / 2;
int x3 = x - SHAPE_SIZE / 2;
int y3 = y + SHAPE_SIZE / 2;
tft.fillTriangle(x1, y1, x2, y2, x3, y3, color);
}
}
void setup() {
Serial.begin(115200); // 初始化串口
Serial.println("Rotating Kaleidoscope Animation");
tft.begin(); // 初始化屏幕
tft.setRotation(0); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
}
void loop() {
static float rotationAngle = 0;// 初始化旋转角度
// 绘制旋转万花筒动画
drawKaleidoscope(rotationAngle);
// 更新旋转角度
rotationAngle += ROTATION_SPEED;
if (rotationAngle >= 360) {
rotationAngle = 0; // 重置角度循环
}
delay(10); // 控制动画帧速率
}
【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例
代码说明1、独特的旋转万花筒效果:
绘制多个等距分布的彩色三角形,并通过旋转角度不断变化位置,形成动态万花筒特效。
2、动态颜色渐变:
图形颜色从 colors[] 中动态获取,并根据帧数切换颜色,实现渐变效果。
3、流畅动画:
动态更新旋转角度,带来平滑的旋转效果。
使用 delay(50) 控制帧速率,每秒显示约 20 帧,动画流畅自然。
4、圆形屏幕的极致利用:
图形位置以屏幕中心为基准,完美适配圆形屏幕的特性。
5、效果描述
屏幕显示一个以中心为基准的动态万花筒,彩色的三角形随着旋转角度逐步改变位置和颜色。
效果流畅炫酷,适合圆形屏幕展示,让观看者眼前一亮。
动画的色彩变化和旋转速度可通过调整参数进行定制。
【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十三:带边框有日期的数字时钟
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十三:带边框有日期的数字时钟
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 初始化时间变量(初始为 2025年3月27日,时间为12:00:00)
int year = 2025, month = 3, day = 27;
int hours = 12, minutes = 0, seconds = 0;
void drawCircularBorders() {
// 绘制双环圆边框
tft.drawCircle(120, 120, 119, GC9A01A_WHITE); // 外环圆(白色)
tft.drawCircle(120, 120, 110, GC9A01A_CYAN); // 内环圆(青色)
}
void displayDateAndTime() {
// 清除显示区域
tft.fillRect(20, 60, 200, 160, GC9A01A_BLACK);
// 显示日期
tft.setTextSize(3);
tft.setTextColor(GC9A01A_YELLOW, GC9A01A_BLACK); // 黄色文本,黑色背景
tft.setCursor(35, 80);
tft.printf("%04d/%02d/%02d", year, month, day);
// 显示时间
tft.setTextSize(4);
tft.setTextColor(GC9A01A_GREEN, GC9A01A_BLACK); // 绿色文本,黑色背景
tft.setCursor(2, 130);
tft.printf(" %02d:%02d:%02d", hours, minutes, seconds);
}
void updateClock() {
// 更新时间
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
day++;
// 简单处理月份和闰年(可进一步完善)
if ((month == 2 && day > 28) || (month != 2 && day > 30)) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
}
void setup() {
Serial.begin(115200); // 初始化串口通信
Serial.println("Circular Border Clock");
tft.begin(); // 初始化屏幕
tft.setRotation(2); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景
drawCircularBorders(); // 绘制双环圆边框
}
void loop() {
displayDateAndTime(); // 显示日期和时间
updateClock(); // 更新时间
delay(1000); // 每秒更新一次
}
【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例
代码说明1、双环圆边框:
外环半径 119,颜色为白色(GC9A01A_WHITE)。
内环半径 110,颜色为青色(GC9A01A_CYAN)。
两环同心围绕屏幕中心点 (120, 120)。
2、日期时间显示:
显示样式为 Date: 2025/03/27 和 Time: 12:00:00。
文本与边框紧密结合,居中显示,整体布局美观。
3、自动时间更新:
每秒更新时间,分钟和日期随时间变化自动调整。
4、屏幕刷新优化:
仅刷新日期和时间区域,不重绘边框,减少屏幕闪烁。
5、效果描述
屏幕显示一个双环圆边框,中间的日期和时间动态更新。
外环和内环颜色鲜明,对比明显,整体设计简洁美观。
每秒刷新一次时间,随着时间推进日期也会自动变化。
【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例
【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十四:动态旋转阿基米德螺线
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十四:动态旋转阿基米德螺线
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 定义阿基米德螺线参数
#define CENTER_X 120 // 屏幕中心 X
#define CENTER_Y 120 // 屏幕中心 Y
#define MAX_RADIUS 120 // 最大半径
#define FACTOR 10 // 螺线增长因子
#define STEP 0.1 // 每次增加的角度步进(弧度)
#define ROTATION_SPEED 5 // 螺线旋转速度(度/帧)
// 绘制动态旋转阿基米德螺线
void drawRotatingSpiral(float rotationAngle) {
float theta = 0;// 初始化角度为 0
int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点
while (theta < MAX_RADIUS / FACTOR) {
// 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
float r = FACTOR * theta;
float adjustedTheta = theta + rotationAngle * 3.14159 / 180; // 添加旋转角度
int x = CENTER_X + r * cos(adjustedTheta);
int y = CENTER_Y + r * sin(adjustedTheta);
// 连接当前点和前一个点
tft.drawLine(prevX, prevY, x, y, GC9A01A_CYAN);
// 更新前一个点和角度
prevX = x;
prevY = y;
theta += STEP; // 增加角度
}
}
void setup() {
Serial.begin(115200); // 初始化串口通信
Serial.println("Dynamic Rotating Archimedean Spiral");
tft.begin(); // 初始化屏幕
tft.setRotation(0); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
}
void loop() {
static float rotationAngle = 0;// 初始化旋转角度
// 清屏并绘制新的螺线
tft.fillScreen(GC9A01A_BLACK);// 清屏
drawRotatingSpiral(rotationAngle);
// 更新旋转角度
rotationAngle += ROTATION_SPEED;
if (rotationAngle >= 360) {
rotationAngle = 0; // 重置角度循环
}
delay(50); // 控制帧速率
}
【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例
代码说明1、动态旋转:
使用 rotationAngle 变量动态调整螺线的角度,让螺线逐帧旋转。
2、极坐标和笛卡尔转换:
通过极坐标公式 $r = a\theta$ 计算螺线,并添加旋转角度实现动态效果。
3、流畅动画:
每帧清除屏幕内容并重新绘制螺线,确保动画流畅自然。
4、可调整参数:
FACTOR 决定螺线的扩展速度,STEP 控制螺线的曲线密度,ROTATION_SPEED 设置旋转速度。
5、效果描述
屏幕中央显示一个青色的阿基米德螺线,逐步扩展并缓慢旋转。
螺线的动态旋转让视觉效果更具吸引力,适合展示数学几何动态特性。
【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例
【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十五:多彩动态旋转10条向心线
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十五:多彩动态旋转10条向心线
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 定义参数
#define CENTER_X 120 // 屏幕中心 X
#define CENTER_Y 120 // 屏幕中心 Y
#define SCALE 100 // 心形曲线缩放因子
#define STEP 0.1 // 参数步进(越小曲线越平滑)
#define ROTATION_SPEED 3 // 每帧旋转的角度(度)
#define NUM_HEARTS 10 // 心形曲线数量
// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);
// 绘制一条心形曲线
void drawHeartCurve(float rotationAngle, float phase, uint16_t color) {
float t = 0; // 参数 t 表示角度
int prevX = CENTER_X, prevY = CENTER_Y; // 初始点
while (t < 2 * 3.14159) {
// 心形曲线的参数方程
float x_heart = SCALE * (16 * sin(t) * sin(t) * sin(t));
float y_heart = -SCALE * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));
// 应用旋转角度和相位偏移
float adjustedX = x_heart * cos(rotationAngle * 3.14159 / 180 + phase) - y_heart * sin(rotationAngle * 3.14159 / 180 + phase);
float adjustedY = x_heart * sin(rotationAngle * 3.14159 / 180 + phase) + y_heart * cos(rotationAngle * 3.14159 / 180 + phase);
int x = CENTER_X + adjustedX;
int y = CENTER_Y + adjustedY;
// 连接当前点和前一个点
tft.drawLine(prevX, prevY, x, y, color);
// 更新前一个点和参数 t
prevX = x;
prevY = y;
t += STEP; // 参数步进
}
}
void setup() {
Serial.begin(115200); // 初始化串口通信
Serial.println("Dynamic Rotating Heart Curves");
tft.begin(); // 初始化屏幕
tft.setRotation(0); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景
}
void loop() {
static float rotationAngle = 0; // 初始化旋转角度
// 清屏
tft.fillScreen(GC9A01A_BLACK);
// 绘制多条心形曲线
for (int i = 0; i < NUM_HEARTS; i++) {
// 随机颜色
uint16_t color = colors;
// 相位偏移,使心形曲线位置不同
float phase = i * (2 * 3.14159 / NUM_HEARTS);
// 绘制心形曲线
drawHeartCurve(rotationAngle, phase, color);
}
// 更新旋转角度
rotationAngle += ROTATION_SPEED;
if (rotationAngle >= 360) {
rotationAngle = 0; // 重置角度循环
}
delay(100); // 控制帧速率
}
【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例
代码说明1、数量提升至10条:
将 NUM_HEARTS 增加至 10,生成更多的心形曲线,画面更加丰富。
2、增强对称性:
每条心形曲线通过 phase 参数进行相位偏移,确保均匀分布在屏幕周围。
3、随机颜色变化:
每帧螺线会分配随机颜色,让动画充满变化和视觉冲击力。
4、动态旋转:
旋转角度 rotationAngle 每帧更新,让心形曲线动态旋转,画面更生动。
5、效果描述
屏幕中央显示 10 条心形曲线,每条曲线动态旋转并随机变换颜色。
曲线均匀分布,形成复杂的几何图案,层次感和对称性进一步增强。
动态心形曲线呈现炫目效果,适合圆形屏幕展示。
【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十六:多彩动态横竖方格线
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十六:多彩动态横竖方格线
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 定义屏幕参数
#define SCREEN_WIDTH 240 // 屏幕宽度
#define SCREEN_HEIGHT 240 // 屏幕高度
#define LINE_SPACING 10 // 横竖线的间隔
// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);
void setup() {
Serial.begin(115200); // 初始化串口通信
Serial.println("Dynamic Lines Animation");
tft.begin(); // 初始化屏幕
tft.setRotation(0); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景
}
void loop() {
static int colorIndex = 0; // 当前颜色索引
// 清屏
tft.fillScreen(GC9A01A_BLACK);
// 绘制横线
for (int y = 0; y <= SCREEN_HEIGHT; y += LINE_SPACING) {
uint16_t color = colors[(colorIndex + y / LINE_SPACING) % numColors];
tft.drawLine(0, y, SCREEN_WIDTH, y, color);
}
// 绘制竖线
for (int x = 0; x <= SCREEN_WIDTH; x += LINE_SPACING) {
uint16_t color = colors[(colorIndex + x / LINE_SPACING) % numColors];
tft.drawLine(x, 0, x, SCREEN_HEIGHT, color);
}
// 更新颜色索引
colorIndex++;
if (colorIndex >= numColors) {
colorIndex = 0; // 循环颜色
}
delay(100); // 控制帧速率
}
【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例
代码说明1、满屏横竖线:
横线和竖线分别通过 drawLine() 方法绘制,每隔 10 像素生成一条。
2、多彩动态效果:
使用颜色数组 colors[] 实现多彩效果,每帧动态切换颜色,视觉冲击力强。
3、优化的循环绘制:
通过计算颜色索引 (colorIndex + 偏移),让每条线的颜色随位置变化。
4、流畅动画:
每帧清屏并重绘线条,搭配 delay(100) 控制帧速率,保证动画平滑。
5、效果描述
屏幕上每隔 10 像素绘制一条横线和竖线,覆盖整个屏幕。
每条线条的颜色随帧数动态变化,形成五彩斑斓的效果。
整体视觉流畅、色彩鲜艳,适合作为动态几何艺术展示。
【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例
实验场景图动态图【花雕学编程】Arduino动手做(249)--GC9A01屏37个特色案例
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十七:双螺线动态旋转与随机变色
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十七:双螺线动态旋转与随机变色
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 定义阿基米德螺线参数
#define CENTER_X 120 // 屏幕中心 X
#define CENTER_Y 120 // 屏幕中心 Y
#define MAX_RADIUS 120 // 最大半径
#define FACTOR 10 // 螺线增长因子
#define STEP 0.1 // 每次增加的角度步进(弧度)
#define ROTATION_SPEED 3 // 每帧旋转的角度(度)
// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);
void drawSpiral(float rotationAngle, int direction, uint16_t color) {
float theta = 0;// 初始化角度为 0
int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点
while (theta < MAX_RADIUS / FACTOR) {
// 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
float r = FACTOR * theta;
float adjustedTheta = theta + direction * rotationAngle * 3.14159 / 180; // 顺或逆旋转
int x = CENTER_X + r * cos(adjustedTheta);
int y = CENTER_Y + r * sin(adjustedTheta);
// 连接当前点和前一个点
tft.drawLine(prevX, prevY, x, y, color);
// 更新前一个点和角度
prevX = x;
prevY = y;
theta += STEP; // 增加角度
}
}
void setup() {
Serial.begin(115200); // 初始化串口通信
Serial.println("Dual Rotating Spirals with Random Colors");
tft.begin(); // 初始化屏幕
tft.setRotation(0); // 设置屏幕方向
tft.fillScreen(GC9A01A_BLACK); // 设置黑色背景
}
void loop() {
static float rotationAngle = 0;// 初始化旋转角度
// 清屏
tft.fillScreen(GC9A01A_BLACK);
// 随机颜色
uint16_t color1 = colors;
uint16_t color2 = colors;
// 绘制顺时针螺线
drawSpiral(rotationAngle, 1, color1);
// 绘制逆时针螺线
drawSpiral(rotationAngle, -1, color2);
// 更新旋转角度
rotationAngle += ROTATION_SPEED;
if (rotationAngle >= 360) {
rotationAngle = 0; // 重置角度循环
}
delay(100); // 控制帧速率
}