你有没有过这种体验?
打开手机上的番茄钟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”(数字疲劳)不是因为工具不够好,而是因为工具和干扰源共存于同一个设备上。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
| Desk32 | 物理隔离 + 智能功能 | 需要自己动手做(但这正是乐趣所在) |
Desk32的核心理念是”Intent-first”(意图优先):设备上只有你需要的功能,没有任何多余的干扰。你拿起它,就是为了专注。
硬件
这个项目的硬件清单短得不像一个功能齐全的桌面设备:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
没有杜邦线、没有面包板、没有外接传感器。这可能是你见过的接线最少的ESP32项目——因为根本不需要接线。
为什么选ESP32-S3-BOX-3?
乐鑫的ESP32-S3-BOX-3是一个被很多人低估的开发套件:
- 2.4寸IPS触摸屏:240×320分辨率,显示效果清晰
- 双核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个库:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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):
-
注册地址:https://dev.qweather.com/ -
免费版每天1000次调用 -
只需修改HTTP请求URL和JSON解析字段名
可以怎么改进?
这个项目的开源协议是GPL v3,鼓励修改和二次开发。以下是一些值得尝试的方向:
实用改进:
-
修改番茄钟时长(改成你习惯的专注/休息节奏) -
增加久坐提醒(每小时提醒站起来活动) -
任务数据保存到SD卡(目前断电后任务会丢失)
进阶挑战:
-
利用BOX-3的双麦克风阵列,接入ESP-SR语音识别框架,实现语音添加任务 -
接入国内智能家居平台(如HomeAssistant、涂鸦智能),实现联动控制 -
增加环境传感器数据显示(温湿度、CO2、光照)
界面美化:
-
用SquareLine Studio重新设计UI主题(比如暗色模式、像素风格等) -
添加开屏动画或自定义壁纸
适合谁?
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
结论
Desk32不是一个多么复杂的项目——硬件只有两个零件(BOX-3 + 电池),代码刷进去就能用。
但它解决了一个真实而普遍的问题:我们的手机太擅长分散注意力了,以至于连”帮你专注”的App都成了分心的入口。
用硬件隔离干扰,这个思路本身就很有启发性。
而且这个项目是学习ESP32触屏开发的绝佳起点:LVGL图形库、SquareLine Studio可视化设计、WiFi API调用、NTP时间同步、动态UI管理——这些技能组合起来,你可以做出任何你想要的桌面智能设备。
从专注力工具到天气站,从智能家居控制面板到迷你信息看板——ESP32-S3-BOX-3这块小屏幕的可能性,远比你想象的多。