【花雕学编程】Arduino TFT 之创意艺术装置

在这里插入图片描述

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino TFT 是指与 Arduino 开发板兼容的薄膜晶体管(Thin - Film - Transistor)液晶显示屏,以下是其主要特点、应用场景及注意事项的详细介绍:

一、主要特点
1、高分辨率显示:TFT 显示屏通常具有较高的分辨率,能够提供清晰、细腻的图像和文字显示效果。这使得它可以展示复杂的图形界面、丰富的色彩以及详细的信息,满足各种应用对显示质量的要求。
2、快速响应速度:TFT 技术能够实现快速的像素切换,响应速度比传统的液晶显示屏更快。这意味着在显示动态图像或进行交互操作时,不会出现明显的拖影或延迟,提供流畅的视觉体验。
3、宽视角:具有较宽的可视角度,无论从哪个方向观看显示屏,都能获得清晰的图像和一致的色彩表现。这使得在不同角度下观察显示屏时,都能保证信息的准确传达,方便多人同时查看或在不同位置操作设备。
4、丰富的色彩表现:能够呈现出丰富、鲜艳的色彩,具备较高的色彩饱和度和对比度。可以准确地显示各种颜色,使图像和界面更加生动逼真,适用于需要展示彩色图像或进行视觉交互的应用。
5、易于控制:通过 Arduino 开发板可以方便地对 TFT 显示屏进行控制。借助相应的库函数和代码,能够轻松实现图像绘制、文字显示、触摸交互等功能,降低了开发难度,即使对于没有深厚显示技术背景的开发者也较为友好。

二、应用场景
1、人机交互界面:在各种电子设备中,如智能仪器仪表、智能家居控制系统、工业自动化控制面板等,作为人机交互的窗口,用于显示菜单、参数设置界面、实时数据监测以及操作提示等信息,方便用户与设备进行交互。
2、教育领域:可用于制作教育实验设备、电子学习工具等。例如,在教学机器人中作为显示屏,展示机器人的状态信息、任务指令以及互动内容;在电子积木等教育玩具中,显示图形化的编程界面或游戏画面,增加学习的趣味性和互动性。
3、便携式设备:如手持游戏机、电子书阅读器、便携式多媒体播放器等。其高分辨率、宽视角和丰富的色彩表现能够为用户提供良好的视觉享受,同时快速响应速度也适合处理游戏中的动态画面和多媒体内容的播放。
4、物联网应用:在物联网项目中,作为节点设备的显示屏,用于展示传感器采集的数据、设备状态信息以及远程控制界面等。例如,在环境监测系统中,显示温度、湿度、空气质量等数据;在智能农业中,展示农田的灌溉状态、作物生长信息等。

三、需要注意的事项
1、电源管理:TFT 显示屏通常需要稳定的电源供应,并且其功耗相对较高。在与 Arduino 连接时,要确保电源能够满足显示屏的需求,避免因电源不稳定导致显示屏出现闪烁、显示异常或损坏等问题。同时,要合理设计电源电路,考虑节能措施,特别是在电池供电的设备中,以延长设备的续航时间。
2、接口兼容性:不同型号的 Arduino 开发板和 TFT 显示屏可能具有不同的接口类型和通信协议。在选择和使用时,要确保两者之间的接口兼容,并且正确连接引脚。有些 TFT 显示屏可能需要额外的驱动电路或转接板才能与 Arduino 顺利连接,需要仔细阅读产品说明书并进行相应的配置。
3、显示内存限制:虽然 TFT 显示屏能够显示丰富的内容,但 Arduino 的内存资源有限。在绘制复杂图像或显示大量数据时,可能会遇到内存不足的问题。因此,需要合理规划显示内容,优化图像和数据的存储方式,避免因内存耗尽导致程序崩溃或显示异常。
4、驱动程序和库的使用:为了实现 TFT 显示屏的各种功能,需要使用相应的驱动程序和库。不同的显示屏可能需要不同的库,并且这些库可能会不断更新和改进。在使用过程中,要及时关注官方文档和社区资源,获取最新的驱动程序和库,并了解其使用方法和注意事项。同时,要注意库与 Arduino IDE 版本的兼容性,避免出现编译错误或运行时问题。
5、电磁干扰:在一些电磁环境较为复杂的场合,TFT 显示屏可能会受到电磁干扰,导致显示出现噪点、闪烁或颜色异常等问题。此时,需要采取相应的抗干扰措施,如合理布线、使用屏蔽线、添加滤波电容等,以确保显示屏的稳定工作。

