ESP32-C3驱动电子墨水屏:低功耗物联网显示方案实战
1. 项目概述为什么选择XIAO ePaper Display Board - EE04如果你正在寻找一款能轻松驱动电子墨水屏、同时兼具强大计算能力和丰富接口的开发板那么Seeed Studio的XIAO ePaper Display Board - EE04以下简称EE04绝对值得你花时间研究。我最初接触它是因为一个需要长时间显示信息且功耗极低的户外项目传统的LCD屏在阳光下看不清而且耗电太快。EE04完美地解决了这两个痛点它集成的2.13英寸三色电子墨水屏黑/白/红在强光下依然清晰并且只在刷新画面时才消耗电能静态显示时功耗几乎为零。EE04的核心是一块搭载了ESP32-C3微控制器的XIAO ESP32C3模组。这意味着你不仅获得了一块显示屏还得到了一个完整的、支持Wi-Fi和蓝牙的物联网开发平台。板载的4MB Flash和400KB SRAM对于处理复杂的图形界面和网络连接绰绰有余。更贴心的是Seeed Studio已经将屏幕的驱动电路、电源管理以及一个用户按键全部集成在一块比信用卡还小的板子上开箱即用极大地降低了硬件入门的门槛。无论你是想制作一个低功耗的天气站、一个智能家居信息面板、一个电子价签原型还是一个离线显示的日程提醒器EE04都能提供一个非常理想的起点。它适合有一定Arduino或MicroPython基础的开发者也适合硬件爱好者作为进入电子墨水屏和物联网世界的敲门砖。接下来我将带你从开箱到点亮第一个图形完整走一遍EE04的入门流程并分享一些我实际使用中积累的经验和容易踩的坑。2. 开箱与硬件初识不只是块屏幕当你拿到EE04时第一印象可能是它非常紧凑和精致。让我们先仔细看看这块板子上的每一个部件理解它们各自的作用这对后续的开发和排错至关重要。2.1 核心部件详解板子的正面最显眼的当然是那块2.13英寸的电子墨水屏。型号是GDEY0213B74这是一款非常经典的三色墨水屏分辨率是212x104像素。需要注意的是它的刷新速度相对较慢全屏刷新一次大约需要2秒这是所有电子墨水屏的特性旨在追求超低功耗而非动态效果。屏幕下方印有“XIAO ESP32C3”的字样指明了其核心。翻到板子背面可以看到更多的细节。最核心的是ESP32-C3芯片这是一款基于RISC-V架构的单核32位处理器主频高达160MHz支持Wi-Fi 802.11b/g/n和蓝牙5.0。紧挨着它的是一颗4MB的SPI Flash芯片用于存储程序代码和文件系统。在板子一侧你会找到一个用户按键Boot和RGB LED。这个按键有双重功能在正常运行时可以作为普通输入按键在上电时按住它则会让芯片进入固件下载模式这是烧录程序的关键。旁边的RGB LED则是一个非常好的状态指示器你可以编程控制它显示不同的颜色用于指示网络连接状态、程序运行阶段等。另一侧是Type-C接口和电池接口。Type-C接口用于供电、程序烧录和串口通信。旁边的2P PH2.0接口则用于连接锂电池推荐3.7V。EE04板载了完善的电源管理电路在有外部USB供电时它会自动为电池充电当断开USB时则无缝切换至电池供电这对于需要移动使用的设备来说非常方便。2.2 屏幕特性与驱动原理理解电子墨水屏的工作原理能帮助你写出更高效的代码。它与LCD屏有本质区别。LCD是主动发光通过持续改变液晶分子的排列来显示图像需要持续供电。而电子墨水屏更像真正的“纸”它内部有数百万个微胶囊每个胶囊里含有带负电的黑色粒子和带正电的白色粒子在三色屏中还有红色粒子。通过给屏幕上下基板施加不同的电场可以控制粒子移动到顶部或底部从而形成图像。一旦粒子移动到位置即使撤掉电场它们也会因为物理作用力而保持在那里。这就是为什么墨水屏在静态显示时零功耗。我们付出的代价就是刷新慢因为需要一定的时间来驱动这些微小的粒子运动并且刷新过程尤其是全刷会对屏幕寿命有细微影响。因此在编程时一个重要的优化原则是尽量减少全局刷新多使用局部刷新。EE04的驱动库通常支持这两种模式。3. 开发环境搭建与首次程序烧录要让EE04跑起来我们需要在电脑上搭建好开发环境。这里我推荐使用Arduino IDE因为它对初学者最友好生态也最完善。当然你也可以选择PlatformIOVSCode插件获得更专业的体验但本文以Arduino IDE为例。3.1 Arduino IDE环境配置步骤首先去Arduino官网下载并安装最新版的Arduino IDE。安装完成后打开它我们需要进行几个关键配置。第一步添加开发板支持网址。点击“文件” - “首选项”在“附加开发板管理器网址”一栏中填入以下网址https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json如果已有其他网址用逗号隔开即可。这个网址包含了乐鑫官方所有的ESP32系列开发板支持包。第二步安装开发板。点击“工具” - “开发板” - “开发板管理器”在搜索框中输入“esp32”。在结果列表中找到由“Espressif Systems”发布的“esp32”平台点击安装。这个过程需要下载一些资源时间取决于你的网络环境。第三步安装完成后在“工具” - “开发板”列表中你就能找到“ESP32C3 Dev Module”等相关选项。但为了更精确地支持XIAO ESP32C3我建议安装Seeed Studio提供的专用包。再次打开开发板管理器搜索“Seeed Studio XIAO ESP32C3”找到并安装它。安装后你就能在开发板列表里直接选择“Seeed Studio XIAO ESP32C3”了。第四步安装屏幕驱动库。这是驱动墨水屏的关键。点击“项目” - “加载库” - “管理库”打开库管理器。在这里搜索“GxEPD2”这是由Jean-Marc Zingg维护的一个非常强大且通用的电子墨水屏驱动库。找到并安装它。这个库支持上百种型号的墨水屏其中就包含了我们EE04使用的GDEY0213B74。3.2 连接板卡与基础测试用Type-C数据线将EE04连接到电脑。在Arduino IDE的“工具”菜单中进行如下设置开发板:Seeed Studio XIAO ESP32C3Upload Speed:921600(这个速度烧录较快)Flash Mode:QIO(默认)Flash Size:4MB (32Mb)Partition Scheme:Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)(这个分区方案给程序和应用文件留了足够空间)**Core Debug Level:NonePort: 选择对应的串口在Windows设备管理器中通常显示为“USB Serial Device”或类似名称注意如果第一次连接电脑没有发现串口可能需要安装CP210x或CH340等USB转串口芯片的驱动请根据你的操作系统去芯片厂商官网下载。现在我们来烧录一个最简单的测试程序验证屏幕和开发环境是否工作正常。打开“文件” - “示例” - “GxEPD2” - “GxEPD2_Example”。在打开的示例代码中我们需要做一处关键修改。找到类似下面这行代码// 示例中可能有很多型号的定义我们需要注释掉其他的启用正确的那一个 // #define GxEPD2_DISPLAY_CLASS GxEPD2_BW // #define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // 1.54“ b/w // ... 其他型号定义 // 我们需要找到并启用对应我们屏幕的驱动类 // 对于GDEY0213B74它通常对应270x176的驱动但实际分辨率是212x104需要查库文档或头文件 // 更简单的方法是使用GxEPD2库中已定义好的板型实际上对于EE04Seeed Studio提供了一个更简单的示例。你可以直接使用他们专为这块板子编写的库。在库管理器中搜索“Seeed Studio XIAO EPaper”安装“XIAO EPaper”这个库。安装后在示例中你会找到“XIAO_EPaper_Display” - “PaintDemo”。这个示例是专门为EE04适配的无需任何修改。点击上传按钮向右的箭头。如果一切顺利代码编译完成后会自动上传。上传过程中EE04板上的RGB LED会快速闪烁。上传成功后屏幕会开始刷新并显示一个包含几何图形和文字的测试画面。恭喜你你的EE04已经成功点亮4. 核心编程从显示文字到绘制图形成功点亮屏幕后我们就可以开始编写自己的应用程序了。EE04的编程逻辑主要围绕GxEPD2库或Seeed的专用库展开。这里我以功能更强大、更通用的GxEPD2库为例进行讲解因为它能让你更深入地理解驱动过程并且知识可以迁移到其他墨水屏上。4.1 库的初始化与屏幕对象创建首先你需要在代码开头包含正确的头文件并定义屏幕对象。由于EE04的屏幕是三色黑、白、红我们需要使用支持三色的驱动类。#include GxEPD2_BW.h #include GxEPD2_3C.h #include GxEPD2_7C.h #include Fonts/FreeMonoBold9pt7b.h // 包含一个字体 // 定义与GDEY0213B74匹配的驱动类。经过查阅GxEPD2库的源代码和文档 // 我们可以确定GDEY0213B74对应的是GxEPD2_213_B74驱动类它属于3C三色系列。 // 构造函数参数驱动类名(CS, DC, RST, BUSY) // 对于XIAO ESP32C3这些引脚在内部已连接好我们通常使用预定义的引脚号。 // 根据Seeed的Wiki和原理图EE04的引脚连接是固定的。 GxEPD2_3CGxEPD2_213_B74, GxEPD2_213_B74::HEIGHT display( GxEPD2_213_B74(/*CS*/ 7, /*DC*/ 2, /*RST*/ 1, /*BUSY*/ 0)); void setup() { Serial.begin(115200); delay(1000); // 给串口和系统一个启动时间 Serial.println(EE04 Display Test Start); display.init(115200, true, 10, false); // 初始化屏幕115200为通信速率true表示使用SPI 10MHzfalse表示不重置 display.setRotation(1); // 设置旋转方向0-3分别对应0°90°180°270° } void loop() { // 主循环 }这段代码是基础框架。GxEPD2_3C表示这是一个三色屏幕的模板类。GxEPD2_213_B74是具体的驱动类。引脚参数7210是针对XIAO ESP32C3与EE04屏幕连接定义的你通常不需要修改。display.init()用于初始化屏幕通信。4.2 文本显示与字体管理在墨水屏上显示文本需要先设置字体、对齐方式然后指定位置进行输出。void displayTextDemo() { display.setFullWindow(); // 设置全窗口刷新模式慢但彻底 display.firstPage(); do { display.fillScreen(GxEPD_WHITE); // 设置背景为白色 display.setTextColor(GxEPD_BLACK); // 设置文本颜色为黑色 display.setFont(FreeMonoBold9pt7b); // 设置自定义字体 display.setCursor(10, 30); // 设置文本起始坐标x, y display.println(Hello, EE04!); // 打印文本并换行 // 使用默认字体显示 display.setFont(nullptr); // 重置为默认字体Adafruit GFX内置的小字体 display.setCursor(10, 60); display.println(Default Font); // 显示红色文本 display.setTextColor(GxEPD_RED); display.setCursor(10, 80); display.println(Red Text); } while (display.nextPage()); // 必须调用nextPage()来完成绘制循环 display.hibernate(); // 让屏幕进入深度休眠省电 }在setup()函数中调用displayTextDemo()你就能看到不同字体和颜色的文本了。这里有几个关键点firstPage()和nextPage()是GxEPD2库的典型用法它们构成了一个绘制循环。所有在do...while循环内的绘制命令实际上是在内存中构建一帧图像最后由nextPage()一次性发送到屏幕并刷新。display.hibernate()非常重要。它会在刷新完成后关闭屏幕的电源供应将功耗降到最低约几个微安。如果你忘记调用屏幕的驱动芯片可能仍在耗电。墨水屏刷新慢所以应避免在loop()中频繁调用全屏刷新函数。通常只在信息需要更新时才刷新。4.3 图形绘制与局部刷新除了文字绘制线条、形状和位图也是常见需求。Adafruit GFX库GxEPD2基于此提供了丰富的绘图函数。void displayGraphicsDemo() { display.setFullWindow(); display.firstPage(); do { display.fillScreen(GxEPD_WHITE); // 画一个黑色矩形框 display.drawRect(10, 10, 100, 50, GxEPD_BLACK); // 填充一个红色矩形 display.fillRect(120, 10, 50, 50, GxEPD_RED); // 画一个黑色圆 display.drawCircle(50, 120, 20, GxEPD_BLACK); // 画一条对角线 display.drawLine(0, 0, display.width(), display.height(), GxEPD_BLACK); // 绘制一个三角形 display.drawTriangle(150, 80, 130, 120, 170, 120, GxEPD_BLACK); } while (display.nextPage()); display.hibernate(); }局部刷新是优化体验和延长屏幕寿命的关键。全屏刷新setFullWindow会产生明显的闪烁全屏先变黑再变白且耗时约2秒。局部刷新只更新屏幕上变化的部分速度快约0.5秒闪烁感弱。void partialUpdateDemo() { // 假设我们只想更新屏幕右下角一个区域的时间 int partial_x 150; int partial_y 70; int partial_w 60; int partial_h 30; // 设置局部刷新区域 display.setPartialWindow(partial_x, partial_y, partial_w, partial_h); display.firstPage(); do { // 只清除这个局部区域为白色 display.fillRect(partial_x, partial_y, partial_w, partial_h, GxEPD_WHITE); // 在这个区域内绘制新的内容例如时间字符串 display.setTextColor(GxEPD_BLACK); display.setFont(nullptr); display.setCursor(partial_x 5, partial_y 20); display.println(12:34); } while (display.nextPage()); // 注意局部刷新后可以不调用hibernate以保持屏幕控制器处于活动状态为下一次局部刷新做准备。 // 但如果你长时间不更新还是应该调用hibernate()来省电。 }实操心得局部刷新虽好但有次数限制。连续进行太多次局部刷新例如几百次后屏幕可能会出现残影或对比度下降。这时必须执行一次全屏刷新来清除残影。一个常见的策略是每进行20-30次局部刷新后主动执行一次全屏刷新。你可以设置一个计数器来管理这个周期。5. 进阶应用打造一个低功耗网络天气站掌握了基础显示后我们可以结合ESP32-C3的Wi-Fi功能做一个实用的项目一个自动从网络获取天气信息并显示的桌面天气站。这个项目将综合运用网络请求、JSON解析、电源管理和屏幕刷新策略。5.1 硬件连接与电源考量本项目只需要EE04本身和一根USB线用于初始编程和调试或者一块3.7V的锂电池如常见的602530、703040等型号。连接电池后EE04就可以完全脱机运行。板载的电源管理芯片会确保电池安全充电和放电。在软件上我们需要引入几个新的库WiFiESP32-C3内置无需额外安装。HTTPClient用于发起网络请求。ArduinoJson用于解析从天气API返回的JSON数据。需要在库管理中搜索并安装“ArduinoJson by Benoit Blanchon”。5.2 获取并解析天气数据我们以使用心知天气的免费API为例。你需要先去其官网注册账号获取一个API密钥。#include WiFi.h #include HTTPClient.h #include ArduinoJson.h const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; const char* apiKey 你的心知天气API密钥; const char* city beijing; // 城市拼音 const char* url https://api.seniverse.com/v3/weather/now.json?key%slocation%slanguagezh-Hansunitc; WiFiClient client; bool fetchWeatherData(String temp, String weatherText) { if (WiFi.status() ! WL_CONNECTED) { Serial.println(WiFi not connected!); return false; } HTTPClient http; char fullUrl[256]; snprintf(fullUrl, sizeof(fullUrl), url, apiKey, city); http.begin(client, fullUrl); int httpCode http.GET(); if (httpCode HTTP_CODE_OK) { String payload http.getString(); // 开始解析JSON DynamicJsonDocument doc(1024); // 根据返回数据大小调整 DeserializationError error deserializeJson(doc, payload); if (error) { Serial.print(JSON解析失败: ); Serial.println(error.c_str()); http.end(); return false; } // 解析温度 temp doc[results][0][now][temperature].asString(); // 解析天气状况文字 weatherText doc[results][0][now][text].asString(); http.end(); return true; } else { Serial.printf(HTTP请求失败错误码: %d\n, httpCode); http.end(); return false; } }这段代码连接Wi-Fi并向天气API发送请求然后解析出当前的温度和天气状况文本。DynamicJsonDocument的大小需要根据实际返回的JSON数据量进行调整太小会导致解析失败。5.3 整体程序逻辑与低功耗优化一个完整的天气站程序需要合理安排网络连接、数据获取、屏幕刷新和睡眠的节奏以最大限度节省电池电量。// 全局变量 String currentTemp N/A; String currentWeather N/A; unsigned long lastUpdateTime 0; const long updateInterval 10 * 60 * 1000; // 10分钟更新一次 void setup() { Serial.begin(115200); display.init(115200, true, 10, false); display.setRotation(1); // 连接Wi-Fi WiFi.begin(ssid, password); Serial.print(Connecting to WiFi); int attempts 0; while (WiFi.status() ! WL_CONNECTED attempts 20) { delay(500); Serial.print(.); attempts; } if (WiFi.status() WL_CONNECTED) { Serial.println(\nConnected!); // 首次获取数据 if(fetchWeatherData(currentTemp, currentWeather)) { drawWeatherScreen(); } } else { Serial.println(\nWiFi Connection Failed!); drawErrorScreen(WiFi Fail); } // 首次刷新后让屏幕休眠 display.hibernate(); // 可以在这里关闭Wi-Fi以省电下次需要时再打开 WiFi.disconnect(true); // true参数表示同时关闭Wi-Fi射频 WiFi.mode(WIFI_OFF); } void loop() { // 判断是否到达更新间隔 if (millis() - lastUpdateTime updateInterval) { // 唤醒Wi-Fi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); delay(2000); // 等待连接 if (WiFi.status() WL_CONNECTED) { String newTemp, newWeather; if(fetchWeatherData(newTemp, newWeather)) { // 只有数据发生变化时才刷新屏幕避免不必要的刷新 if (newTemp ! currentTemp || newWeather ! currentWeather) { currentTemp newTemp; currentWeather newWeather; drawWeatherScreen(); display.hibernate(); } } } else { drawErrorScreen(Update Fail); display.hibernate(); } // 再次关闭Wi-Fi WiFi.disconnect(true); WiFi.mode(WIFI_OFF); lastUpdateTime millis(); } // 进入深度睡眠最省电但会重置程序。对于ESP32-C3可以使用轻量级延迟。 // 更常见的做法是让loop空跑依靠上面的间隔判断。实际功耗已很低。 delay(1000); // 每秒检查一次 } void drawWeatherScreen() { display.setFullWindow(); // 天气信息变化不大使用全刷即可 display.firstPage(); do { display.fillScreen(GxEPD_WHITE); display.setTextColor(GxEPD_BLACK); // 显示城市 display.setFont(FreeMonoBold9pt7b); display.setCursor(10, 30); display.println(Beijing); // 显示温度大字体 display.setFont(nullptr); // 先用默认字体获取一个基础大小 // 为了显示大温度我们可以使用更大的内置字体或使用setTextSize放大 display.setTextSize(3); // 放大3倍 display.setCursor(20, 70); display.print(currentTemp); display.println(C); display.setTextSize(1); // 恢复 // 显示天气状况 display.setCursor(10, 100); display.println(currentWeather); // 显示最后更新时间 display.setCursor(10, 120); display.print(Update: ); display.print(millis() / 60000); // 显示分钟数粗略 display.println( min ago); } while (display.nextPage()); } void drawErrorScreen(String msg) { display.setFullWindow(); display.firstPage(); do { display.fillScreen(GxEPD_WHITE); display.setTextColor(GxEPD_RED); // 用红色表示错误 display.setCursor(20, 50); display.print(Error: ); display.println(msg); } while (display.nextPage()); }这个程序实现了一个基本的低功耗循环启动后连接网络获取一次天气并显示然后关闭Wi-Fi进入低功耗状态。之后每10分钟唤醒一次重新连接网络获取新数据只有数据确实变化了才刷新屏幕。屏幕在每次刷新后立即休眠。通过这种方式一块容量适中的锂电池可以让设备运行数周甚至数月。6. 常见问题排查与性能优化心得在实际使用EE04的过程中你可能会遇到一些典型问题。这里我总结了一些常见故障和解决方法以及进一步提升体验的技巧。6.1 程序上传失败与连接问题这是新手遇到最多的问题通常表现为上传时Arduino IDE报错如“Failed to connect to ESP32”、“Timed out waiting for packet header”等。检查驱动与端口确保电脑已安装正确的USB转串口驱动CP210x或CH340并在IDE中选择了正确的端口。手动进入下载模式这是最关键的一步。ESP32-C3需要在上电时保持GPIO9即Boot按键为低电平才能进入固件下载模式。操作流程是按住EE04板上的Boot按键不要松开。短按一下Reset按键如果有的话EE04上可能没有独立的Reset键此时可以快速插拔一下USB线模拟上电复位。等待约1秒后松开Boot按键。此时芯片应进入下载模式。立即点击Arduino IDE的上传按钮。上传过程中RGB LED会闪烁。降低上传速率在“工具”菜单中将“Upload Speed”从921600降低到115200或57600有时高速率在不稳定的USB线上会导致失败。检查数据线确保你使用的是一根数据线而不是仅能充电的线缆。6.2 屏幕显示异常残影、鬼影与刷新不全电子墨水屏特有的“残影”现象表现为上一屏的内容没有完全清除淡淡地留在了新画面上。根本原因电子墨水粒子在多次局部刷新后由于电场作用不完全部分粒子未能归位。这不是硬件损坏而是物理特性。标准解决方案定期执行全屏刷新。我的经验是在程序逻辑中设置一个计数器每进行N次局部刷新后N取20-30比较安全强制做一次全屏刷新display.setFullWindow()display.clearScreen()或画一个全白背景。深度清洗如果残影已经很严重可以使用驱动库提供的display.clearScreen()函数如果支持或者使用一种叫“波形文件”的深度刷新模式。在GxEPD2库中全屏刷新默认使用的就是清除效果较好的波形。你也可以尝试在display.init()后调用display.clearScreen()。刷新不全/花屏如果每次刷新都出现部分区域不变或乱码首先检查电源。墨水屏刷新时峰值电流较大可达几十mA确保你的USB口或电池能提供足够的电流至少500mA。其次检查程序逻辑确保在display.nextPage()循环结束前不要进行任何可能阻塞太久的操作如长时间delay。6.3 功耗优化进阶技巧前面的天气站示例已经应用了基本的功耗优化关Wi-Fi、屏幕休眠。如果你想进一步压榨电池寿命可以考虑以下方法使用ESP32的深度睡眠Deep Sleep这是最省电的模式芯片绝大部分电路关闭仅保留RTC计时器和少量内存功耗可低至10微安左右。你可以让ESP32-C3每隔一段时间如10分钟从深度睡眠中唤醒完成数据获取和屏幕刷新后再次进入深度睡眠。#include esp_sleep.h void enterDeepSleep(int seconds) { Serial.println(Entering deep sleep for String(seconds) seconds); // 配置GPIO唤醒源可选如果需要按键唤醒 // esp_sleep_enable_ext0_wakeup(GPIO_NUM_X, LOW); // 配置定时器唤醒 esp_sleep_enable_timer_wakeup(seconds * 1000000ULL); // 微秒 display.hibernate(); // 务必先让屏幕休眠 delay(100); // 等待屏幕休眠完成 esp_deep_sleep_start(); // 进入深度睡眠程序在此停止 // 唤醒后程序会从setup()重新开始运行 }重要提示在进入深度睡眠前必须调用display.hibernate()。否则屏幕控制器仍在工作功耗会很高。同时深度睡眠会断开所有网络连接并清空RAM中的数据你需要将需要保存的数据存入RTC内存或Flash如Preferences库。优化网络连接时间Wi-Fi连接是耗电大户。除了在不用时关闭还可以尝试固定IP避免DHCP过程。如果信号好可以尝试降低Wi-Fi发射功率WiFi.setTxPower(WIFI_POWER_19_5dBm)但可能影响稳定性。使用更快的API减少HTTP请求和响应时间。测量实际功耗使用万用表的电流档串联在电池供电回路中可以精确测量设备在不同工作状态深度睡眠、屏幕刷新、Wi-Fi连接下的电流从而找到耗电瓶颈。6.4 提升显示效果的技巧反色与抖动墨水屏对比度高但灰度表现有限。对于图片可以使用GxEPD2库内置的drawBitmap()方法并配合抖动算法如Floyd-Steinberg将灰度图片转换为黑白二值图效果会好于简单的阈值处理。自定义字体Adafruit GFX库支持从.vlw格式的字体文件创建自定义字体。你可以使用ProcessingIDE配合create_font工具生成特定大小和风格的字体让界面更美观。但要注意大字体文件会占用大量Flash空间。避免频繁更新最好的省电和护屏策略就是从产品逻辑上减少不必要的更新。例如天气站可以只在温度或天气状况变化超过一定阈值时才刷新屏幕。EE04是一块潜力巨大的开发板它巧妙地将低功耗显示与物联网能力结合。从简单的信息显示到复杂的低功耗物联网设备原型它都能胜任。开始你的项目时耐心做好环境搭建理解墨水屏的“脾气”善用深度睡眠你就能创造出续航惊人又实用的作品。我最开始用的时候总想着让它像普通屏幕一样快速刷新后来才慢慢适应了它的节奏转而从产品设计和交互逻辑上去扬长避短这本身也是一个很有意思的学习过程。