【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例

2025-03-232.7万
AI 快速预览详细 收起
本文介绍了使用Arduino和ESP32驱动1.28寸圆形彩色TFT显示屏GC9A01的39个特色小项目。每个项目都提供了详细的代码和实验步骤,适合初学者和有一定经验的开发者。通过这些实验,您可以深入了解如何利用Arduino进行图形显示编程,并激发您的创造力。


37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1


实验记录视频(1分钟35秒)

【【花雕学编程】Arduino动手做(249)---ESP32驱动1.28寸 TFT GC9A01圆屏之39个特色小项目#单片机开发 #电子爱好者 #嵌入式】


https://www.bilibili.com/video/BV1iZZFYjEuj/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987








00 (1).jpg (485.6 KB, 下载次数: 10045)

Arduino动手做(249)--GC9A01屏39个特色案例_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(197)
工控小菜鸡
工控小菜鸡
怎么做汉字效果呢
驴友花雕
驴友花雕
作者
回复工控小菜鸡
是二年前发的帖子,我查了一下,当时好像没有试过显示汉字.......
驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
待续待续................................................
驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者




驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
实验记录视频(1分钟35秒)
【【花雕学编程】Arduino动手做(249)---ESP32驱动1.28寸 TFT GC9A01圆屏之39个特色小项目#单片机开发 #电子爱好者 #嵌入式】
https://www.bilibili.com/video/BV1iZZFYjEuj/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1iZZFYjEuj/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者
实验场景图 动态图


驴友花雕
驴友花雕
作者
代码解读
1、屏幕初始化
[code]#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"[/code]
引入 SPI 和 Adafruit_GFX 库,用于图形绘制功能。
引入 Adafruit_GC9A01A 库,专用于驱动 GC9A01A 圆形屏幕,提供绘制圆形、线条、文字等能力。
2、屏幕硬件配置
[code]#define TFT_CS 4
#define TFT_DC 2
#define TFT_RST -1
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);[/code]
TFT_CS、TFT_DC 和 TFT_RST 是屏幕的引脚定义。
TFT_RST 为 -1,表示未使用复位引脚。
使用 Adafruit_GC9A01A 初始化屏幕对象 tft。
3、 屏幕中心和表盘参数
[code]#define SCREEN_CENTER_X 120
#define SCREEN_CENTER_Y 120
#define CLOCK_RADIUS 100
#define HAND_COLOR GC9A01A_WHITE[/code]
定义屏幕中心 (120, 120),适配 GC9A01A 的圆形屏幕(分辨率 240x240 像素)。
表盘半径设置为 100 像素,指针颜色设为白色。
4、时间变量初始化
[code]int hours = 01, minutes = 42, seconds = 00;[/code]
时间初始化为 01:42:00。
5、绘制表盘的功能
5.1 绘制表盘外圈
[code]tft.drawCircle(SCREEN_CENTER_X, SCREEN_CENTER_Y, CLOCK_RADIUS, GC9A01A_WHITE);
tft.drawCircle(SCREEN_CENTER_X, SCREEN_CENTER_Y, CLOCK_RADIUS - 5, GC9A01A_CYAN);[/code]
绘制两个同心圆,形成表盘外圈,分别使用白色和青色,增加美感。
5.2 绘制小时刻度
[code]for (int i = 0; i < 12; i++) {
float angle = i * 30 * 3.14159 / 180;
int x1 = SCREEN_CENTER_X + (CLOCK_RADIUS - 10) * cos(angle);
int y1 = SCREEN_CENTER_Y + (CLOCK_RADIUS - 10) * sin(angle);
int x2 = SCREEN_CENTER_X + (CLOCK_RADIUS - 20) * cos(angle);
int y2 = SCREEN_CENTER_Y + (CLOCK_RADIUS - 20) * sin(angle);
tft.drawLine(x1, y1, x2, y2, GC9A01A_WHITE);
}[/code]
使用 cos 和 sin 函数计算小时刻度位置(角度每小时增加 30°)。
两点 (x1, y1) 和 (x2, y2) 通过 drawLine 绘制刻度线。
5.3 绘制分钟刻度
[code]for (int i = 0; i < 60; i++) {
if (i % 5 != 0) { // 避开小时刻度
float angle = i * 6 * 3.14159 / 180;
int x1 = SCREEN_CENTER_X + (CLOCK_RADIUS - 10) * cos(angle);
int y1 = SCREEN_CENTER_Y + (CLOCK_RADIUS - 10) * sin(angle);
tft.drawPixel(x1, y1, GC9A01A_YELLOW);
}
}[/code]
使用 cos 和 sin 函数计算分钟刻度位置(角度每分钟增加 6°)。
每 5 分钟避开小时刻度,仅绘制点刻度。
6、绘制指针的功能
6.1 时针
[code]float hourAngle = (hours % 12 + minutes / 60.0) * 30 * 3.14159 / 180;
int hourX = SCREEN_CENTER_X + (CLOCK_RADIUS - 50) * cos(hourAngle);
int hourY = SCREEN_CENTER_Y + (CLOCK_RADIUS - 50) * sin(hourAngle);
tft.drawLine(SCREEN_CENTER_X, SCREEN_CENTER_Y, hourX, hourY, HAND_COLOR);[/code]
根据当前时间计算时针角度:
每小时角度增量为 30°,并加入分钟的偏移。
时针长度为半径减 50 像素。
6.2 分针
[code]float minuteAngle = (minutes + seconds / 60.0) * 6 * 3.14159 / 180;
int minuteX = SCREEN_CENTER_X + (CLOCK_RADIUS - 30) * cos(minuteAngle);
int minuteY = SCREEN_CENTER_Y + (CLOCK_RADIUS - 30) * sin(minuteAngle);
tft.drawLine(SCREEN_CENTER_X, SCREEN_CENTER_Y, minuteX, minuteY, GC9A01A_GREEN);[/code]
分针角度每分钟增加 6°,同时加入秒数偏移。
分针长度为半径减 30 像素。
6.3 秒针
[code]float secondAngle = seconds * 6 * 3.14159 / 180;
int secondX = SCREEN_CENTER_X + (CLOCK_RADIUS - 20) * cos(secondAngle);
int secondY = SCREEN_CENTER_Y + (CLOCK_RADIUS - 20) * sin(secondAngle);
tft.drawLine(SCREEN_CENTER_X, SCREEN_CENTER_Y, secondX, secondY, GC9A01A_RED);[/code]
秒针角度每秒增加 6°。
秒针长度为半径减 20 像素。
7、显示数字时间
[code]tft.setTextSize(2);
tft.setTextColor(GC9A01A_WHITE, GC9A01A_BLACK); // 白色文字,黑色背景
tft.setCursor(73, 160);
tft.printf("%02d:%02d:%02d", hours, minutes, seconds);[/code]
显示数字时间,格式为 01:42:00,居中显示在表盘下方。
8、更新时间
[code]seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
}[/code]
每秒更新时间变量,并递归处理分钟和小时的变化。
9、主循环
[code]tft.fillCircle(SCREEN_CENTER_X, SCREEN_CENTER_Y, CLOCK_RADIUS - 5, GC9A01A_BLACK);
drawClockFace();
drawHands();
displayDigitalTime();
updateClock();
delay(1000);[/code]
清除上一帧内容,绘制表盘、指针和数字时间,并更新时间。
以每秒 (delay(1000)) 的速率刷新表盘内容。