在这里插入图片描述
主要特点

  1. 高度定制化
    视觉效果:借助 Arduino 的编程能力与 TFT 屏幕的显示特性,能够打造出独一无二的视觉效果。可以根据不同的艺术理念和创意需求,设计出各种动态图案、色彩组合以及动画效果。例如,通过编程控制像素的颜色变化,实现渐变、闪烁、流动等动态效果,为艺术装置增添独特的魅力。
    交互方式:能够灵活设计交互方式,用户可以通过触摸、手势、声音等多种方式与艺术装置进行互动。比如,结合红外传感器或麦克风,当检测到用户的手势动作或声音指令时,TFT 屏幕上的图案和颜色会相应地发生变化,增强用户的参与感和体验感。
  2. 实时响应
    数据反馈:Arduino 可以实时采集各种传感器的数据,并根据这些数据实时更新 TFT 屏幕的显示内容。例如,连接温度传感器,当环境温度发生变化时,屏幕上的图案颜色或形态会随之改变,直观地反映出温度的变化情况。
    交互响应:对于用户的交互操作,艺术装置能够迅速做出响应。无论是触摸屏幕还是发出声音指令,TFT 屏幕都能在短时间内更新显示,让用户感受到流畅的交互体验。
  3. 多元素融合
    多媒体结合:可以将图像、文字、动画、声音等多种元素融合在一起,创造出丰富多样的艺术表现形式。例如,在 TFT 屏幕上显示动态的图像和文字,同时配合音效,营造出沉浸式的艺术氛围。
    跨学科融合:涉及电子工程、计算机编程、艺术设计等多个学科领域。通过将不同学科的知识和技能相结合,能够创造出更具创新性和科技感的艺术作品。
  4. 成本效益高
    硬件成本:Arduino 开发板和 TFT 显示屏的价格相对较低,而且具有开源的特点,用户可以根据自己的需求选择合适的硬件型号,降低硬件成本。
    开发成本:Arduino 的编程环境简单易用,有丰富的开源库和示例代码可供参考,即使是没有专业编程经验的艺术创作者也能快速上手,减少开发时间和成本。

应用场景

  1. 公共艺术展示
    城市广场:在城市广场等公共场所设置创意艺术装置,吸引市民的关注和参与。例如,设计一个以城市文化为主题的艺术装置,通过 TFT 屏幕展示城市的历史变迁、文化特色等内容,同时结合市民的交互操作,增强市民对城市文化的认同感和归属感。
    艺术展览:在艺术展览中,作为独特的展品展示艺术创作者的创意和理念。可以通过动态的图像和交互效果,打破传统艺术展览的静态展示方式,为观众带来全新的艺术体验。
  2. 商业空间装饰
    商场、酒店:在商场、酒店等商业空间中,作为装饰元素提升空间的艺术氛围和吸引力。例如,在商场的中庭设置一个大型的创意艺术装置,通过 TFT 屏幕展示品牌形象、促销活动等信息,吸引顾客的注意力,促进消费。
    餐厅、咖啡馆:在餐厅、咖啡馆等休闲场所,营造出独特的用餐环境。可以根据场所的主题和氛围,设计出相应的艺术装置,如星空主题、海洋主题等,让顾客在享受美食的同时,感受到艺术的熏陶。
  3. 教育领域
    学校、科技馆:在学校和科技馆等教育场所,作为教学工具帮助学生了解电子技术、编程和艺术设计等知识。学生可以通过参与艺术装置的设计和制作过程,提高自己的实践能力和创新思维。
    艺术培训:在艺术培训机构中,为学员提供一个创新的创作平台。学员可以利用 Arduino 和 TFT 屏幕,将自己的艺术创意转化为实际的作品,提高自己的艺术创作水平。
  4. 家庭装饰
    客厅、卧室:作为家庭装饰的一部分,为家居环境增添艺术气息。可以根据家庭的装修风格和个人喜好,设计出个性化的艺术装置,如动态的壁画、创意的时钟等,让家居生活更加丰富多彩。

