回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(249)---ESP32 1.28寸 TFT GC9A01屏之动态变化的两个绿色圆形模拟双眼 简单

头像 驴友花雕 2025.04.14 14 0

00 (2).jpg
02.jpg

03.jpg
10 (1).jpg
12.jpg
15.jpg

  【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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

#define TFT_CS 4
#define TFT_DC 2
#define TFT_RST -1

Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 240
#define CENTER_Y SCREEN_HEIGHT / 2
#define EYE_RADIUS 30  // **眼睛半径**
#define PUPIL_RADIUS 10  // **瞳孔半径**
#define EYE_SPACING 70  // **两眼间距**
#define MOVE_DISTANCE 40  // **左右移动距离**
#define SPEED 15  // **动画速度**

int eyeOffsetX = 0;
bool movingRight = true;
int expression = 0;  // **0: 正常, 1: 笑, 2: 哭**

void drawSmile(int x, int y) {
    for (int angle = 0; angle <= 180; angle += 5) {
        float radian = angle * M_PI / 180;
        int x1 = x + 15 * cos(radian);
        int y1 = y + 10 * sin(radian);
        int x2 = x + 15 * cos(radian + 5 * M_PI / 180);
        int y2 = y + 10 * sin(radian + 5 * M_PI / 180);
        tft.drawLine(x1, y1, x2, y2, tft.color565(255, 255, 255));
    }
}

void setup() {
    Serial.begin(115200);
    tft.begin();
    tft.setRotation(2);
}

void loop() {
    tft.fillScreen(tft.color565(0, 0, 0));

    int leftEyeX = SCREEN_WIDTH / 2 - EYE_SPACING / 2 + eyeOffsetX;
    int rightEyeX = SCREEN_WIDTH / 2 + EYE_SPACING / 2 + eyeOffsetX;

    // **绘制双眼**
    tft.fillCircle(leftEyeX, CENTER_Y, EYE_RADIUS, tft.color565(0, 255, 0));  // **左眼**
    tft.fillCircle(rightEyeX, CENTER_Y, EYE_RADIUS, tft.color565(0, 255, 0));  // **右眼**

    // **绘制瞳孔**
    tft.fillCircle(leftEyeX, CENTER_Y, PUPIL_RADIUS, tft.color565(0, 0, 0));  
    tft.fillCircle(rightEyeX, CENTER_Y, PUPIL_RADIUS, tft.color565(0, 0, 0));

    // **绘制表情**
    if (expression == 1) {  // **笑**
        drawSmile(leftEyeX, CENTER_Y + 10);
        drawSmile(rightEyeX, CENTER_Y + 10);
    } else if (expression == 2) {  // **哭**
        tft.fillCircle(leftEyeX, CENTER_Y + 15, 5, tft.color565(0, 0, 255));  // **左眼泪**
        tft.fillCircle(rightEyeX, CENTER_Y + 15, 5, tft.color565(0, 0, 255));  // **右眼泪**
    }

    // **更新眼睛左右移动**
    if (movingRight) {
        eyeOffsetX += SPEED;
        if (eyeOffsetX >= MOVE_DISTANCE) movingRight = false;
    } else {
        eyeOffsetX -= SPEED;
        if (eyeOffsetX <= -MOVE_DISTANCE) movingRight = true;
    }

    // **切换表情**
    expression = (expression + 1) % 3;

    delay(500);
}

这段代码的核心功能是 模拟双眼动画,让两只绿色眼睛呈现 正常、笑和哭 的表情,并 不断左右移动,形成动态视觉效果。

代码结构

1️⃣ 初始化屏幕

使用 Adafruit_GC9A01A 控制 TFT 显示屏,设定黑色背景。

2️⃣ 绘制双眼

fillCircle() 创建 绿色眼睛

fillCircle() 生成 黑色瞳孔,增强视觉对比度。

3️⃣ 模拟表情变化

drawSmile() 通过 多个短线段拼接 形成 弧形笑脸

fillCircle() 创建 蓝色眼泪,模拟哭泣效果。

4️⃣ 眼睛左右移动

变量 eyeOffsetX 控制 眼睛位置变动

movingRight 变量决定 眼睛左右摆动的方向,形成动态运动。

5️⃣ 循环动画

expression = (expression + 1) % 3; 依次切换 正常 → 笑 → 哭 表情。

delay(500); 控制动画节奏,让视觉效果更流畅。

最终效果

👀 双眼动态变化,展现不同表情 😆 笑脸动画,眼睛弯曲形成笑意 😢 哭泣动画,眼睛下方出现蓝色泪滴 👀 眼睛左右移动,增强真实感

实验场景图  动态图

 

89-05 (1).jpg
89-05 (2).jpg
89-05 (3).jpg
00108---.gif

评论

user-avatar
icon 他的勋章
    展开更多