【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球
本帖最后由 驴友花雕 于 2025-4-12 06:11 编辑【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球
【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球
【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之七十:GC9A01园屏之缩小与放大循环显示的七彩虹
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之七十: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" // **包含 SPI 库,用于 TFT 屏幕通信**
#include "Adafruit_GFX.h" // **包含 Adafruit GFX 图形库,用于绘制图形**
#include "Adafruit_GC9A01A.h" // **包含 GC9A01A 屏幕驱动库**
#define TFT_CS 4 // **定义 TFT 屏幕片选引脚**
#define TFT_DC 2 // **定义 TFT 屏幕数据/命令选择引脚**
#define TFT_RST -1 // **屏幕复位引脚(-1 表示未使用)**
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST); // **创建 TFT 屏幕对象**
// 定义屏幕的宽度,单位为像素
#define SCREEN_WIDTH 240
// 定义屏幕的高度,单位为像素
#define SCREEN_HEIGHT 240
// 计算屏幕的中心点横坐标
#define CENTER_X SCREEN_WIDTH / 2
// 计算屏幕的中心点纵坐标
#define CENTER_Y SCREEN_HEIGHT / 2
// 定义彩虹背景的旋转速度,值越大旋转越快
#define ROTATION_SPEED 15.5
// 定义一个包含七种颜色的数组,用于表示彩虹的七种颜色
// 每种颜色使用tft.color565函数将RGB值转换为屏幕支持的16位颜色值
const uint16_t rainbowColors = {
tft.color565(255, 0, 0), // 红色
tft.color565(255, 165, 0),// 橙色
tft.color565(255, 255, 0),// 黄色
tft.color565(0, 255, 0), // 绿色
tft.color565(0, 127, 255),// 青色
tft.color565(0, 0, 255), // 蓝色
tft.color565(139, 0, 255) // 紫色
};
// 定义一个浮点型变量,用于记录当前彩虹背景的旋转角度
float angle = 0;
// setup函数在程序开始时只执行一次,用于初始化操作
void setup() {
// 初始化串口通信,设置波特率为115200,方便调试信息的输出
Serial.begin(115200);
// 初始化屏幕,使屏幕进入可操作状态
tft.begin();
// 设置屏幕的旋转方向,这里设置为旋转2次(具体旋转效果取决于屏幕驱动)
tft.setRotation(2);
// 用黑色填充整个屏幕,清空屏幕内容
tft.fillScreen(tft.color565(0, 0, 0));
}
// loop函数会不断循环执行,实现动态效果
void loop() {
// 每次循环开始时,用黑色填充整个屏幕,清除上一帧的绘制内容
tft.fillScreen(tft.color565(0, 0, 0));
// 外层循环遍历从屏幕中心到边缘的每个半径
for (int r = 0; r < SCREEN_WIDTH / 2; r++) {
// 内层循环遍历以当前半径为圆周的每个角度(从0到360度)
for (int theta = 0; theta < 360; theta++) {
// 计算旋转后的角度,将当前角度加上总的旋转角度
float rotatedTheta = theta + angle;
// 如果旋转后的角度超过360度,减去360度,实现循环效果
if (rotatedTheta >= 360) {
rotatedTheta -= 360;
}
// 根据旋转后的角度计算当前点应该使用的彩虹颜色索引
// 将360度平均分为7份,根据旋转后的角度确定落在哪个区间
int colorIndex = (int)(rotatedTheta / (360.0 / 7)) % 7;
// 从彩虹颜色数组中获取对应的颜色值
uint16_t color = rainbowColors;
// 根据当前半径和角度,使用三角函数计算出该点在屏幕上的横坐标
int x = CENTER_X + r * cos(radians(theta));
// 根据当前半径和角度,使用三角函数计算出该点在屏幕上的纵坐标
int y = CENTER_Y + r * sin(radians(theta));
// 在计算得到的坐标位置绘制一个像素点,颜色为前面获取的彩虹颜色
tft.drawPixel(x, y, color);
}
}
// 更新旋转角度,每次循环增加一个固定的旋转速度值
angle += ROTATION_SPEED;
// 如果旋转角度超过360度,减去360度,保证角度在0到360度之间循环
if (angle >= 360) {
angle -= 360;
}
// 延迟10毫秒,控制彩虹背景的旋转速度,避免旋转过快
delay(50);
}
【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球
代码说明:1. 库文件引入与屏幕初始化:
◦ 引入 SPI.h、Adafruit_GFX.h 和 Adafruit_GC9A01A.h 这几个库文件,用于和屏幕进行通信并绘制图形。
◦ 定义屏幕的片选引脚、数据 / 命令引脚和复位引脚,创建屏幕对象 tft。
2. 常量和变量定义:
◦ SCREEN_WIDTH 和 SCREEN_HEIGHT 分别代表屏幕的宽度和高度。
◦ CENTER_X 和 CENTER_Y 表示屏幕的中心点坐标。
◦ ROTATION_SPEED 是彩虹背景的旋转速度。
◦ rainbowColors 数组存储了七种彩虹颜色。
◦ angle 变量用于记录当前的旋转角度。
3. setup 函数:
◦ 初始化串口通信,波特率设为 115200。
◦ 初始化屏幕,设置旋转方向,清屏。
4. loop 函数:
◦ 每次循环先清屏。
◦ 运用嵌套循环遍历屏幕上的每个点,根据当前的旋转角度 angle 计算出旋转后的角度 rotatedTheta。
◦ 依据 rotatedTheta 确定当前点应使用的彩虹颜色索引 colorIndex。
◦ 计算出当前点的坐标 (x, y),并使用 tft.drawPixel 函数绘制该点。
◦ 更新旋转角度 angle,若超过 360 度则减去 360 度,以实现循环旋转。
◦ 延迟 10 毫秒,控制旋转速度。
你可以把这段代码上传到 Arduino 开发板上,就能看到七色彩虹背景球大小缩放的效果。
【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球
实验场景图动态图【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球
实验场景图动态图
页:
[1]