基于ESP32与透明屏的桌面信息站:从硬件选型到LVGL界面开发全解析

📅 2026/7/28 4:47:28
基于ESP32与透明屏的桌面信息站:从硬件选型到LVGL界面开发全解析
1. 项目概述从透明屏幕到桌面信息中枢几年前我第一次在科技展上看到那种悬浮在空中的全息影像就被那种未来感深深吸引了。但那些设备要么价格昂贵要么体积庞大离普通人的桌面相去甚远。后来接触到一些极客社区的项目发现用ESP32这类微控制器驱动小型LCD屏做桌面时钟、天气站已经非常成熟这给了我一个启发能不能把“透明显示”和“桌面实用工具”结合起来做一个既有科技观赏性又有日常实用价值的设备这就是HoloCubic项目的起点。它本质上是一个基于ESP32-PICO-D4微控制器驱动一块1.3英寸的ST7789 IPS圆形透明显示屏并集成MPU6050六轴传感器的多功能桌面站。说“透明”可能不太准确更贴切的描述是它的屏幕在显示内容时内容像是悬浮在玻璃上而屏幕本身是半透明的你可以透过它隐约看到后面的物体这种层次感是普通屏幕无法提供的。它能做什么最直观的就是一个极具个性的桌面时钟数字或表盘仿佛漂浮在空中。更进一步结合网络功能它可以实时显示天气、空气质量、待办事项甚至作为智能家居的一个控制面板或信息看板。集成的MPU6050传感器则带来了交互的可能性比如通过倾斜设备来切换显示页面、调节亮度或者作为一个简易的陀螺仪姿态演示装置。它适合谁呢我认为有三类人首先是电子DIY爱好者和嵌入式开发者这个项目涵盖了从硬件焊接、固件编译到UI设计的完整流程其次是桌面美化爱好者和极客一个独一无二的透明显示设备本身就是最好的装饰最后是学生它作为一个综合性的学习平台能让你亲手实践物联网、传感器、图形界面等多个知识点。2. 核心硬件选型与设计思路拆解2.1 主控芯片为什么是ESP32-PICO-D4在项目初期主控的选择是关键。市面上常见的ESP32开发板如NodeMCU、DevKitC体积较大不适合追求小巧精致的桌面设备。ESP32-PICO-D4进入了我的视野这是一个将ESP32芯片、Flash、晶振和射频匹配电路全部集成在一个7mm x 7mm封装内的系统级封装SiP模块。选择它主要基于三点考量。第一是极致的紧凑性。PICO-D4模块本身几乎就是一个最小系统外围只需要少量电容电阻即可工作这为设计一个火柴盒大小的核心板提供了可能是整个设备能够小型化的基石。第二是性能与功能的平衡。它拥有ESP32双核240MHz的主频、520KB SRAM、4MB Flash处理LVGL图形库和网络通信绰绰有余同时集成了Wi-Fi和蓝牙为物联网功能留足了空间。第三是供电灵活性。它的工作电压范围是2.7V到3.6V这意味着我们可以直接用一颗3.7V的锂电池配合充电管理芯片供电实现设备的无线化摆放。这里有个实操心得PICO-D4的引脚排列比较密集手工焊接有难度。建议使用热风枪配合合适的焊膏和钢网进行焊接或者直接购买已经焊好模块的核心板。焊接时一定要注意温度曲线过高的温度容易损坏内部Flash。2.2 显示核心ST7789驱动的圆形透明IPS屏显示部分是这个项目的灵魂。我选择的是一块1.3英寸、240x240分辨率的圆形IPS液晶屏驱动芯片是ST7789。所谓“透明”是指它的背光板是特殊的导光设计在显示黑色时像素点关闭屏幕本身的透光率较高能看到背后的物体显示其他颜色时则像普通屏幕一样。ST7789是一款非常流行的驱动芯片支持SPI和8位/9位/16位/18位并行接口。为了节省宝贵的GPIO引脚特别是对于引脚数量有限的PICO-D4我选择了SPI接口。虽然SPI的刷新速度理论上不如并行接口但对于240x240这种小分辨率、且刷新率要求不高通常30-60Hz的桌面应用来说完全足够。屏幕的选型有几个细节需要注意。一是“IPS”技术它保证了从各个角度观看都不会有严重的色偏这对于一个可能被放在桌面上从不同角度瞥见的设备很重要。二是“圆形”切割这比方形屏更具设计感和未来感但相应的UI设计也需要适配圆形画布。三是驱动电压通常这类屏幕是3.3V供电与ESP32的IO电平完美匹配无需电平转换。注意市面上有些“透明屏”其实是透明OLED其原理和效果与透明LCDIPS完全不同。OLED是自发光黑色区域完全不发光即为全透明对比度极高但价格昂贵且有小尺寸烧屏风险。我们选的这种LCD透明屏是靠特殊背光实现半透效果成本更低更适合常亮显示桌面信息。2.3 运动感知MPU6050六轴传感器的妙用MPU6050是一个经典的六轴运动处理传感器包含三轴加速度计和三轴陀螺仪。我把它加入项目最初的想法很简单让设备能感知自己的姿态。比如当我把设备平放时它显示时钟当我把它拿起来倾斜一定角度时自动切换到系统菜单或另一个信息页面。这比单纯用按钮切换要酷得多也更符合直觉。MPU6050通过I2C接口与ESP32通信只需要两根线SDA, SCL。它的存在极大地丰富了交互维度。除了姿态检测还可以实现一些有趣的功能比如作为一个简易的水平仪或者通过检测特定频率的晃动来实现“摇一摇”切歌或清除通知。当然要获取稳定的姿态数据欧拉角滚转、俯仰、偏航需要对传感器的原始数据进行复杂的滤波和姿态解算。好在MPU6050内部集成了数字运动处理器DMP我们可以将解算算法加载到DMP中运行主控芯片只需读取解算好的姿态四元数或欧拉角大大减轻了ESP32的运算负担。在布局上MPU6050应尽量放置在设备的几何中心附近以减少因旋转带来的离心加速度干扰。同时它的安装方向需要与代码中的坐标系定义严格一致否则解算出的姿态角会是错的。2.4 供电与结构设计思路一个桌面设备拖着线缆就失去了美感。因此供电系统我设计为锂电池供电USB充电。选用一颗容量在500mAh到1000mAh之间的3.7V锂聚合物电池搭配一款集成充电、放电保护和升压功能的芯片如IP5306。IP5306这类芯片非常方便它能够将电池的3.7V升压到5V输出同时管理USB口的5V输入给电池充电还带有电量检测和按键开关机功能。结构设计上为了突出“透明”和“悬浮”感我考虑过几种方案一是用亚克力板切割一个支架将屏幕和主板悬空架起来二是设计一个3D打印的外壳将屏幕嵌在顶部主板藏在底部。考虑到散热和制作的便利性我最终选择了3D打印方案。外壳设计时要在屏幕前方留出足够的无遮挡区域确保透明效果主板部分要留出USB接口、复位按键的位置还要考虑MPU6050的放置位置避免被金属或电池遮挡信号。3. 软件架构与LVGL图形库移植详解3.1 开发环境搭建与工程框架软件部分我选择使用乐鑫官方的ESP-IDF开发框架。相比Arduino Core for ESP32ESP-IDF提供了更底层的控制、更优的内存管理以及对ESP32芯片特性更全面的支持对于整合LVGL这种稍显复杂的图形库更为合适。首先是在本地安装ESP-IDF版本v4.4或v5.0均可。安装过程乐鑫的文档很详细主要是设置好工具链和路径。新建一个工程后我们需要通过idf.py menuconfig来配置一些关键参数。首先是串口下载端口然后是分区表Partition Table因为我们要存放字库、图片等资源需要适当调大spiffs或fatfs分区的大小。最重要的是调整FreeRTOS的堆栈大小LVGL和网络任务都需要消耗不少内存建议将主任务的堆栈大小设置为至少8192字节。工程框架上我习惯这样组织holocubic/ ├── main/ │ ├── app_main.c // 主程序入口 │ ├── lvgl_ui.c/.h // LVGL界面初始化和主页面逻辑 │ ├── display.c/.h // 屏幕驱动ST7789封装 │ ├── sensor.c/.h // MPU6050驱动与数据解算 │ ├── network.c/.h // Wi-Fi连接、时间同步、天气API请求 │ └── ... ├── components/ // 可选存放自定义组件 ├── CMakeLists.txt └── sdkconfig这种结构清晰地将不同功能的代码模块化便于管理和调试。3.2 LVGL移植从驱动适配到界面渲染LVGLLight and Versatile Graphics Library是一个开源嵌入式图形库资源消耗相对较小功能却非常强大支持动画、主题、多种控件是我们构建精美UI的不二之选。移植LVGL到ESP32ST7789平台主要做三件事分配绘制缓冲区、实现屏幕驱动接口、配置心跳与时基。1. 缓冲区分配LVGL需要一块或多块缓冲区来渲染图形。对于240x240的16位色RGB565屏幕一帧图像需要240*240*2 115200字节即112.5KB。ESP32-PICO-D4的内部RAM只有520KB还要留给系统、网络栈等所以一次性分配两个全屏缓冲区双缓冲是不现实的。我采用的是一种折中方案分配一个1/10屏幕大小的缓冲区240*24*2 ≈ 11KB让LVGL分块渲染。在lv_conf.h配置文件中我们需要设置LV_COLOR_DEPTH 16LV_HOR_RES和LV_VER_RES为240并修改缓冲区大小#define LV_COLOR_DEPTH 16 #define LV_HOR_RES 240 #define LV_VER_RES 240 // 使用1/10屏幕大小的缓冲区 #define LV_DISP_DEF_REFR_PERIOD 30 #define LV_INDEV_DEF_READ_PERIOD 30 #define LV_DISP_DEF_RENDER_MODE LV_DISP_RENDER_MODE_PARTIAL然后在主程序中静态分配这块缓冲区或者从堆上分配。2. 驱动接口实现这是移植的核心。我们需要实现一个lv_disp_drv_t显示驱动和一个lv_indev_drv_t输入设备驱动。对于显示驱动关键函数是flush_cb。当LVGL渲染好一块区域后会调用这个回调函数并传入一个包含像素数据的数组和区域坐标。我们的任务就是将这些数据通过SPI发送给ST7789芯片的对应GRAM区域。static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { // 1. 设置ST7789的列地址和行地址范围为area指定的区域 st7789_set_address_window(area-x1, area-y1, area-x2, area-y2); // 2. 发送像素数据数组 color_p spi_write_data((uint8_t*)color_p, (area-x2 - area-x1 1) * (area-y2 - area-y1 1) * 2); // 3. 通知LVGL该区域刷新完成 lv_disp_flush_ready(disp_drv); }SPI的驱动优化很重要。要启用DMA传输并将SPI时钟设置到尽可能高比如40MHz同时确保GPIO引脚的上拉/下拉配置正确以避免通信错误。3. 心跳与时基LVGL的内部计时如动画、任务延时需要一个毫秒级的心跳源。我们可以在一个高优先级的FreeRTOS定时器任务中定期调用lv_tick_inc(1)来告知LVGL时间过去了1毫秒。同时在主循环中不断调用lv_task_handler()来处理LVGL的内部任务。3.3 ST7789 SPI驱动优化与双缓冲策略虽然我们因为内存限制无法使用真正的全屏双缓冲但可以通过一些策略来优化SPI写入速度减少屏幕撕裂感。首先SPI的配置要最大化。ESP32的SPI主机模式在spi_bus_config_t中将max_transfer_sz设置为至少240*240*2字节即使我们不分块传输这个设置也能保证大块数据传输的稳定性。clock_speed_hz可以尝试设置为80MHz如果屏幕支持但通常40MHz是一个稳定高效的选择。其次在disp_flush函数中直接使用spi_device_transmit进行阻塞式DMA传输。虽然阻塞了当前任务但由于我们分块很小比如24行阻塞时间很短几毫秒不会对系统响应造成明显影响。比起队列式非阻塞传输代码更简单稳定性更高。实操心得ST7789初始化序列很重要。不同厂家、不同批次的屏幕其初始化命令可能略有差异。务必使用卖家提供的或经过验证的初始化代码。常见的初始化步骤包括软件复位、退出睡眠模式、设置颜色模式RGB565、打开显示、设置亮度等。一个错误的初始化命令可能导致花屏、颜色错乱甚至不显示。为了进一步减少在刷新过程中的撕裂感即上半部分显示新帧下半部分还是旧帧我们可以采用“回写”策略。即在flush_cb中我们不是立即刷新屏幕而是先将数据拷贝到另一个后备缓冲区然后在一个独立的、与LVGL渲染同步的任务中将后备缓冲区的数据刷到屏幕上。这需要额外的内存但能保证一帧数据的完整性。对于HoloCubic由于界面变化通常不是全屏剧烈动画简单的分块刷新已经能提供不错的体验。3.4 MPU6050数据读取与姿态解算实战MPU6050的驱动相对标准。通过I2C读取其加速度计和陀螺仪的原始数据ACCEL_XOUT_H等寄存器这些数据是16位有符号整数需要根据数据手册上的量程例如加速度计±2g陀螺仪±250°/s进行转换得到物理值g和°/s。获取原始数据只是第一步我们的目标是得到稳定的姿态角。这里有两个主流方案方案一使用内置DMP数字运动处理器。这是最推荐的方式。我们需要将InvenSense官方提供的inv_mpu.c、inv_mpu_dmp_motion_driver.c等文件移植到工程中。这个过程稍显繁琐需要正确实现几个底层函数如I2C读写、延时毫秒、打印调试。成功加载固件到DMP后我们可以通过dmp_read_fifo函数直接获取解算好的四元数再将其转换为欧拉角俯仰pitch、滚转roll、偏航yaw。DMP解算稳定且不消耗主控CPU资源。方案二软件解算。如果不想折腾DMP也可以在ESP32上运行解算算法如互补滤波或卡尔曼滤波。其基本原理是利用加速度计测量到的重力矢量方向来修正陀螺仪积分产生的漂移。一个简单的互补滤波伪代码如下// 假设accel[3], gyro[3]是经过单位转换后的数据 float pitch_acc atan2(accel_y, sqrt(accel_x*accel_x accel_z*accel_z)); // 从加速度计估算俯仰角 float roll_acc atan2(-accel_x, accel_z); // 从加速度计估算滚转角 // 陀螺仪积分需乘以时间间隔dt pitch_gyro gyro_x * dt; roll_gyro gyro_y * dt; // 互补滤波融合 float alpha 0.98; // 信任陀螺仪的比例 pitch alpha * (pitch gyro_x * dt) (1-alpha) * pitch_acc; roll alpha * (roll gyro_y * dt) (1-alpha) * roll_acc;软件解算对CPU有一定消耗且参数如滤波系数、dt需要仔细调试才能获得稳定效果。在HoloCubic中我将MPU6050的数据读取和解算放在一个独立的高优先级任务中以固定的频率如100Hz运行。解算出的姿态角通过FreeRTOS的队列或全局变量注意互斥锁传递给LVGL的UI任务用于控制界面交互。4. 功能实现与UI交互设计4.1 主界面时钟与天气信息显示主界面是设备最常显示的画面设计原则是信息清晰、美观、有科技感。我设计了一个分层式的布局最底层一个非常淡的、动态变化的粒子背景或渐变色彩增加深邃感。中间层时间信息。采用大字体、细字重的数字显示时分秒。因为屏幕是圆形我将时间放在略微偏上的位置下方留出空间。字体颜色可以根据环境光传感器如果有或时间自动调整比如白天用深灰色晚上用亮白色。上层日期、星期和天气信息。日期用较小字体显示在时间下方。天气图标和温度则显示在屏幕的底部区域。天气数据通过网络从心知天气、和风天气等免费API获取。获取网络时间NTP和天气信息需要设备先连接Wi-Fi。我设计了一个配网模式如果设备首次启动或未保存配网信息则自动进入AP模式手机连接设备发出的热点后通过网页输入Wi-Fi密码。这里可以使用ESP-IDF提供的wifi_provisioning组件它已经封装了这套逻辑非常方便。一旦联网成功设备会通过SNTP协议同步本地时间并定时如每30分钟请求天气API。为了节省电量如果是电池供电和减少网络请求需要合理设置更新频率。所有获取到的信息都存储在非易失性存储NVS中这样即使网络暂时断开也能显示最近的数据。4.2 多页面管理与姿态触发切换单一主界面不够用我们需要多个页面比如系统菜单、传感器数据页、音乐控制页等。LVGL本身通过lv_scr_load()可以实现页面切换但我们需要一个更结构化的管理器。我实现了一个简单的页面栈管理器。每个页面是一个独立的函数负责创建和销毁自己的UI控件。用一个全局变量记录当前页面ID。当需要切换页面时先清理当前页面的所有对象然后调用新页面的创建函数。那么如何触发切换呢这就是MPU6050发挥作用的时候。我在主循环中持续监测解算出的俯仰角pitch和滚转角roll。定义几个手势设备前倾Pitch增大超过30度切换到“系统信息”页面显示IP地址、内存使用率等。设备后仰Pitch减小超过30度切换到“传感器原始数据”页面。设备向左旋转Roll变化在菜单页面中可以模拟向左滑动的选择操作。快速晃动检测通过计算一段时间内加速度的方差检测到快速晃动时可以执行“返回主界面”或“刷新天气”的操作。为了避免误触发需要加入迟滞和去抖逻辑。例如只有姿态角保持在新状态超过500毫秒才确认触发页面切换对于晃动检测需要设置一个合理的加速度变化阈值。4.3 动态效果与主题定制LVGL的强大之处在于其丰富的动画和主题系统。为了让HoloCubic的界面更生动我加入了以下动态效果时间数字刷新不是生硬地直接改变数字而是使用lv_anim给旧数字添加一个向上淡出缩小的动画同时新数字从下方淡入放大。页面切换使用lv_scr_load_anim()函数实现页面的左滑入、右滑入、淡入淡出等过渡效果。天气图标如果是晴天图标可以有一个缓慢的亮度脉动如果是雨天可以有雨滴下落的小动画用多个小圆点配合路径动画实现。主题方面我定义了两套主题一套亮色主题浅灰背景、深色文字用于白天一套暗色主题深灰背景、亮色文字用于夜晚。可以根据时间自动切换或者通过长按某个虚拟按钮手动切换。主题定义了所有控件按钮、标签、滑块等的默认样式确保整个UI风格统一。4.4 低功耗策略与电源管理对于电池供电的设备功耗是必须考虑的问题。ESP32本身在深度睡眠模式下功耗可以低至10μA级别但我们的设备需要保持显示和传感器监测无法进入深度睡眠。因此优化重点在活跃状态。屏幕背光控制ST7789屏幕的背光是耗电大户。通过PWM控制其亮度。在环境光暗时可通过MPU6050的加速度计静态值估算或者外接光敏电阻自动降低背光亮度。甚至可以设置一个“睡眠时间表”在深夜完全关闭背光只保留最低限度的RTC计时。网络连接策略Wi-Fi连接和维持是另一大耗电源。不要保持长连接。我的策略是仅在需要同步时间或更新天气时连接Wi-Fi完成后立即断开。例如每小时连接一次同步时间并获取天气整个过程在10秒内完成然后断开Wi-Fi。其余时间设备运行在无网络状态。CPU频率动态调整当设备处于静止状态通过MPU6050判断且没有动画正在运行时可以通过esp_pm_configure()降低CPU主频如从240MHz降到80MHz。当检测到姿态变化或需要执行网络任务时再提升回高性能模式。LVGL渲染优化只刷新需要更新的区域。利用LVGL的局部刷新特性避免全屏刷新。将非关键动画的帧率降低。通过这些组合策略可以将设备在静态显示时钟时的平均工作电流从上百毫安降低到30-50mA左右显著延长电池续航。5. 常见问题与调试心得实录5.1 显示问题花屏、撕裂、颜色异常这是调试初期最常见的问题。花屏/乱码几乎可以肯定是SPI通信问题。首先检查硬件连接CS、DC、RESET、SDA、SCL、VCC、GND是否接好特别是电源是否稳定建议在VCC和GND之间并联一个10μF和0.1μF的电容。其次检查软件SPI的时钟极性CPOL和相位CPHA是否正确ST7789通常模式是CPOL0, CPHA0。初始化命令序列是否正确可以尝试降低SPI时钟速度如先降到10MHz测试。屏幕撕裂即图像上下部分不一致。这是因为LVGL渲染和屏幕刷新不同步。确保在disp_flush回调函数中只有完全发送完一帧数据后才调用lv_disp_flush_ready。如果使用了双缓冲或分块策略确保缓冲区交换的时机正确。也可以尝试在LVGL配置中启用垂直同步LV_VDB_DOUBLE相关配置但这需要更多内存。颜色异常红蓝互换等这是颜色格式设置错误。ST7789支持多种颜色格式RGB565, BGR565, RGB888等。在初始化命令中需要通过COLMOD命令设置正确的颜色格式。同时在LVGL的lv_conf.h中LV_COLOR_16_SWAP这个宏定义会影响16位色的字节顺序如果颜色不对可以尝试切换这个宏的定义0或1。5.2 MPU6050数据不稳定与姿态漂移数据跳动大首先确保MPU6050的电源通常3.3V干净稳定且与ESP32共地。I2C总线上需要加上拉电阻通常4.7kΩ。其次在代码中对读取的原始数据做一个简单的滑动平均滤波比如取最近5次值的平均可以立刻让曲线平滑很多。最后检查量程是否合适如果测量的是微小的倾斜却用了±8g的量程分辨率会不够。姿态角特别是Yaw漂移这是陀螺仪固有的缺陷它测量的是角速度积分得到角度任何微小的零点偏差零偏都会随着时间积分被无限放大。加速度计可以修正俯仰和滚转但无法修正偏航Yaw因为水平旋转时重力矢量不变。解决方案使用DMPDMP内部算法已经考虑了零偏校准和漂移补偿效果最好。软件零偏校准设备上电后保持绝对静止2-3秒计算这段时间内陀螺仪输出的平均值作为零偏值。在后续积分中每次读数都减去这个零偏。引入磁力计这是根本解决方法。增加一个HMC5883L或QMC5883这样的磁力计构成九轴传感器。利用地磁场方向来修正Yaw轴的漂移。但这会增加硬件和软件传感器融合算法如Mahony或Madgwick滤波的复杂度。5.3 LVGL运行卡顿与内存不足界面操作卡顿首先检查lv_task_handler()是否在主循环中被频繁调用建议每5-10ms调用一次。其次检查是否有耗时操作阻塞了主任务比如在事件回调函数中进行复杂的计算或网络请求。这些操作应该放到独立的FreeRTOS任务中。另外减少过于复杂的动画或同时运行多个动画。内存不足崩溃ESP32的堆内存有限。使用heap_caps_print_heap_info()函数定期打印内存信息。LVGL对象按钮、标签等创建后要及时删除lv_obj_del。避免使用大面积的图像未经压缩的BMP图非常占内存尽量使用符号字体或矢量图。如果使用中文字库只包含需要的字符而不是整个GB2312字库。将不变的资源如图片、字库存放到SPIFFS文件系统中而不是编译进代码里。5.4 焊接与硬件调试坑点ESP32-PICO-D4虚焊这是导致设备不稳定、频繁重启的常见原因。由于引脚在底部BGA肉眼难以检查。可以用万用表二极管档测量模块外围的滤波电容两端是否与对应电源引脚连通。最可靠的方法还是用热风枪和好锡膏重新焊接一遍。屏幕排线接触不良FPC排线如果只是按压连接在移动设备时容易松动。最好使用FPC连接器并锁紧或者在排线插入后用高温胶带固定。电池供电不稳定当屏幕背光全亮或Wi-Fi发射时电流可能瞬间较大导致电池电压瞬间跌落引发ESP32复位。在电池和主板电源输入端之间并联一个较大容量的电容如100μF钽电容作为储能缓冲可以很好地解决这个问题。5.5 网络连接与OTA升级Wi-Fi连接不稳定确保代码中处理了各种Wi-Fi事件SYSTEM_EVENT_STA_DISCONNECTED等并实现重连机制。可以保存多个备用的Wi-Fi密码SSID/Password到NVS当前网络连不上时尝试下一个。天线的摆放也有影响尽量让天线区域远离金属外壳和电池。OTA空中升级这是让产品迭代变得方便的功能。ESP-IDF提供了完善的OTA组件。你需要配置两个OTA分区ota_0, ota_1并在代码中启用OTA功能。然后搭建一个简单的HTTP服务器将新的固件bin文件放在上面。设备端可以定期检查或者在收到特定指令如通过按钮触发后从指定的URL下载固件并写入到另一个OTA分区然后重启切换。OTA过程中务必做好断电保护意外断电后能回滚和校验MD5或SHA256校验固件完整性。这个项目从一块透明的圆形屏幕开始到最终成为一个集显示、交互、联网于一体的桌面小站整个过程充满了挑战和乐趣。它不仅仅是一个显示设备更是一个可无限扩展的嵌入式开发平台。你可以为它增加语音模块实现语音控制增加温湿度传感器显示环境数据甚至将它接入Home Assistant成为智能家居中枢的一个可视化节点。硬件DIY的魅力就在于想法和实现之间只差动手一试。