18浏览
查看: 18|回复: 7

[项目] 【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

[复制链接]
【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图2

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图1

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图1

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图2

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  项目之一百二十七:ESP32+GC9A01之位置随机的红蓝绿颜色十个字母

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目之一百二十七:ESP32+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 <TFT_eSPI.h>
  15. TFT_eSPI tft = TFT_eSPI();
  16. TFT_eSprite spr = TFT_eSprite(&tft);  // 创建精灵
  17. #define SCREEN_WIDTH 240
  18. #define SCREEN_HEIGHT 240
  19. #define REFRESH_INTERVAL 600 // 每 0.6 秒刷新一次
  20. const char* texts[] = {"A", "B", "C", "D", "E", "F", "G"}; // 显示的字符
  21. unsigned long lastUpdate = 0;
  22. void setup() {
  23.     tft.init();
  24.     tft.setRotation(2); // 设定屏幕方向
  25.     tft.fillScreen(TFT_BLACK); // 清空屏幕
  26.     randomSeed(analogRead(0)); // 初始化随机数种子
  27.     spr.createSprite(SCREEN_WIDTH, SCREEN_HEIGHT); // 创建精灵
  28.     spr.setTextDatum(MC_DATUM);  // 设置文本居中对齐
  29. }
  30. void loop() {
  31.     if (millis() - lastUpdate > REFRESH_INTERVAL) {
  32.         lastUpdate = millis();
  33.         showRandomTexts();
  34.     }
  35. }
  36. /**
  37. * 随机显示 10 个字符,颜色随机,位置随机
  38. */
  39. void showRandomTexts() {
  40.     spr.fillSprite(TFT_BLACK); // 清空精灵背景
  41.     for (int i = 0; i < 10; i++) {
  42.         int x = random(0, SCREEN_WIDTH - 20); // 随机 X 坐标
  43.         int y = random(0, SCREEN_HEIGHT - 20); // 随机 Y 坐标
  44.         spr.setTextColor(getRandomColor(), TFT_BLACK); // 设定随机颜色
  45.         spr.setTextSize(10); // 设置超大字体
  46.         spr.drawString(texts[random(0, 7)], x, y); // 随机位置绘制字符
  47.     }
  48.     spr.pushSprite(0, 0); // 将精灵绘制到屏幕
  49. }
  50. /**
  51. * 生成随机颜色(红、绿、蓝)
  52. */
  53. uint16_t getRandomColor() {
  54.     switch (random(0, 3)) {
  55.         case 0: return TFT_RED;
  56.         case 1: return TFT_GREEN;
  57.         case 2: return TFT_BLUE;
  58.     }
  59.     return TFT_WHITE;
  60. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

这段 Arduino 代码的主要功能是在 1.28 英寸圆形彩色 TFT 显示屏(GC9A01 驱动)上随机显示 10 个红、绿或蓝色的字母,并且这些字母的位置也是随机的。屏幕会大约每 0.6 秒刷新一次,显示新的随机字母和位置。

更详细地解读:

1、注释说明:
代码开头注释了这是一个基于 "189种传感器模块系列实验" 的项目,具体是针对 1.28 寸圆形 TFT 屏幕 (GC9A01 驱动)。
还给出了 GC9A01 模块与 ESP32 开发板的引脚连接说明,例如 RST 未连接,CS 接 D4,DC 接 D2,SDA 接 D23 (绿色线),SCL 接 D18 (黄色线),GND 接 GND,VCC 接 3.3V。

2、库包含:
#include <TFT_eSPI.h>: 包含了用于控制 ESP32 TFT 屏幕的强大库。

3、对象创建:
TFT_eSPI tft = TFT_eSPI();: 创建了一个 TFT_eSPI 类的对象 tft,用于直接操作屏幕。
TFT_eSprite spr = TFT_eSprite(&tft);: 创建了一个 TFT_eSprite 类的对象 spr,这是一个“精灵”,可以先在内存中绘制图像,然后一次性推送到屏幕上,通常用于提高动画性能,尤其是在频繁更新屏幕内容时。

4、宏定义:
#define SCREEN_WIDTH 240: 定义屏幕宽度为 240 像素。
#define SCREEN_HEIGHT 240: 定义屏幕高度为 240 像素。
#define REFRESH_INTERVAL 600: 定义屏幕刷新的时间间隔为 600 毫秒 (0.6 秒)。

5、显示文本数组:
const char* texts[] = {"A", "B", "C", "D", "E", "F", "G"};: 创建一个包含 7 个大写字母的字符串数组,用于随机选择显示。

6、刷新时间记录:
unsigned long lastUpdate = 0;: 用于记录上次屏幕更新的时间,以便控制刷新频率。

7、setup() 函数 (初始化):
tft.init();: 初始化 TFT 屏幕。
tft.setRotation(2);: 设置屏幕的显示方向(可能是横向显示,具体取决于硬件连接和屏幕方向)。
tft.fillScreen(TFT_BLACK);: 将屏幕填充为黑色,作为初始背景。
randomSeed(analogRead(0));: 使用连接到模拟引脚 A0 的随机噪声来初始化随机数生成器,确保每次启动后随机数序列不同。
spr.createSprite(SCREEN_WIDTH, SCREEN_HEIGHT);: 在内存中创建一个与屏幕尺寸相同的精灵缓冲区。
spr.setTextDatum(MC_DATUM);: 设置文本的对齐方式为中间居中 (Middle Center Datum),这样在指定坐标绘制文本时,文本会以该坐标为中心。

8、loop() 函数 (主循环):
if (millis() - lastUpdate > REFRESH_INTERVAL): 检查自上次屏幕更新以来是否已经过了 REFRESH_INTERVAL 毫秒。
lastUpdate = millis();: 如果时间间隔已到,则更新 lastUpdate 为当前时间。
showRandomTexts();: 调用 showRandomTexts() 函数来生成并显示新的随机字母。

9、showRandomTexts() 函数 (显示随机文本):
spr.fillSprite(TFT_BLACK);: 清空精灵缓冲区,用黑色填充。
for (int i = 0; i < 10; i++): 循环 10 次,绘制 10 个随机字母。
int x = random(0, SCREEN_WIDTH - 20);: 生成一个 0 到屏幕宽度减去 20 的随机 X 坐标,留出一些边距以防止字母超出屏幕。
int y = random(0, SCREEN_HEIGHT - 20);: 生成一个 0 到屏幕高度减去 20 的随机 Y 坐标,同样留出边距。
spr.setTextColor(getRandomColor(), TFT_BLACK);: 设置文本颜色为一个随机的红、绿或蓝色,背景色为黑色(虽然背景已经填充为黑色,但这是 drawString() 函数的参数要求)。
spr.setTextSize(10);: 设置文本的字体大小为 10(这是一个相对较大的字体)。
spr.drawString(texts[random(0, 7)], x, y);: 从 texts 数组中随机选择一个字母,并在随机生成的 (x, y) 坐标处绘制到精灵缓冲区上。
spr.pushSprite(0, 0);: 将精灵缓冲区的内容一次性推送到屏幕的 (0, 0) 坐标处,完成屏幕的更新。

10、getRandomColor() 函数 (生成随机颜色):
switch (random(0, 3)): 生成一个 0 到 2 的随机整数。
根据随机数的值,返回 TFT_RED、TFT_GREEN 或 TFT_BLUE 中的一个颜色常量。
如果随机数不在 0-2 范围内(理论上不会发生,但作为保险),则返回 TFT_WHITE。

总而言之,这段代码演示了如何使用 ESP32 和 TFT_eSPI 库来控制一个圆形彩色 TFT 屏幕,使其能够周期性地显示 10 个随机颜色和随机位置的大写字母。使用了精灵 (Sprite) 技术来提高可能的刷新性能。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

实验场景图  动态图

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图1

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图2

【花雕学编程】Arduino动手做(249)--GC9A01位置随机的字母图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【花雕学编程】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