需要注意的事项

  1. 硬件稳定性
    电源供应:确保 Arduino 开发板和 TFT 显示屏有稳定的电源供应,避免因电源波动导致设备故障或显示异常。可以使用稳压电源或电池组,并注意电源的极性和电压范围。
    连接可靠性:检查硬件之间的连接是否牢固,避免松动或接触不良导致数据传输错误或设备损坏。特别是 TFT 显示屏的排线连接,要确保连接紧密。
  2. 软件优化
    代码效率:优化 Arduino 的代码,提高程序的运行效率,避免因代码复杂或执行效率低下导致设备响应缓慢或卡顿。可以采用合理的数据结构和算法,减少不必要的计算和内存占用。
    兼容性:确保使用的开源库和代码与 Arduino 开发板和 TFT 显示屏兼容,避免出现兼容性问题导致程序无法正常运行。在使用新的库和代码之前,要进行充分的测试。
  3. 安全性
    电气安全:注意电气安全,避免触电事故。在连接和调试硬件时,要确保电源已关闭,并遵循正确的操作流程。对于裸露的电线和电气元件,要做好绝缘处理。
    交互安全:在设计交互方式时,要考虑用户的安全。避免使用过于危险或容易导致用户受伤的交互方式,如高压电击、高温烫伤等。
  4. 维护与更新
    定期维护:定期对艺术装置进行维护,检查硬件设备的工作状态,清理屏幕和传感器等部件,确保设备的正常运行。
    功能更新:根据实际需求和用户反馈,对艺术装置的功能进行更新和升级。可以通过更新 Arduino 的代码或更换硬件设备,为用户带来更好的体验。

在这里插入图片描述

1、互动灯光艺术装置

#include <TFT_eSPI.h> 
#include <Bounce2.h> 
 
TFT_eSPI tft = TFT_eSPI(); 
Bounce debouncer = Bounce(); 
 
#define BUTTON_PIN 0 
 
void setup() { 
  tft.init(); 
  tft.setRotation(1); 
  tft.fillScreen(TFT_BLACK); 
 
  pinMode(BUTTON_PIN, INPUT_PULLUP); 
  debouncer.attach(BUTTON_PIN); 
  debouncer.interval(5); 
} 
 
void loop() { 
  debouncer.update(); 
  if (debouncer.fell()) { 
    drawInteractiveArt(); 
  } 
} 
 
void drawInteractiveArt() { 
  tft.fillScreen(TFT_BLACK); 
  for (int i = 0; i < 100; i++) { 
    int x = random(tft.width()); 
    int y = random(tft.height()); 
    int color = tft.color565(random(256), random(256), random(256)); 
    tft.fillCircle(x, y, random(3, 10), color); 
  } 
}

要点解读

硬件配置:
使用电容触摸按钮(或普通按钮)通过Bounce2库实现按键消抖
TFT屏幕需配置TFT_eSPI库的User_Setup.h,确保TFT_CS、TFT_DC等引脚正确映射
艺术生成逻辑:
每次按键触发时清屏并随机生成100个彩色圆点
颜色通过color565函数生成16位色值,提升显示精度
性能优化:
使用randomSeed(analogRead(0))可增加伪随机性(需连接未使用的模拟引脚)
圆点大小动态范围设置为3-10像素,避免小尺寸屏幕显示过密

2、动态数据可视化装置

#include <TFT_eSPI.h> 
#include <ArduinoJson.h> 
 
TFT_eSPI tft = TFT_eSPI(); 
 
// 模拟传感器数据
struct SensorData {
  float temperature;
  float humidity;
};
 
SensorData mockSensorData() {
  return {22.5 + random(-1, 2), 55.0 + random(-3, 3)};
}
 
void setup() { 
  tft.init(); 
  tft.setRotation(1); 
  tft.fillScreen(TFT_BLACK); 
} 
 
void loop() { 
  SensorData data = mockSensorData(); 
  drawDataVisualization(data); 
  delay(1000); 
} 
 
