你有没有过这种体验?
打开手机上的番茄钟App,准备专注学习25分钟。刚按下开始,一条微信消息弹了出来。“看一眼就好”——然后15分钟过去了,你发现自己在刷短视频。
番茄钟的敌人,从来不是时间本身,而是手机里的一切。
这正是Desk32项目想要解决的问题:既然手机上的专注工具总是被手机本身打败,那为什么不做一个独立的硬件设备?
一块ESP32-S3-BOX-3、一节18650电池,不到200元,2小时组装完成——你就拥有了一个完全脱离手机的专注力工作站:番茄计时器、任务管理、天气显示、喝水提醒,全部集成在一个触屏设备上。
最关键的是:它上面没有微信,没有短视频,没有任何让你分心的东西。

项目概述
Desk32是一个基于ESP32-S3-BOX-3开发套件打造的智能桌面专注力设备。它将学习和工作中最需要的几个功能集成到一个独立的触屏硬件上,让你不需要打开手机就能管理时间和任务。
项目实现了以下核心功能:
- 番茄钟计时器: 25分钟专注 + 5分钟休息的自动循环,带进度弧线动画和暂停/恢复控制
- 动态任务管理: 通过屏幕键盘添加待办事项,支持勾选完成(划线效果)和单独删除
- 实时天气显示: 通过WiFi连接OpenWeatherMap API,每15分钟更新一次温度和湿度
- 喝水健康提醒: 每30分钟弹出喝水提醒界面,可一键开关
- 日期时钟日历: NTP网络同步时间,12小时制显示,集成日历视图
- 亮度调节: 10%~100%滑块控制,适应不同环境光线
整个设备免接线——显示模块直接卡入底座的PCIe扩展接口,18650电池续航8~10小时,真正实现桌面即放即用。
为什么不用手机App?
在介绍技术细节之前,值得思考一个问题:市面上番茄钟App那么多,为什么要做一个硬件?
项目作者Ameya Angadi给出了一个很有说服力的理由:
“Digital fatigue”(数字疲劳)不是因为工具不够好,而是因为工具和干扰源共存于同一个设备上。
| 方案 |
优点 |
致命缺陷 |
| 手机番茄钟App |
免费、方便 |
和社交媒体、短视频同处一个设备,专注力随时被打断 |
| 电脑端番茄钟 |
屏幕大 |
浏览器标签页、聊天软件的诱惑近在咫尺 |
| 传统机械计时器 |
物理隔离 |
没有任务管理、没有健康提醒、功能单一 |
| Desk32 |
物理隔离 + 智能功能 |
需要自己动手做(但这正是乐趣所在) |
Desk32的核心理念是“Intent-first”(意图优先):设备上只有你需要的功能,没有任何多余的干扰。你拿起它,就是为了专注。
硬件选型解析
这个项目的硬件清单短得不像一个功能齐全的桌面设备:
| 硬件 |
数量 |
说明 |
| ESP32-S3-BOX-3 |
1 |
主控,自带2.4寸触摸屏、双麦克风、扬声器 |
| Sensor Dock底座 |
1 |
电池仓 + PCIe扩展接口 |
| 18650锂电池 |
1 |
2000-3000mAh,提供8-10小时续航 |
没有杜邦线、没有面包板、没有外接传感器。这可能是你见过的接线最少的ESP32项目——因为根本不需要接线。
为什么选ESP32-S3-BOX-3?
乐鑫的ESP32-S3-BOX-3是一个被很多人低估的开发套件,它为DIY项目提供了近乎“交钥匙”的硬件解决方案:
- 2.4寸IPS触摸屏: 240x320分辨率,显示效果清晰
- 双核ESP32-S3: 240MHz主频,跑LVGL图形界面毫无压力
- Sensor Dock底座: PCIe x1扩展接口,一插即连,取代了传统项目中的几十根杜邦线
- 18650电池仓: 底座内置电池座和电源管理IC,支持USB-C充电
- 双麦克风阵列: 为未来的语音控制预留了硬件基础
- Micro-SD卡槽: 为未来的数据持久化提供存储空间
换句话说,这不只是一个开发板——它是一个开箱即为成品外观的硬件平台。



组装过程:2小时,3步完成
第一步:安装电池
翻转Sensor Dock底座,找到18650电池仓。注意正负极方向(仓内有标注),将电池按正确方向放入。
使用2000~3000mAh的18650电池。推荐带保护板的电池,避免过放。

