【花雕学编程】Arduino OLED 之左右转动的眼睛动画

在这里插入图片描述
《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html

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 OLED 指的是将 Arduino 开发平台与 OLED(有机发光二极管)显示屏相结合的应用组合。Arduino 是开源电子原型平台,具备灵活的硬件扩展性和简单易上手的编程环境;OLED 显示屏则以其自发光、高对比度、宽视角、响应速度快等优势,为信息展示提供了优质的视觉体验。二者结合能实现各类数据显示、图形绘制及交互界面展示等功能,在电子制作、物联网、机器人等诸多领域广泛应用。
详细解释

Arduino 相关特性
硬件特性
开源设计:Arduino 的硬件设计方案完全公开,用户能够获取其原理图、PCB 版图等详细资料。这不仅降低了开发成本,还方便开发者根据自身需求对硬件进行修改和扩展,例如制作自定义外形或功能的开发板。
丰富接口资源:Arduino 开发板配备了多种类型的接口。数字输入输出引脚可用于连接开关、继电器、LED 等设备,实现数字信号的读取和输出控制;模拟输入引脚能够采集如温度传感器、光照传感器输出的连续模拟信号,经内部 ADC(模拟 - 数字转换器)转换为数字值供程序处理。
多种供电方式:支持 USB 供电、外接电源适配器供电以及电池供电等多种方式。使用 USB 供电时,可方便地与计算机连接进行程序上传和调试;外接电源适配器则能提供稳定的电源,适用于长时间运行的项目;电池供电赋予了 Arduino 设备便携性,可应用于移动监测等场景。
软件特性
简易编程环境:Arduino 使用基于 C/C++ 的编程语言,其语法简洁易懂。Arduino IDE 是专门为其开发的集成开发环境,具有跨平台性,可在 Windows、Mac OS、Linux 等操作系统上运行。IDE 提供了直观的代码编辑界面、便捷的编译和上传功能,还内置了大量示例代码,帮助初学者快速入门。
庞大的库资源:Arduino 社区拥有丰富的开源库,涵盖了传感器驱动、通信协议、图形绘制等各个领域。例如,Wire 库用于 I2C 通信,SPI 库用于 SPI 通信,开发者可以直接调用这些库,无需从头编写底层代码,大大提高了开发效率。
OLED 显示屏特性
显示原理
OLED 基于有机材料的电致发光特性工作。当在有机材料层两端施加电压时,电子从阴极注入,空穴从阳极注入,二者在有机材料中相遇并复合,释放出能量以光的形式呈现,从而实现发光显示。由于每个像素都能独立发光,OLED 显示屏无需背光源。
性能优势
自发光与高对比度:自发光特性使得 OLED 能够实现真正的黑色显示,因为不发光的像素完全不产生光线。这使得其对比度极高,图像的亮部更亮,暗部更暗,色彩表现更加生动逼真。
宽视角:OLED 的视角非常宽广,通常可达 170° 以上。从不同角度观看显示屏,画面的颜色和亮度变化极小,能为用户提供一致的视觉体验,适用于各种需要多角度观察的应用场景。
快速响应时间:OLED 的响应时间极短,一般在几微秒到几十微秒之间。相比传统的液晶显示屏,OLED 在显示动态画面时不会出现拖影现象,能够清晰、流畅地展示快速变化的图像,如动画、视频等。
轻薄与低功耗:由于无需背光源,OLED 显示屏的结构更加简单,厚度更薄,重量更轻。同时,其在显示黑色画面时几乎不消耗电能,只有发光的像素才会消耗功率,因此在显示深色画面较多的场景下,功耗显著降低。
Arduino 与 OLED 的连接和通信
通信接口类型
SPI(Serial Peripheral Interface):SPI 是一种高速的全双工串行通信协议,Arduino 通过 SPI 接口与 OLED 显示屏连接时,通常需要使用时钟线(SCK)、主输出从输入线(MOSI)、主输入从输出线(MISO)和片选线(SS)。SPI 通信速度快,适合需要快速传输大量数据的应用场景,如显示高分辨率的图像或视频流。
I2C(Inter - Integrated Circuit):I2C 是一种串行通信协议,使用两根线进行通信,即时钟线(SCL)和数据线(SDA)。I2C 接口简单,占用 Arduino 的引脚资源少,并且支持多个设备挂载在同一总线上,通过不同的设备地址进行区分。在一些对引脚资源要求较高的项目中,I2C 接口更为适用。
通信流程
初始化:在 Arduino 代码中,首先需要初始化所选的通信接口(SPI 或 I2C),并设置相关的通信参数,如时钟频率、设备地址等。
发送数据:Arduino 根据需要显示的内容,将数据按照 OLED 显示屏的通信协议进行编码,然后通过通信接口发送给 OLED 显示屏。数据可以是字符、数字、图形等信息。
显示更新:OLED 显示屏接收到数据后,对其进行解码和处理,将相应的内容显示在屏幕上。为了实现动态显示效果,Arduino 可以定期更新发送的数据,使 OLED 显示屏不断刷新显示内容。

