Rukenshia/pomodoro

这是一个基于 ESP32 的 Pomodoro 计时器的代码仓库。它使用电子墨水屏(ePaper display)显示,并使用旋转拨盘进行输入。仓库中的代码不包含所有必需的资源和字体,所以不是开箱即用。但是,您可以根据自己的需求修改和适配代码。

the finished product from the front

零件清单

项目缘起

我喜欢尝试各种提高效率的技巧 - 有人说,追求优化效率本身就是一种终极拖延方法,也许这就是我做这个项目的动力。我也有一个习惯,每年花一个月左右的业余时间做一个对别人有益的项目。去年,我买了一台 3D 打印机 (BambuLab X1C),想好好利用它。在转行成为软件工程师之前,我完成了电子工程师的学徒生涯,所以我也想回归本源,做一些实实在在的东西。我的朋友有时在时间管理方面遇到困难 - 需要组织的任务很多,但注意力却很分散。所以我想到:为什么不给他们做一个 Pomodoro 计时器呢? 因此,我设定了几个目标:

市面上有一些很酷的项目 (可以说比这个酷得多,例如 Salim Benbouziyane 的 Focus Dial),但我还是想从头开始构建一些东西。而且我从来没有用过电子墨水屏,觉得它很适合需要长时间待机并且不需要背光的应用。

为什么选择这些零件?

这是我很久以来第二次用微控制器构建东西。我对 ESP32 足够熟悉,可以放心地再次投入,所以这是主要选择。我之前做了一些研究,看看支持哪些类型的显示器。

电子墨水屏 (ePaper Display)

我需要某种显示器,或者至少我 想要 某种显示器。这个项目的主要动机之一是它应该不妨碍你的工作 - 直到你完成当前的专注时间并继续前进。对我来说,这意味着我想要一个没有任何背光的显示器。

显示器也应该足够大,你可以把整个设备放在桌子上的某个地方,并且仍然能够阅读它。在订购并试用了几个 WaveShare 电子墨水屏显示器之后,我最终选择了 4.26 英寸的型号,原因如下:

最初,我真的很想使用黑色/白色/红色显示器,并且找到了一个我喜欢的,但是刷新时间长达 16 秒,并且不支持局部刷新,这对我来说是一个致命的缺点。

最终的附加功能:它在晚上不起作用。如果你的桌子不够亮,你就无法阅读显示屏。这是一个功能,而不是一个 bug。外面太黑了吗?别再工作了!

旋转编码器 (Rotary Encoder)

从一开始,我就知道我想要某种拨盘作为输入 - 这对我来说最有意义。这需要更多的复杂性才能设计菜单,并且您需要确保正确地消除输入的抖动。我还向 CLK 和 DT 引脚添加了 .1uF 电容,以帮助平滑信号。

LED

在前几个迭代中,没有 LED 的计划。我拥有一个没有背光的显示器的天才计划的代价是:当您当前的专注时间结束时,它可能 不明显了。我尝试了一些不同的想法:

LED shroud screenshot of the CAD model

LED 最终工作得很好,让我可以显示不同的状态。它可能很微妙,但我也在外壳上添加了一个小小的外罩,并在 LED 前面添加了一个扩散层,以使其看起来更好。

构建外壳

外壳分为两部分:底座和盖子。我做出的一个不幸的设计选择是,显示器框架作为底座的一部分整体打印,因此顶部边缘在打印过程中会有点翘曲。由于 CAD (或产品设计) 不是我的强项,因此肯定会有更好的选择来设计它以获得更好的最终外观。

我希望我早点学到的一件事是,将拨盘放在前面可能不是最好的主意:因为打印件和电子设备非常轻巧,所以按下拨盘上的开关往往只会使整个设备向后滑动。幸运的是,我可以通过在表壳底部添加一些橡胶脚和重量 (通常用于平衡轮胎的那些) 来解决此问题。这很有效,我对它的结果感到满意。

软件

该软件是用 C++ 编写的,并使用 Arduino 框架。我使用 PlatformIO 来管理该项目 (至少这似乎是一个流行的选择,但我现在不确定了)。该项目严重依赖于 GxEPD2 库进行显示。我不会说谎,这个存储库中的代码有点混乱 - 我必须及时完成任务,这导致了很多复制粘贴,并且没有重新审视代码的早期部分。某些部分是由 AI (主要是 Claude) 生成的,以帮助我在设定的截止日期内完成该项目。

a random fact displayed on the screen

由于这是一个为我的朋友准备的项目,因此我也想包含一些彩蛋和乐趣。您可能认为在 应该集中精力时 添加一些随机事实将是一个坏主意,但我认为这是一个有趣的小补充。

使用设备

设备启动时,您可以更改一些设置或进入预设选择模式。从那里,您可以选择三个预设之一:

preset selection

然后,计时器将启动,并在时间结束后通知您 (通过闪烁 LED 并在屏幕上显示一条消息)。您可以继续工作 (不建议这样做,但如果您想完成某些工作,这是必要的),然后开始休息。

timer running

在暂停期间,您可以查看一些统计信息。每隔几个迭代 (默认情况下为 4 个),您的暂停时间会更长,以便您有时间恢复。

pause statistics

开发

引脚映射

旋转编码器 (KY-040)

PIN | # ---|--- CLK | 32 DT | 21 SW | 14

电子墨水屏 (GxEPD2_426_GDEQ0426T82, WaveShare 4.26" 黑白)

PIN | # ---|--- BUSY | 4 RST | 16 DC | 17 CS | 5 CLK | 18 DIN | 23

LED (WS2812)

PIN | # ---|--- DIN | 25