void drawDataVisualization(SensorData data) { 
  tft.fillRect(0, 0, tft.width(), 40, TFT_BLACK); 
  tft.setTextColor(TFT_WHITE, TFT_BLACK); 
  tft.setTextDatum(MC_DATUM); 
  tft.drawString("Temp: " + String(data.temperature) + "°C", tft.width() / 2, 10); 
  tft.drawString("Humidity: " + String(data.humidity) + "%", tft.width() / 2, 30); 
 
  // 动态波形
  static int16_t prevY[128] = {0}; 
  static int xPos = 0; 
  int16_t y = 64 - (data.temperature / 40.0) * 64; 
  tft.drawLine(xPos - 1, prevY[xPos % 128], xPos, y, TFT_CYAN); 
  prevY[xPos % 128] = y; 
  xPos = (xPos + 1) % 128; 
}

要点解读

数据模拟:
使用mockSensorData函数生成模拟温湿度数据,实际项目中可替换为DHT11/22传感器读取
数据范围:温度0-40°C,湿度0-100%
可视化设计:
顶部显示实时数据文本,使用setTextDatum实现居中对齐
底部波形图通过drawLine实现动态更新,x轴循环覆盖128个像素点
性能优化:
波形图仅更新最新点与前一点的连线,避免全屏重绘
使用int16_t数组缓存历史y坐标,减少内存分配

3、环境感知艺术装置

#include <TFT_eSPI.h> 
#include <Adafruit_BME280.h> 
 
TFT_eSPI tft = TFT_eSPI(); 
Adafruit_BME280 bme; 
 
void setup() { 
  tft.init(); 
  tft.setRotation(1); 
  tft.fillScreen(TFT_BLACK); 
 
  if (!bme.begin(0x76)) { 
    while (1); 
  } 
} 
 
void loop() { 
  float temperature = bme.readTemperature(); 
  float pressure = bme.readPressure() / 100.0F; 
  float altitude = bme.readAltitude(1013.25); 
 
  drawEnvironmentArt(temperature, pressure, altitude); 
  delay(2000); 
} 
 
void drawEnvironmentArt(float temp, float press, float alt) { 
  tft.fillScreen(TFT_BLACK); 
 
  // 温度可视化
  tft.fillRect(0, 0, 120, 40, TFT_BLUE); 
  tft.setTextColor(TFT_WHITE, TFT_BLUE); 
  tft.setCursor(5, 10); 
  tft.print("Temp: " + String(temp) + "C"); 
 
  // 压力可视化
  tft.fillRect(0, 50, 120, 40, TFT_RED); 
  tft.setTextColor(TFT_WHITE, TFT_RED); 
  tft.setCursor(5, 60); 
  tft.print("Press: " + String(press) + "hPa"); 
 
  // 海拔可视化
  tft.fillRect(0, 100, 120, 40, TFT_GREEN); 
  tft.setTextColor(TFT_WHITE, TFT_GREEN); 
  tft.setCursor(5, 110); 
  tft.print("Alt: " + String(alt) + "m"); 
 
  // 动态背景
  for (int i = 0; i < 240; i += 8) { 
    tft.drawFastVLine(i, 0, 160, tft.color565(i, 128, 255 - i)); 
  } 
}

要点解读

传感器集成:
使用BME280传感器读取温湿度、气压和海拔数据
I2C地址需根据模块配置(默认0x76)
艺术化呈现:
数据分块显示,每个模块使用不同背景色
动态背景通过drawFastVLine实现渐变色条,增强视觉吸引力
性能优化:
仅在数据变化时更新对应模块,减少屏幕刷新区域
背景渐变计算通过color565实现硬件加速
技术总结
屏幕驱动:
推荐使用TFT_eSPI库,支持SPI/8080并行接口,性能优于Adafruit_GFX
配置User_Setup.h时需根据屏幕型号调整TFT_WIDTH、TFT_HEIGHT等参数
数据可视化:
文本显示建议使用drawString,字符间距可通过setTextPadding调整
图形绘制优先使用drawFastVLine/drawFastHLine,避免drawLine的性能开销
硬件扩展:
按钮输入需配置INPUT_PULLUP模式,简化外接电路
传感器I2C总线需串联4.7kΩ上拉电阻,确保通信稳定性
创意实现:
动态效果可通过delay或millis()实现时间控制
颜色渐变建议使用color565的RGB分量线性插值,避免使用tft.colorWheel导致的性能瓶颈

在这里插入图片描述