应用场景
数据监测与显示:在环境监测系统中,Arduino 连接各种传感器(如温度传感器、湿度传感器、空气质量传感器等)采集环境数据,然后将数据通过通信接口传输到 OLED 显示屏上进行实时显示。用户可以直观地了解环境参数的变化情况。
智能家居控制:在智能家居系统中,Arduino 作为控制核心,连接各种家电设备和传感器。OLED 显示屏可以显示家电设备的状态(如开关状态、温度设置等),并提供操作菜单,用户可以通过触摸按键或其他输入设备在 OLED 显示屏上进行操作,实现对家电设备的远程控制。
机器人交互界面:在机器人项目中,OLED 显示屏可以作为机器人的交互界面,显示机器人的工作状态、任务进度、传感器数据等信息。同时,还可以显示一些动画或图标,增强机器人的人机交互体验。
手持设备与可穿戴设备:由于 OLED 显示屏的轻薄和低功耗特性,与 Arduino 结合可用于开发手持设备和可穿戴设备。例如,制作一个便携式的健康监测设备,通过 Arduino 连接心率传感器、计步器等,将监测数据显示在 OLED 显示屏上,方便用户随时查看自己的健康状况。

在这里插入图片描述

在Arduino项目中,OLED之左右转动的眼睛动画(Eye Animation with Horizontal Movement on OLED) 是一种极具表现力和互动性的图形展示方式。通过编程控制OLED屏幕上的“眼睛”图像进行水平方向的动态移动,可以模拟出“注视”、“跟随”等视觉效果,增强设备的人性化表达能力。

以下将从主要特点、应用场景、注意事项三个维度对这一技术进行专业解析。

一、主要特点

  1. 生动的表现力
    眼睛动画能够模拟生物特征,赋予设备以“感知”或“回应”的拟人化效果,极大提升用户的情感共鸣。
    左右转动的动作可模拟视线跟随,增强与用户的互动感,适用于机器人、AI助手等场景。
  2. 低资源占用
    尽管是动画形式,但通过简单的几何图形或位图循环绘制即可实现,对微控制器的内存和计算能力要求较低。
    特别适合使用单色OLED屏幕(如SSD1306驱动)的Arduino项目。
  3. 高度可控性
    可灵活调整动画速度、幅度、频率等参数,适应不同交互逻辑需求。
    支持触发式响应(例如按钮按下时眼睛转向某个方向),增强设备的智能反馈能力。
  4. 模块化设计
    动画逻辑可封装为独立函数,便于集成到更复杂的UI系统中,提升代码复用率。
    可结合其他界面元素(如表情、文字提示)构建完整的“虚拟角色”形象。
  5. 跨平台兼容性强
    使用通用图形库(如Adafruit GFX、U8g2等)开发,适配多种尺寸的OLED显示屏(如128x64、128x32)。
    可运行于各类基于Arduino的开发板(如UNO、Nano、ESP32、ESP8266等)。

二、应用场景

  1. 人工智能助手/机器人
    在小型AI助手或机器人项目中,眼睛动画用于表达状态(如“思考中”、“等待指令”、“识别成功”)。
    示例:当语音识别模块检测到唤醒词时,眼睛快速向左或向右转动,表示“我听到了”。
  2. 智能家居交互设备
    智能门铃、语音控制面板等设备可通过眼睛动画提供更友好的交互体验。
    示例:有人靠近门口时,眼睛自动转向门口方向,营造“观察者”氛围。
  3. 教育与创意项目
    教学演示中用于讲解动画原理、图形编程、传感器联动等内容。
    示例:学生制作“会动的小猫”项目,眼睛随按钮点击左右转动,激发学习兴趣。
  4. 互动艺术装置
    在公共空间或展览中作为互动装置的一部分,根据观众动作或声音输入做出反应。
    示例:观众挥手时,装置上的眼睛随之移动,产生“被关注”的视觉效果。
  5. 游戏与玩具
    制作简易电子宠物或互动玩具,增加趣味性和沉浸感。
    示例:使用旋转编码器控制眼睛左右移动,模拟“眨眼”、“凝视”等行为。

