【花雕学编程】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驱动 ![]() 实验记录视频(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)---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)) 的速率刷新表盘内容。