第二步:模块对接
将ESP32-S3-BOX-3显示模块对准底座顶部的PCIe扩展接口,轻轻压下直到卡扣到位。
这一步完成后,显示模块与底座之间的所有连接(电源、I2C、显示信号)就全部建立了。没有飞线,没有焊接。
首次上电如果屏幕没亮,先关再开——这是18650电池的正常保护机制。

第三步:烧录固件
这是整个项目中唯一需要花时间的步骤。
固件烧录:一步步来
环境准备
1. 安装Arduino IDE并添加ESP32开发板支持
在Arduino IDE的“开发板管理器”中搜索“ESP32”,安装乐鑫官方的ESP32开发板包。上传时选择开发板为“ESP32 S3 Box”。
2. 安装依赖库
打开Arduino IDE的“库管理器”,搜索并安装以下4个库:
| 库名称 |
作者 |
用途 |
| LVGL v8.3.x |
Kisvegabor |
图形界面引擎 |
| ArduinoJson |
Benoit Blanchon |
解析天气API返回的JSON数据 |
| ESP Panel |
Espressif |
ESP32-S3-BOX-3硬件驱动 |
| NTPClient |
Fabrice Weinberg |
网络时间同步 |
3. 替换LVGL配置文件(关键步骤!)
这是很多人容易踩坑的地方。项目使用了自定义的LVGL配置,需要用项目仓库中的文件覆盖Arduino库目录下的默认文件:
从GitHub仓库下载 Files_To_Copy.zip,解压后:
- 删除
Documents/Arduino/libraries/ 下的 lvgl 文件夹、ui 文件夹和 lv_conf.h 文件
- 将解压得到的同名文件夹和文件复制到该目录
如果跳过这一步,编译时会报大量LVGL相关错误。
配置你的参数
打开项目代码,找到以下几行,填入你自己的信息:
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* apiKey = "你的OpenWeatherMap API Key";
const char* city = "Shanghai"; // 你的城市英文名
const char* country = "CN"; // 国家代码
获取OpenWeatherMap API Key:
- 访问 https://openweathermap.org/ 注册免费账号
- 在“API keys”页面生成一个Key
- 免费版每分钟60次调用,项目每15分钟调用一次,完全够用
时区设置:
代码默认时区为印度(GMT+5:30)。中国用户需要修改为GMT+8:
// 将原来的时区偏移量改为:
const long gmtOffset_sec = 8 * 3600; // 东八区
const int daylightOffset_sec = 0; // 中国不使用夏令时
上传固件
USB-C线连接电脑,Arduino IDE中选择正确的端口和开发板(ESP32 S3 Box),点击上传。等待编译和烧录完成后,设备会自动重启并显示“Desk32”启动画面。
软件架构深度解析
这个项目的代码架构很值得学习,尤其是如何在ESP32上构建一个多功能的触屏应用。
LVGL图形引擎
项目的UI完全基于LVGL(Light and Versatile Graphics Library)构建。LVGL是嵌入式领域最流行的开源GUI库,支持按钮、滑块、列表、动画等丰富的控件。
作者使用了SquareLine Studio进行可视化UI设计——这是一个LVGL官方的拖拽式设计工具,类似于嵌入式版的Figma。设计好界面后,一键导出为C代码,直接在ESP32上运行。
如果你想修改界面外观,项目仓库提供了 Desk32_Design_Files.zip,用SquareLine Studio打开即可可视化编辑,不需要手写坐标。