三、注意事项

  1. 动画帧率控制
    帧率过高可能导致画面闪烁或CPU过载,建议设定合理的刷新间隔(如每帧20~50ms)。
    可采用millis()而非delay()来实现非阻塞式动画更新。
  2. 内存管理
    若使用自定义位图存储眼睛图像,需注意其大小是否超出Arduino有限的RAM容量。
    对于复杂图形,推荐使用XBM格式位图,并仅保留必要的帧数据。
  3. 绘图效率优化
    避免每次全屏刷新,应只重绘发生变化的部分区域(如眼眶内的眼球部分)。
    可使用双缓冲技术减少屏幕闪烁,提升动画流畅度。
  4. 交互逻辑合理性
    动画应服务于功能,避免过度拟人化导致用户误解设备实际能力。
    应明确动画意图(如状态指示、情感表达),并配合其他反馈机制(如声音、灯光)使用。
  5. 硬件兼容性
    不同型号OLED屏幕分辨率不同,需根据具体显示尺寸调整眼睛位置和大小。
    注意I²C通信速率匹配,确保动画流畅不卡顿。

在这里插入图片描述

1、简单左右转动眼睛

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_I2C_ADDRESS, OLED_RESET);
  display.clearDisplay();
}

void loop() {
  // 画左眼
  display.clearDisplay();
  display.drawCircle(40, 32, 10, WHITE); // 左眼
  display.fillCircle(40, 32, 5, BLACK);  // 左眼瞳孔
  display.drawCircle(88, 32, 10, WHITE); // 右眼
  display.fillCircle(88, 32, 5, WHITE);  // 右眼瞳孔
  display.display();
  delay(500);

  // 画右眼
  display.clearDisplay();
  display.drawCircle(40, 32, 10, WHITE); // 左眼
  display.fillCircle(40, 32, 5, WHITE);  // 左眼瞳孔
  display.drawCircle(88, 32, 10, WHITE); // 右眼
  display.fillCircle(88, 32, 5, BLACK);  // 右眼瞳孔
  display.display();
  delay(500);
}

解读要点:
基本结构:使用drawCircle和fillCircle函数绘制眼睛和瞳孔。
眼睛转动:通过交替填充左右眼的瞳孔来模拟眼睛的左右转动效果。
延迟控制:使用delay(500)控制动画的切换速度,使其自然流畅。

2、平滑左右转动

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_I2C_ADDRESS, OLED_RESET);
  display.clearDisplay();
}

void loop() {
  for (int eyePos = 0; eyePos <= 20; eyePos++) {
    display.clearDisplay();
    display.drawCircle(40, 32, 10, WHITE); // 左眼
    display.fillCircle(40 + eyePos, 32, 5, BLACK); // 左眼瞳孔
    display.drawCircle(88, 32, 10, WHITE); // 右眼
    display.fillCircle(88 - eyePos, 32, 5, WHITE); // 右眼瞳孔
    display.display();
    delay(50);
  }

  for (int eyePos = 20; eyePos >= 0; eyePos--) {
    display.clearDisplay();
    display.drawCircle(40, 32, 10, WHITE); // 左眼
    display.fillCircle(40 + eyePos, 32, 5, BLACK); // 左眼瞳孔
    display.drawCircle(88, 32, 10, WHITE); // 右眼
    display.fillCircle(88 - eyePos, 32, 5, WHITE); // 右眼瞳孔
    display.display();
    delay(50);
  }
}

解读要点:
平滑转动:通过逐步改变瞳孔的位置,实现平滑的左右转动效果。
循环控制:使用两个循环分别控制瞳孔向左和向右的运动,增强了动画的流畅性。
细致的延迟:较短的延迟提供了更快的更新频率,使转动更自然。

3、随机左右转动

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_I2C_ADDRESS, OLED_RESET);
  display.clearDisplay();
}

void loop() {
  int randomEyePos = random(-20, 21); // 随机生成位置

  display.clearDisplay();
  display.drawCircle(40, 32, 10, WHITE); // 左眼
  display.fillCircle(40 + randomEyePos, 32, 5, BLACK); // 左眼瞳孔
  display.drawCircle(88, 32, 10, WHITE); // 右眼
  display.fillCircle(88 - randomEyePos, 32, 5, WHITE); // 右眼瞳孔
  display.display();
  delay(300);
}

解读要点:
随机化效果:每次循环中,瞳孔的位置随机生成,为眼睛添加了不确定性和趣味性。
简单实现:利用random()函数轻松实现了随机转动,增加了动画的多样性。
适当延迟:适中的延迟确保动画不会过快,保持观赏性。

在这里插入图片描述

4、基础左右转动眼睛动画

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED屏幕宽度
#define SCREEN_HEIGHT 64 // OLED屏幕高度
#define OLED_RESET    -1 // OLED屏幕复位引脚
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) { // 初始化OLED屏幕
    for (;;);
  }
  display.clearDisplay();
}

void loop() {
  for (int x = 20; x <= 100; x += 4) { // 眼睛从左到右移动
    drawEyes(x, 30);
    delay(50);
  }
  for (int x = 100; x >= 20; x -= 4) { // 眼睛从右到左移动
    drawEyes(x, 30);
    delay(50);
  }
}

void drawEyes(int x, int y) {
  display.clearDisplay();
  
  // 左眼外框
  display.drawCircle(30, y, 15, SSD1306_WHITE);
  // 左眼瞳孔
  display.fillCircle(30, y, 5, SSD1306_WHITE);
  display.fillCircle(x, y, 5, SSD1306_BLACK);

  // 右眼外框
  display.drawCircle(90, y, 15, SSD1306_WHITE);
  // 右眼瞳孔
  display.fillCircle(90, y, 5, SSD1306_WHITE);
  display.fillCircle(x + 60, y, 5, SSD1306_BLACK);

  display.display();
}

要点解读
眼睛的结构:
外框使用 drawCircle() 函数绘制。
瞳孔使用 fillCircle() 函数填充。
眼睛移动逻辑:
瞳孔的水平方向位置 x 分别在左到右以及右到左的范围内变化。
使用 delay() 控制动画的速度。
屏幕刷新:
每次调用 display.clearDisplay() 清空屏幕,避免重影。

5、增加眨眼效果的眼睛动画

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    for (;;);
  }
  display.clearDisplay();
}

void loop() {
  for (int x = 20; x <= 100; x += 4) {
    drawEyes(x, 30);
    delay(50);
  }
  blink();
  for (int x = 100; x >= 20; x -= 4) {
    drawEyes(x, 30);
    delay(50);
  }
  blink();
}

void drawEyes(int x, int y) {
  display.clearDisplay();
  
  display.drawCircle(30, y, 15, SSD1306_WHITE);
  display.fillCircle(x, y, 5, SSD1306_WHITE);
  display.fillCircle(30, y, 5, SSD1306_BLACK);

  display.drawCircle(90, y, 15, SSD1306_WHITE);
  display.fillCircle(x + 60, y, 5, SSD1306_WHITE);
  display.fillCircle(90, y, 5, SSD1306_BLACK);

  display.display();
}

void blink() {
  for (int i = 0; i < 2; i++) {
    display.clearDisplay();
    display.drawLine(15, 30, 45, 30, SSD1306_WHITE); // 左眼闭合线
    display.drawLine(75, 30, 105, 30, SSD1306_WHITE); // 右眼闭合线
    display.display();
    delay(200);
    drawEyes(30, 30); // 恢复原状
  }
}

要点解读
眨眼实现:
在闭眼状态下,绘制一条水平线代替眼睛。
延迟短时间后恢复眼睛图案。
眨眼逻辑:
在左右移动的动画后调用 blink() 函数,插入眨眼效果。
动态效果增强:
通过增加眨眼效果,让动画更加生动。

6、多种动态效果的复杂动画

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    for (;;);
  }
  display.clearDisplay();
}

void loop() {
  for (int x = 20; x <= 100; x += 4) {
    drawEyes(x, 30);
    delay(50);
  }
  blink();
  lookAround(); // 增加左右观察动作
}

void drawEyes(int x, int y) {
  display.clearDisplay();
  
  display.drawCircle(30, y, 15, SSD1306_WHITE);
  display.fillCircle(x, y, 5, SSD1306_WHITE);
  display.fillCircle(30, y, 5, SSD1306_BLACK);

  display.drawCircle(90, y, 15, SSD1306_WHITE);
  display.fillCircle(x + 60, y, 5, SSD1306_WHITE);
  display.fillCircle(90, y, 5, SSD1306_BLACK);

  display.display();
}

void blink() {
  display.clearDisplay();
  display.drawLine(15, 30, 45, 30, SSD1306_WHITE);
  display.drawLine(75, 30, 105, 30, SSD1306_WHITE);
  display.display();
  delay(200);
}

void lookAround() {
  for (int y = 20; y <= 40; y += 2) { // 眼睛上下移动
    drawEyes(30, y);
    delay(50);
  }
  for (int y = 40; y >= 20; y -= 2) {
    drawEyes(30, y);
    delay(50);
  }
}

要点解读
多样化的动作:
增加眼睛上下移动的动态,调用 lookAround() 执行。
结构化代码:
将眨眼和观察动作封装为函数,增强代码可读性与复用性。
动画连贯性:
动作间通过延迟和逻辑顺序结合,使整体动画更加自然。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值