4、动态彩色光圈渐变
此程序模拟一个动态的彩色光圈渐变效果,通过颜色变化和圆环扩展形成视觉冲击。

#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

void setup() {
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
}

void loop() {
  for (int radius = 10; radius <= 120; radius += 5) { // 动态扩展圆环半径
    uint16_t color = tft.color565(random(255), random(255), random(255)); // 随机生成颜色
    tft.drawCircle(tft.width() / 2, tft.height() / 2, radius, color); // 绘制圆环
    delay(50); // 控制动画速度
  }
  tft.fillScreen(TFT_BLACK); // 清屏后重新开始
}

要点解读:
动态绘制:
使用 drawCircle 方法绘制不同半径的圆环。
圆心固定在屏幕中心,半径逐渐增大,形成向外扩展的效果。
颜色随机化:
使用 tft.color565 函数生成随机颜色,增加视觉冲击力。
循环与清屏:
每次动画完成后调用 fillScreen 清屏,确保画面整洁并重新开始。

5、交互式触摸画板
此程序实现一个简单的触摸画板功能,用户可以通过触摸屏幕绘制线条,并支持清屏功能。

#include <TFT_eSPI.h>
#include <XPT2046_Touchscreen.h> // 引入触摸屏驱动

#define CS_PIN 8
#define TIRQ_PIN 2

TFT_eSPI tft = TFT_eSPI();
XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN);

bool clearScreenFlag = false;

void setup() {
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);

  ts.begin();
  ts.setRotation(1); // 设置触摸屏方向
}

void loop() {
  if (ts.touched()) {
    TS_Point touch = ts.getPoint();
    int x = map(touch.x, 0, 4095, 0, tft.width());
    int y = map(touch.y, 0, 4095, 0, tft.height());

    if (x > 0 && x < tft.width() && y > 0 && y < tft.height()) {
      tft.fillCircle(x, y, 5, TFT_WHITE); // 在触摸点绘制小圆点
    }

    // 如果触摸到右上角区域,触发清屏
    if (x > tft.width() - 20 && y < 20) {
      tft.fillScreen(TFT_BLACK);
    }
  }
}

要点解读:
触摸屏集成:
使用 XPT2046_Touchscreen 库读取触摸屏数据。
将触摸坐标映射到屏幕像素范围。
实时绘制:
每次检测到触摸事件时,在触摸点绘制一个小圆点。
清屏功能:
当触摸点位于右上角区域时,触发清屏操作。
交互设计:
触摸屏为用户提供直接的交互方式,适合展览或互动装置。

6、粒子系统模拟
此程序模拟一个简单的粒子系统,每个粒子从屏幕顶部随机生成并自由下落,形成类似“流星雨”的效果。

#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

const int MAX_PARTICLES = 50;
struct Particle {
  int x, y;
  int speed;
  uint16_t color;
} particles[MAX_PARTICLES];

void setup() {
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);

  // 初始化粒子
  for (int i = 0; i < MAX_PARTICLES; i++) {
    particles[i].x = random(tft.width());
    particles[i].y = random(-tft.height(), 0);
    particles[i].speed = random(2, 6);
    particles[i].color = tft.color565(random(255), random(255), random(255));
  }
}

void loop() {
  tft.fillScreen(TFT_BLACK); // 清屏

  for (int i = 0; i < MAX_PARTICLES; i++) {
    particles[i].y += particles[i].speed; // 更新粒子位置
    if (particles[i].y > tft.height()) { // 如果超出屏幕,重置粒子
      particles[i].y = random(-tft.height(), 0);
      particles[i].x = random(tft.width());
    }
    tft.fillCircle(particles[i].x, particles[i].y, 2, particles[i].color); // 绘制粒子
  }

  delay(30); // 控制帧率
}

要点解读:
粒子系统设计:
使用结构体 Particle 存储每个粒子的位置、速度和颜色。
粒子从屏幕顶部随机生成,并以随机速度下落。
动态更新:
每次循环更新所有粒子的位置,并检查是否超出屏幕边界。
视觉效果:
使用 fillCircle 绘制粒子,大小固定为2像素。
粒子颜色随机生成,增强视觉多样性。
帧率控制:
使用 delay 控制刷新频率,避免动画过快或卡顿。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值