番茄钟引擎
番茄钟的核心逻辑简洁高效:
主循环检测 pomoRunning 状态
→ 每1000ms递减 timeLeft
→ 更新弧形进度条 + 剩余时间标签
→ timeLeft归零时自动切换:
专注模式(25min) ↔ 休息模式(5min)
→ 休息开始时随机显示一条提示:
“去散个步”、“喝口水”、“伸个懒腰”...
这种状态机设计既简单又可靠。如果你想改成“50分钟专注+10分钟休息”的长周期模式,只需修改两个时间常量。
动态任务管理
任务管理是这个项目中最有技巧的部分。addTaskToUI() 函数展示了如何在LVGL中动态创建和管理控件:
- 用户通过屏幕键盘输入任务文本
- 函数动态创建一个包含复选框 + 删除按钮的容器
- 容器被添加到可滚动列表中
- 复选框绑定事件:勾选后文字变为划线样式(完成效果)
- 删除按钮绑定事件:点击后移除整个容器
这是学习LVGL动态UI构建的绝佳范例。
天气数据获取
天气模块的实现是标准的“ESP32 + RESTful API”模式:
- 每15分钟向OpenWeatherMap发送HTTP GET请求
- ArduinoJson解析返回的JSON数据
- 提取温度(temp)和湿度(humidity)字段
- 更新屏幕上的天气标签
15分钟的刷新间隔是精心选择的:既保证数据时效性,又最大限度节省电量(WiFi收发是ESP32最耗电的操作)。
喝水提醒机制
一个贴心的小功能:每30分钟触发一次喝水提醒,弹出全屏提醒界面。可在设置页面通过开关一键关闭。
实现原理很简单——主循环中维护一个30分钟的倒计时器,到时间后切换到提醒Screen,用户点击确认后返回主界面。
UI设计:SquareLine Studio入门
这个项目另一个非常值得学习的点是SquareLine Studio的使用。
很多人做ESP32项目时,UI代码是最痛苦的部分——手动计算每个控件的x/y坐标、大小、颜色,改一个像素就要重新编译上传。
SquareLine Studio改变了这种工作流:
传统方式 vs SquareLine Studio
| 对比项 |
手写LVGL代码 |
SquareLine Studio |
| 控件定位 |
手动计算像素坐标 |
拖拽放置 |
| 样式调整 |
修改代码→编译→上传→查看 |
实时预览 |
| 多页面管理 |
手动管理Screen切换 |
可视化页面树 |
| 动画效果 |
手写动画回调函数 |
属性面板配置 |
| 学习曲线 |
需要熟悉LVGL API |
类似Figma的操作 |
SquareLine Studio的免费版支持最多5个Screen,对于这类桌面设备项目完全够用。
复刻指南
硬件获取
ESP32-S3-BOX-3套装目前在国内电商平台很容易买到。
时区和城市配置
前面已经提到,修改时区为东八区:
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
城市名改为你所在城市的英文名(OpenWeatherMap支持中国所有主要城市):
const char* city = "Beijing"; // 或 Shanghai, Shenzhen, Hangzhou 等
const char* country = "CN";
OpenWeatherMap在国内的访问
OpenWeatherMap的API在国内可以正常访问(不同于很多海外网站)。注册和使用都不需要特殊网络环境。免费版完全满足本项目需求。
进阶:替换为国内天气API
如果你想使用国内的天气服务,可以将OpenWeatherMap替换为和风天气(QWeather):
可以怎么改进?
这个开源项目的协议是GPL v3,鼓励修改和二次开发。以下是一些值得尝试的方向:
实用改进:
- 修改番茄钟时长(改成你习惯的专注/休息节奏)
- 增加久坐提醒(每小时提醒站起来活动)
- 任务数据保存到SD卡(目前断电后任务会丢失)
进阶挑战:
- 利用BOX-3的双麦克风阵列,接入ESP-SR语音识别框架,实现语音添加任务
- 接入国内智能家居平台(如HomeAssistant、涂鸦智能),实现联动控制
- 增加环境传感器数据显示(温湿度、CO2、光照)
界面美化:
- 用SquareLine Studio重新设计UI主题(比如暗色模式、像素风格等)
- 添加开屏动画或自定义壁纸
适合谁?
| 适合 |
不太适合 |
| 想学习ESP32触屏应用开发的Maker |
只想用成品、不愿折腾的用户 |
| 考研/考公/备考需要专注工具的学生 |
已经有很好的时间管理习惯的人 |
| 想入门LVGL和SquareLine Studio的开发者 |
对硬件完全零基础的纯软件用户 |
| 想做桌面智能设备但不想焊接的人 |
需要复杂日程管理(日历同步等)的人 |
| 送给朋友的有心意的DIY礼物 |
追求极致颜值的产品级要求 |
结论
Desk32不是一个多么复杂的项目——硬件只有两个零件(BOX-3 + 电池),代码刷进去就能用。
但它解决了一个真实而普遍的问题:我们的手机太擅长分散注意力了,以至于连“帮你专注”的App都成了分心的入口。
用硬件隔离干扰,这个思路本身就很有启发性。
而且这个项目是学习ESP32触屏开发的绝佳起点:LVGL图形库、SquareLine Studio可视化设计、WiFi API调用、NTP时间同步、动态UI管理——这些技能组合起来,你可以做出任何你想要的桌面智能设备。
从专注力工具到天气站,从智能家居控制面板到迷你信息看板——ESP32-S3-BOX-3这块小屏幕的可能性,远比你想象的多。
项目原文:https://www.hackster.io/Ameya_Angadi/desk32-the-ultimate-diy-smart-desk-hub-for-deep-work-fe71b3
希望这个DIY项目能给你的学习和创作带来一些灵感。如果你有更多关于硬件开发或时间管理的心得,欢迎到 云栈社区 与更多开发者交流分享。