【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[7] = {
- 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[colorIndex];
-
- // 根据当前半径和角度,使用三角函数计算出该点在屏幕上的横坐标
- 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);
- }
复制代码
|