126浏览
查看: 126|回复: 6

[项目] 【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球

[复制链接]
本帖最后由 驴友花雕 于 2025-4-12 06:11 编辑

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图2

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图1

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:08:12

【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图1

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:09:32

【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图1

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:11:37

【花雕学编程】Arduino动手做(249)---GC9A01缩放七彩虹球

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  项目之七十:GC9A01园屏之缩小与放大循环显示的七彩虹

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目之七十:GC9A01园屏之缩小与放大循环显示的七彩虹
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"                      // **包含 SPI 库,用于 TFT 屏幕通信**
  15. #include "Adafruit_GFX.h"             // **包含 Adafruit GFX 图形库,用于绘制图形**
  16. #include "Adafruit_GC9A01A.h"         // **包含 GC9A01A 屏幕驱动库**
  17. #define TFT_CS 4                      // **定义 TFT 屏幕片选引脚**
  18. #define TFT_DC 2                      // **定义 TFT 屏幕数据/命令选择引脚**
  19. #define TFT_RST -1                    // **屏幕复位引脚(-1 表示未使用)**
  20. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST); // **创建 TFT 屏幕对象**
  21. // 定义屏幕的宽度,单位为像素
  22. #define SCREEN_WIDTH 240
  23. // 定义屏幕的高度,单位为像素
  24. #define SCREEN_HEIGHT 240
  25. // 计算屏幕的中心点横坐标
  26. #define CENTER_X SCREEN_WIDTH / 2
  27. // 计算屏幕的中心点纵坐标
  28. #define CENTER_Y SCREEN_HEIGHT / 2
  29. // 定义彩虹背景的旋转速度,值越大旋转越快
  30. #define ROTATION_SPEED 15.5
  31. // 定义一个包含七种颜色的数组,用于表示彩虹的七种颜色
  32. // 每种颜色使用tft.color565函数将RGB值转换为屏幕支持的16位颜色值
  33. const uint16_t rainbowColors[7] = {
  34.     tft.color565(255, 0, 0),    // 红色
  35.     tft.color565(255, 165, 0),  // 橙色
  36.     tft.color565(255, 255, 0),  // 黄色
  37.     tft.color565(0, 255, 0),    // 绿色
  38.     tft.color565(0, 127, 255),  // 青色
  39.     tft.color565(0, 0, 255),    // 蓝色
  40.     tft.color565(139, 0, 255)   // 紫色
  41. };
  42. // 定义一个浮点型变量,用于记录当前彩虹背景的旋转角度
  43. float angle = 0;
  44. // setup函数在程序开始时只执行一次,用于初始化操作
  45. void setup() {
  46.     // 初始化串口通信,设置波特率为115200,方便调试信息的输出
  47.     Serial.begin(115200);
  48.     // 初始化屏幕,使屏幕进入可操作状态
  49.     tft.begin();
  50.     // 设置屏幕的旋转方向,这里设置为旋转2次(具体旋转效果取决于屏幕驱动)
  51.     tft.setRotation(2);
  52.     // 用黑色填充整个屏幕,清空屏幕内容
  53.     tft.fillScreen(tft.color565(0, 0, 0));
  54. }
  55. // loop函数会不断循环执行,实现动态效果
  56. void loop() {
  57.     // 每次循环开始时,用黑色填充整个屏幕,清除上一帧的绘制内容
  58.     tft.fillScreen(tft.color565(0, 0, 0));
  59.     // 外层循环遍历从屏幕中心到边缘的每个半径
  60.     for (int r = 0; r < SCREEN_WIDTH / 2; r++) {
  61.         // 内层循环遍历以当前半径为圆周的每个角度(从0到360度)
  62.         for (int theta = 0; theta < 360; theta++) {
  63.             // 计算旋转后的角度,将当前角度加上总的旋转角度
  64.             float rotatedTheta = theta + angle;
  65.             // 如果旋转后的角度超过360度,减去360度,实现循环效果
  66.             if (rotatedTheta >= 360) {
  67.                 rotatedTheta -= 360;
  68.             }
  69.             // 根据旋转后的角度计算当前点应该使用的彩虹颜色索引
  70.             // 将360度平均分为7份,根据旋转后的角度确定落在哪个区间
  71.             int colorIndex = (int)(rotatedTheta / (360.0 / 7)) % 7;
  72.             // 从彩虹颜色数组中获取对应的颜色值
  73.             uint16_t color = rainbowColors[colorIndex];
  74.             // 根据当前半径和角度,使用三角函数计算出该点在屏幕上的横坐标
  75.             int x = CENTER_X + r * cos(radians(theta));
  76.             // 根据当前半径和角度,使用三角函数计算出该点在屏幕上的纵坐标
  77.             int y = CENTER_Y + r * sin(radians(theta));
  78.             // 在计算得到的坐标位置绘制一个像素点,颜色为前面获取的彩虹颜色
  79.             tft.drawPixel(x, y, color);
  80.         }
  81.     }
  82.     // 更新旋转角度,每次循环增加一个固定的旋转速度值
  83.     angle += ROTATION_SPEED;
  84.     // 如果旋转角度超过360度,减去360度,保证角度在0到360度之间循环
  85.     if (angle >= 360) {
  86.         angle -= 360;
  87.     }
  88.     // 延迟10毫秒,控制彩虹背景的旋转速度,避免旋转过快
  89.     delay(50);
  90. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:14:36

【花雕学编程】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 开发板上,就能看到七色彩虹背景球大小缩放的效果。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:23:32

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球

实验场景图  动态图

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图2

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-12 06:26:39

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球

实验场景图  动态图

【花雕学编程】Arduino动手做(249)---GC9A01 缩放彩虹球图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail