基于RISC-V与电子墨水屏的桌面日历时钟:从硬件选型到低功耗实践
1. 项目概述打造你的桌面电子墨水日历时钟如果你和我一样既喜欢桌面上有个能随时瞥一眼就知道日期和星期的日历又对传统纸质日历每日一撕的浪费感到些许不安那么这个项目可能就是为你准备的。今天我们要动手制作的是一个基于电子墨水屏的桌面电子日历时钟。它的核心是一块小小的CH32V203 QT Py开发板搭配上超低功耗的eInk显示屏和一颗高精度的实时时钟芯片。完成后的设备可以像一幅画一样立在桌角显示清晰的日期、星期和时间最关键的是它只在时间变化时消耗微弱的电量进行屏幕刷新其余时间完全零功耗显示充一次电用上几个月都不是问题。这个项目完美结合了当下嵌入式开发的几个热门元素开源的RISC-V架构处理器、极具潜力的电子墨水显示技术以及经典的Arduino开发环境。对于已经有一定嵌入式基础的开发者来说CH32V203 QT Py提供了一个极具性价比的RISC-V平台来练手而对于想要入门eInk屏驱动和低功耗设计的爱好者这更是一个从零件到成品的完整实践案例。整个制作过程涉及硬件组装、3D打印结构件、开发环境搭建、代码编写与调试是一次非常综合的嵌入式开发体验。接下来我将带你一步步拆解这个项目从原理到实操分享我在制作过程中踩过的坑和总结的技巧。2. 核心硬件选型与设计思路解析2.1 主控板为什么选择CH32V203 QT Py在这个项目中主控芯片的选择直接决定了开发的难易度和项目的扩展性。我们使用的是Adafruit出品的QT Py CH32V203开发板。这块板子最大的亮点在于其核心——沁恒微电子的CH32V203系列微控制器。这是一颗基于开源RISC-V架构的32位处理器主频高达144MHz性能足以媲美甚至超越许多传统的ARM Cortex-M系列芯片但价格却非常有竞争力。选择它首先是看中了RISC-V的生态和潜力。作为新兴的指令集架构RISC-V正在嵌入式领域快速成长提前接触有助于拓宽技术视野。其次QT Py这个板型设计非常巧妙它采用了和Seeed Studio的Xiao系列类似的极小尺寸但通过STEMMA QT/Qwiic接口标准可以像搭积木一样快速连接各种传感器和执行器极大简化了硬件连接。对于这个日历项目我们需要同时驱动SPI接口的eInk屏和I2C接口的RTC模块QT Py上预留的接口正好够用且连接方式非常整洁。注意需要明确的是CH32V203 QT Py目前不支持CircuitPython或MicroPython。它的主要开发方式是使用Arduino IDE配合特定的板支持包或者进行更底层的嵌入式C开发。这意味着你需要对Arduino环境或者嵌入式开发有基本的了解它不太适合绝对的编程新手作为第一块开发板。2.2 显示核心电子墨水屏的工作原理与优势我们使用的是一块1.54英寸、200x200像素的单色电子墨水显示屏。很多人喜欢叫它“电子纸”因为它显示的效果真的像印刷在纸上的文字一样不发光依靠环境光反射视觉上非常舒适。它的工作原理很有意思和LCD或OLED有本质区别。屏幕内部充满了无数微小的“微胶囊”每个胶囊里都有带负电的黑色粒子和带正电的白色粒子它们悬浮在透明的液体中。在屏幕的上下基板上有精细的电极阵列。当我们给某个像素点的电极施加一个特定方向的电场时对应颜色的粒子就会被吸引到屏幕顶部从而显示出黑色或白色。一旦粒子移动到位置即使撤掉电场由于介电泳力和范德华力的作用它们也能基本保持原位。这就是电子墨水屏“双稳态”特性的来源画面可以长时间保持而不需要消耗任何电量只有在刷新内容时才需要通电。这种特性带来了几个巨大优势极致低功耗功耗几乎全部集中在刷新瞬间。对于日历时钟这种几分钟甚至几十分钟才更新一次的应用平均功耗可以做到微瓦级别。强光下可视性极佳依靠反射环境光阳光越强看得越清楚完全没有液晶屏在户外发白的问题。视觉友好无频闪、无蓝光长时间观看不易疲劳。当然也有缺点主要是刷新速度慢通常需要几百毫秒到几秒且有全屏闪烁的刷新过程。但对于显示静态信息的日历来说这完全不是问题。2.3 时间基准高精度实时时钟模块DS3231一个靠谱的日历时钟核心是准确的时间。虽然微控制器内部通常都有RTC外设但精度和掉电保持能力往往一般。因此我们外挂了一颗专业的RTC芯片——DS3231。这颗芯片被誉为“极致精确的I2C集成RTC/温补晶振/晶体”它内部集成了温度补偿晶体振荡器可以自动根据环境温度修正时钟误差年误差可以控制在±2分钟以内远优于普通32.768kHz晶振的精度。DS3231还有两个非常实用的特性一是内置了电池切换电路当主电源断开时可以自动切换到纽扣电池供电保持计时不间断二是它提供了两个可编程的闹钟输出和一路方波输出。在这个项目中我们主要利用其高精度的计时和日历功能通过简单的I2C总线与QT Py通信每隔一段时间读取当前的年、月、日、星期、时、分信息。2.4 连接桥梁EYESPI BFF与线缆硬件连接的精妙之处在于EYESPI BFF扩展板。BFF是“Board Friend Friend”的缩写你可以把它理解为QT Py的“帽子”。这块扩展板的核心是一个18针的FPC连接器专门用来连接那些排线接口的eInk或OLED显示屏。使用BFF板有两大好处一是提供了物理保护和稳定的连接直接将脆弱的FPC排线焊在开发板上是不牢靠的二是它充当了电平转换和信号缓冲的角色虽然本例中eInk屏也是3.3V逻辑兼容QT Py让连接更可靠。我们通过一根100mm长的18针FPC软排线将屏幕与BFF板连接起来。此外DS3231 RTC模块通过一根4芯的STEMMA QT/Qwiic电缆与QT Py连接这种防反插接口让接线变得傻瓜式非常方便。3. 开发环境搭建与核心库配置详解3.1 Arduino IDE基础安装与板支持包添加由于CH32V203的Arduino生态比较新环境搭建步骤比常见的ESP32或Arduino AVR系列要稍微复杂一些但一步步跟着做完全没问题。首先确保你安装了Arduino IDE 1.8或更高版本。建议直接从Arduino官网下载最新版。安装完成后打开IDE我们需要添加支持CH32V系列芯片的板支持包仓库地址。打开文件(File) - 首选项(Preferences)。在“附加开发板管理器网址”框中填入以下URLhttps://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json如果你之前添加过其他板的网址用逗号分隔即可。点击“好”保存。接下来打开工具(Tools) - 开发板(Board) - 开发板管理器(Boards Manager)。在搜索框中输入“ch32”你应该能看到一个名为“WCH32V Boards by WCH”的包。点击安装。重要提示在点击安装之前务必先完成工具链的准备工作。根据你的操作系统需要提前安装一些编译工具。以Windows为例通常需要安装make和gcc-riscv64-unknown-elf工具链。这些前置步骤的详细指南在板支持包的GitHub仓库README中有明确说明。跳过这一步直接安装BSP很可能导致编译失败。3.2 手动安装板支持包以获取最新特性通过开发板管理器安装的通常是已发布的稳定版本。但为了获得对QT Py CH32V203最完善的支持包括更便捷的USB上传功能我们需要手动安装最新的开发版板支持包。这需要用到Git。找到你的Arduino IDE的硬件文件夹。通常在我的文档\Arduino\hardwareWindows或~/Arduino/hardwaremacOS/Linux。在这个hardware文件夹下打开终端或命令行。执行克隆命令git clone https://github.com/openwch/arduino_core_ch32.git进入克隆得到的arduino_core_ch32文件夹在里面新建一个名为WCH的文件夹。将arduino_core_ch32文件夹内的所有内容除了刚新建的WCH文件夹本身移动到WCH文件夹内。最后你的目录结构应该是Arduino/hardware/arduino_core_ch32/WCH/...里面包含cores,variants等文件夹。为了确保子模块完整可以进入WCH文件夹执行git submodule update --init完成上述操作后重启Arduino IDE。现在在工具 - 开发板菜单中你应该能看到一个名为“CH32V EVT Boards Support (in sketchbook)”的选项这就是我们手动安装的版本。3.3 关键库的安装TinyUSB与显示、时钟驱动为了让QT Py能通过USB直接上传程序我们需要一个关键的库Adafruit TinyUSB Library。这个库的版本必须在3.3.3及以上。在Arduino IDE中点击项目(Sketch) - 加载库(Library) - 管理库(Manage Libraries)。搜索“Adafruit TinyUSB”找到后选择安装。如果弹出安装依赖的提示点击“全部安装”。接下来安装本项目的功能库。同样在库管理中搜索“Adafruit EPD”这是Adafruit为电子纸显示屏提供的统一驱动库安装它。最后搜索“RTClib”选择由Adafruit维护的版本进行安装。这个库用于和DS3231等RTC芯片通信。安装好库之后我们还需要在代码中配置正确的板型。在工具菜单下依次选择开发板CH32V EVT Boards Support (in sketchbook)Board SelectAdafruit QTPy CH32V203G6USB SupportAdafruit TinyUSB with USBD这个组合能确保代码通过USB端口正确编译和上传。4. 代码结构与核心功能实现剖析4.1 项目头文件与硬件引脚定义让我们深入看看实现这个日历时钟的核心代码。代码的开头部分包含了所有必要的库和硬件引脚定义这是整个项目的基石。#include Arduino.h #include SPI.h #include Adafruit_TinyUSB.h #include Adafruit_ThinkInk.h #include RTClib.h #include Wire.h #include Fonts/FreeSans24pt7b.h #include Fonts/FreeSans18pt7b.h #include Fonts/FreeSans12pt7b.hAdafruit_ThinkInk这是EPD库的上层封装提供了针对不同型号eInk屏的易用对象。RTClib用于与DS3231通信获取精确时间。Wire.hI2C通信库因为DS3231通过I2C接口连接。最后三个是Adafruit GFX字体库中的字体文件我们用它来在屏幕上显示不同大小的文字。引脚定义部分将QT Py的物理引脚映射到eInk屏的各个控制信号#define EPD_DC PA3 // 数据/命令选择引脚 #define EPD_CS PA2 // SPI片选引脚 #define EPD_BUSY -1 // 忙状态引脚设为-1表示采用延时等待而非查询状态 #define SRAM_CS PA1 // 屏幕板载SRAM的片选用于部分缓冲模型 #define EPD_RESET -1 // 复位引脚设为-1表示与MCU共用复位信号 #define EPD_SPI SPI // 指定使用的SPI硬件接口这里有几个设计考量EPD_BUSY设为-1eInk屏刷新时需要时间通常可以通过一个BUSY引脚查询是否完成。设为-1意味着我们不在代码中查询这个引脚而是采用固定的延时等待刷新完成。这样做简化了接线少接一根线但需要根据屏幕型号设置一个足够长的安全延时Adafruit_ThinkInk库内部已经处理好了。EPD_RESET设为-1表示我们不使用独立的复位引脚屏幕将与单片机一起上电复位。对于大多数情况这没问题。SRAM_CS这块特定的屏幕板载了SRAM芯片可以作为显示缓冲区从而节省单片机本身的内存。库会自动利用它。随后我们初始化屏幕和RTC对象ThinkInk_154_Mono_D67 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); RTC_DS3231 rtc;ThinkInk_154_Mono_D67这个类名对应的是1.54英寸单色屏驱动芯片为SSD1681D67是波形文件代号。初始化时传入了之前定义的所有引脚。4.2 时间数据处理与字符串格式化为了在屏幕上美观地显示日期和时间我们需要将从RTC读取的原始数据数字转换为格式化的字符串并存储星期的缩写。char daysOfTheWeek[7][4] {SUN, MON, TUE, WED, THU, FRI, SAT}; char monthsOfYear[13][4] {NULL, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};这里定义了两个二维字符数组。daysOfTheWeek存储了三个字母的星期缩写。monthsOfYear有13个元素第一个是“NULL”这样月份数字1一月就直接对应数组索引1“JAN”让代码更直观。在loop()函数中我们读取RTC数据并进行格式化DateTime now rtc.now(); // 从DS3231获取当前时间日期对象 char timeChar[6]; sprintf(timeChar, %02d:%02d, now.hour(), now.minute()); // 将小时和分钟格式化为HH:MM String timeStr String(timeChar);sprintf函数是C语言中非常强大的格式化输出函数%02d表示将整数输出为至少两位不足两位前面补零。这确保了“9:5”会显示为“09:05”更加美观。然后将字符数组转换为Arduino中更易处理的String对象。4.3 电子墨水屏的驱动与显示优化驱动eInk屏刷新是整个项目的关键操作也是最耗时的部分。代码中采用了一种优化策略仅在时间发生变化时才刷新屏幕。String lastTimeStr 00:00; // 全局变量记录上一次显示的时间 void loop() { // ... 获取当前时间并格式化为timeStr ... if (lastTimeStr ! timeStr) { // 只有时间变化了才执行下面的屏幕刷新代码 display.clearBuffer(); // ... 绘制所有图形和文字 ... display.display(); // 此命令会触发实际的屏幕刷新耗时约2-3秒 lastTimeStr timeStr; // 更新记录的时间 } delay(30000); // 每30秒检查一次时间 }这个if判断是低功耗和延长屏幕寿命的核心。电子墨水屏的刷新周期是有限的通常几十万到百万次频繁刷新会缩短其使用寿命。同时每次刷新消耗的能量也相对较大。因此我们设置每30秒检查一次RTC只有当分钟数发生变化即时间字符串改变时才执行全套的绘制和刷新操作。对于日历应用你甚至可以改成每小时或每天刷新一次。在绘制部分代码使用了Adafruit GFX库的标准方法display.clearBuffer()清空内存中的显示缓冲区。display.fillRect()和display.drawRect()绘制顶部的黑色横幅和外围边框。display.setTextColor()和display.setFont()设置文字颜色和字体。display.getTextBounds()这是一个非常实用的函数它计算指定字符串在当前字体下所占的宽度和高度。我们利用这个信息来计算文字的居中位置。display.setCursor()和display.println()设置光标位置并打印文字。display.display()最关键的一步。它将内存缓冲区的内容发送到屏幕并启动物理刷新过程。此时你会看到屏幕快速闪烁几次全黑-全白-显示新内容然后稳定显示。实操心得字体与布局的调试在eInk屏上布局文字和LCD上感觉不同。由于刷新慢最好先在串口监视器打印出getTextBounds得到的宽度和高度规划好各区块的位置再写屏。避免反复刷屏调试那会非常耗时。另外eInk屏显示深色背景如黑色矩形时因为需要将白色粒子移开刷新时间会比显示浅色背景更长。4.4 外设初始化与错误处理在setup()函数中我们系统地初始化所有硬件并加入了简单的错误处理。void setup() { Serial.begin(115200); SPI.begin(); pinMode(EPD_CS, OUTPUT); digitalWrite(EPD_CS, HIGH); // SPI设备初始化前先将片选置高无效 Wire.begin(); display.begin(THINKINK_MONO); // 初始化屏幕传入单色模式参数 while (! rtc.begin()) { // 尝试初始化RTC如果失败则持续尝试并报错 Serial.println(Couldnt find RTC); delay(10); } }SPI初始化除了调用SPI.begin()手动将屏幕的片选引脚EPD_CS设置为高电平是一个好习惯。这确保了在SPI总线配置完成前屏幕不会意外被选中防止产生乱码信号。RTC初始化使用while (! rtc.begin())循环来检测RTC是否连接正常。如果I2C通信失败比如线没接好程序会卡在这里并通过串口不断输出错误信息而不是继续运行导致显示异常。这是一个非常实用的调试技巧。5. 硬件组装与机械结构搭建指南5.1 3D打印支架的准备与处理为了让这个电子日历能优雅地立在桌面上一个3D打印的支架必不可少。项目提供的STL文件设计得很巧妙它不仅仅是一个简单的底座还集成了固定开发板和屏幕的结构。首先你需要下载并打印CH32V203-eInk-Calendar-Stand.stl文件。打印时需要注意材料PLA或PETG都是不错的选择强度足够易于打印。支撑由于支架正面有一个用于穿过排线的方形开孔这个开孔是悬空结构打印时必须开启支撑材料否则开孔顶部会塌陷或打印失败。层高与填充0.2mm层高能提供不错的表面质量。填充率15%-20%即可保证结构强度同时节省材料和时间。打印完成后仔细去除所有支撑材料特别是开孔内部的支撑要清理干净确保FPC排线能顺利穿过。可以用小锉刀或砂纸轻轻打磨一下毛刺。5.2 焊接与电气连接步骤接下来是电子部分的组装。遵循“先焊接后插接”的原则避免带电操作。焊接排针将插座式排针焊接到EYESPI BFF扩展板上。注意排针方向通常带有塑料底座的一面朝向BFF板背面即没有元件的一面。将插头式排针焊接到CH32V203 QT Py开发板上。同样注意方向。焊接技巧可以先在一两个定位脚上点焊固定确认排针与板子垂直后再焊接其余引脚。使用助焊剂和合适的烙铁温度约350°C确保焊点饱满光滑。连接RTC模块使用一根4芯的STEMMA QT/Qwiic电缆一端插入DS3231模块另一端插入QT Py开发板。这个接口是防反插的方向错了插不进去非常安全。连接屏幕将18针的FPC软排线一端插入eInk显示屏背面的FPC插座。注意排线金色触点的一面通常对应插座上有标记的一面比如三角符号。轻轻抬起插座上的黑色锁扣插入排线到底然后压下锁扣固定。排线的另一端以同样方式插入EYESPI BFF板上的FPC插座。5.3 总装与机械固定所有电气连接完成后开始机械总装。这个过程像搭积木顺序很重要固定屏幕将eInk显示屏对准支架正面的四个安装孔从支架背面使用M2.5的螺丝和尼龙柱stand-off将屏幕固定。尼龙柱的长度要适中既能固定稳又不会顶到屏幕正面的显示区域。在拧紧螺丝前记得将连接屏幕的FPC排线从支架的开孔中穿到背面。安装核心板将焊好排针的QT Py开发板插入已经焊在BFF板上的插座排针。注意对准方向QT Py的USB接口应该朝向BFF板上FPC插座的反方向即朝上。插入时将3D打印支架背面那个突出的“挂钩”夹在QT Py和BFF板之间。这个挂钩设计是点睛之笔它利用两块板子插接后的夹力将整个核心模块牢牢固定在支架上无需额外螺丝。固定RTC模块最后将DS3231 RTC模块放置于支架背面右上角利用固定屏幕的其中一个尼龙柱再用一个M2.5螺丝从RTC模块背面拧入尼龙柱从而将RTC模块也固定在这个“塔”上。这样所有部件都稳固地集成在了支架上。组装完成后从正面看只有一块干净的eInk屏幕从背面看线路规整模块紧凑。用一根USB-C线缆为QT Py供电系统就会启动。第一次启动时屏幕会进行几次全刷然后显示出当前的日期和时间。6. 常见问题排查与深度优化技巧6.1 开发环境与上传问题问题在Arduino IDE中点击上传后提示“上传失败”或一直卡在“正在连接”状态。排查思路检查板型选择确保在工具菜单中三项选择完全正确CH32V EVT Boards Support (in sketchbook)-CH32V20x-Adafruit QTPy CH32V203G6-Adafruit TinyUSB with USBD。检查USB线尝试换一根确认能传输数据的USB-C线有些线只能充电。手动进入Bootloader模式CH32V203在上传时需要处于特殊的引导加载程序模式。可以尝试手动触发先按住QT Py板上的“BOOT”按钮如果有的话通常需要查看具体板卡原理图然后按一下“RESET”按钮最后释放“BOOT”按钮。这时再尝试上传。如果IDE中提示找不到端口可能需要去设备管理器查看端口是否出现。使用WCHISP工具如果以上都不行可以跳过Arduino IDE的上传功能直接使用沁恒官方提供的WCHISP工具来烧录编译好的.bin文件。具体方法是在Arduino IDE中点击项目 - 导出已编译的二进制文件会在项目文件夹生成一个.bin文件。从沁恒官网下载WCHISP工具。将QT Py通过USB连接到电脑并手动进入Bootloader模式。运行WCHISP工具选择对应的串口号和.bin文件进行烧录。6.2 屏幕显示异常问题屏幕白屏、全黑、显示乱码或者刷新不完全。排查思路检查FPC排线连接这是最常见的问题。确保排线两端都插到底并被锁扣锁紧。可以尝试重新插拔一次。检查排线是否有折痕或损坏。检查电源eInk屏在刷新瞬间需要较大的电流可能高达100mA。确保你的USB电源或电池能提供足够的电流。可以尝试连接电脑的USB 3.0口或使用5V/2A的充电头。检查引脚定义再次核对代码中的EPD_DC、EPD_CS、SRAM_CS等引脚号是否与你的实际接线完全一致。QT Py的引脚标注可能在板子背面。初始化顺序确保在setup()中先初始化SPI和Wire再调用display.begin()。错误的初始化顺序可能导致通信失败。屏幕型号匹配确认代码中ThinkInk_154_Mono_D67这个构造函数与你使用的屏幕型号完全匹配。不同尺寸、分辨率和驱动芯片的屏幕需要使用不同的类。6.3 RTC时间不准或读取失败问题显示的时间不对或者串口一直打印“Couldn‘t find RTC”。排查思路I2C接线检查STEMMA QT电缆是否插紧。虽然STEMMA QT防反插但也要确认接触良好。RTC电池DS3231模块上的纽扣电池通常是CR1220是否还有电如果电池没电在主电源断开后RTC会丢失时间和配置。用万用表测量电池电压应高于2.5V。首次设置时间新模块或者电池耗尽后的模块内部时间是初始值。你需要先运行一次“设置时间”的程序。Adafruit为DS3231提供了专门的示例代码RTClib库中的setTime示例你可以先单独运行那个程序通过串口输入当前时间来校准RTC然后再运行我们的日历时钟程序。I2C地址冲突理论上DS3231的I2C地址是固定的0x68一般不会冲突。但如果连接了其他I2C设备可以尝试运行I2C扫描程序来确认设备是否存在。6.4 功耗与电源管理优化虽然eInk本身功耗极低但整个系统的功耗还包括单片机、RTC和外围电路。我们可以进一步优化降低MCU功耗在loop()函数的delay(30000)期间单片机其实还在全速运行。我们可以让CH32V203进入深度睡眠模式。这需要修改代码利用RTC的中断唤醒功能。大致思路是配置DS3231的闹钟功能让它每过一分钟或你需要的间隔产生一个中断信号。将这个中断信号连接到CH32V203的外部中断引脚。在Arduino代码中将delay(30000)替换为进入低功耗模式的指令对于CH32V203可能需要调用特定的底层库函数。当RTC闹钟中断到来时MCU被唤醒执行一次屏幕刷新如果时间变了然后再次进入睡眠。这样系统99%以上的时间都处于微安级的睡眠电流整体功耗可以再降低一个数量级。断开非必要外设电源如果屏幕的控制器和SRAM有独立的电源使能引脚可以在睡眠时将其断电。但本项目使用的屏幕模块可能没有这个接口。使用电池供电QT Py有VBAT引脚可以连接一个3.7V的锂聚合物电池。配合上述的深度睡眠功能可以实现完全无线化的桌面日历续航时间可达数月甚至数年。6.5 功能扩展与个性化基础功能实现后这个平台还有很大的扩展空间添加传感器利用QT Py上剩余的GPIO或I2C接口可以连接温湿度传感器如SHT30、BME280在屏幕上同时显示环境数据。网络对时虽然DS3231精度很高但长期运行仍有累积误差。可以增加一个ESP-01之类的Wi-Fi模块让设备每天通过NTP协议从互联网获取一次精确时间同步给RTC实现永久精准。显示个性化修改Adafruit_ThinkInk库的底层驱动可以尝试不同的刷新波形。标准的THINKINK_MONO模式刷新快但有闪烁而THINKINK_MONO_D67模式代码中使用闪烁更少但稍慢。你还可以自定义字体、布局甚至添加简单的图形或图标。多屏支持理论上通过切换不同的片选引脚一个SPI接口可以驱动多块eInk屏打造一个信息墙。这个基于CH32V203和eInk屏的日历时钟项目从一个具体的需求出发串联起了硬件选型、嵌入式开发、电源管理和机械设计等多个知识点。它最吸引我的地方在于将前沿的开源硬件RISC-V、独特的显示技术和经典的开发方式结合做出了一个既美观又实用并且真正具备极低功耗特性的产品。