Show HN: 基于 ESP32 和电子墨水屏的实体 Pomodoro 计时器
Rukenshia/pomodoro
这是一个基于 ESP32 的 Pomodoro 计时器的代码仓库。它使用电子墨水屏(ePaper display)显示,并使用旋转拨盘进行输入。仓库中的代码不包含所有必需的资源和字体,所以不是开箱即用。但是,您可以根据自己的需求修改和适配代码。
零件清单
- ESP32 (我使用的是 AZDelivery ESP32 NodeMCU)
- WaveShare 4.26 英寸电子墨水屏 HAT, 800x480 (链接)
- KY-040 旋转编码器,带按钮
- 一个 WS2812 LED (可以用简单的 RGB LED 替换)
- 一个 USB-C 连接器 (比如 这个)
- 3D 打印外壳 (
onshape文件) - 一些电阻和 0.1uF 电容
项目缘起
我喜欢尝试各种提高效率的技巧 - 有人说,追求优化效率本身就是一种终极拖延方法,也许这就是我做这个项目的动力。我也有一个习惯,每年花一个月左右的业余时间做一个对别人有益的项目。去年,我买了一台 3D 打印机 (BambuLab X1C),想好好利用它。在转行成为软件工程师之前,我完成了电子工程师的学徒生涯,所以我也想回归本源,做一些实实在在的东西。我的朋友有时在时间管理方面遇到困难 - 需要组织的任务很多,但注意力却很分散。所以我想到:为什么不给他们做一个 Pomodoro 计时器呢? 因此,我设定了几个目标:
- 它应该是一个物理设备
- 它应该 有趣
- 它应该易于使用
市面上有一些很酷的项目 (可以说比这个酷得多,例如 Salim Benbouziyane 的 Focus Dial),但我还是想从头开始构建一些东西。而且我从来没有用过电子墨水屏,觉得它很适合需要长时间待机并且不需要背光的应用。
为什么选择这些零件?
这是我很久以来第二次用微控制器构建东西。我对 ESP32 足够熟悉,可以放心地再次投入,所以这是主要选择。我之前做了一些研究,看看支持哪些类型的显示器。
电子墨水屏 (ePaper Display)
我需要某种显示器,或者至少我 想要 某种显示器。这个项目的主要动机之一是它应该不妨碍你的工作 - 直到你完成当前的专注时间并继续前进。对我来说,这意味着我想要一个没有任何背光的显示器。
显示器也应该足够大,你可以把整个设备放在桌子上的某个地方,并且仍然能够阅读它。在订购并试用了几个 WaveShare 电子墨水屏显示器之后,我最终选择了 4.26 英寸的型号,原因如下:
- 出色的分辨率 (对于“业余”显示器来说,这似乎很难找到)
- 尺寸感觉合适
- 该显示器支持局部刷新 (0.3 秒,刷新时不会出现分散注意力的“黑白闪烁”)
最初,我真的很想使用黑色/白色/红色显示器,并且找到了一个我喜欢的,但是刷新时间长达 16 秒,并且不支持局部刷新,这对我来说是一个致命的缺点。
最终的附加功能:它在晚上不起作用。如果你的桌子不够亮,你就无法阅读显示屏。这是一个功能,而不是一个 bug。外面太黑了吗?别再工作了!
旋转编码器 (Rotary Encoder)
从一开始,我就知道我想要某种拨盘作为输入 - 这对我来说最有意义。这需要更多的复杂性才能设计菜单,并且您需要确保正确地消除输入的抖动。我还向 CLK 和 DT 引脚添加了 .1uF 电容,以帮助平滑信号。
LED
在前几个迭代中,没有 LED 的计划。我拥有一个没有背光的显示器的天才计划的代价是:当您当前的专注时间结束时,它可能 太 不明显了。我尝试了一些不同的想法:
- 蜂鸣器:这只会让你跳起来。真是糟糕的体验
- 扬声器:我不知道为什么,但扬声器感觉 很困难。我尝试的设置会产生很多噪音和呜呜声,但我将此归咎于技能问题
- LED:我有一些 WS2812 LED,觉得它们可能很合适。您可以使用 NeoPixel 库为它们设置动画,并且它们非常易于使用。不需要提交更多输出引脚的额外好处也是一个很大的优势
LED 最终工作得很好,让我可以显示不同的状态。它可能很微妙,但我也在外壳上添加了一个小小的外罩,并在 LED 前面添加了一个扩散层,以使其看起来更好。
构建外壳
外壳分为两部分:底座和盖子。我做出的一个不幸的设计选择是,显示器框架作为底座的一部分整体打印,因此顶部边缘在打印过程中会有点翘曲。由于 CAD (或产品设计) 不是我的强项,因此肯定会有更好的选择来设计它以获得更好的最终外观。
我希望我早点学到的一件事是,将拨盘放在前面可能不是最好的主意:因为打印件和电子设备非常轻巧,所以按下拨盘上的开关往往只会使整个设备向后滑动。幸运的是,我可以通过在表壳底部添加一些橡胶脚和重量 (通常用于平衡轮胎的那些) 来解决此问题。这很有效,我对它的结果感到满意。
软件
该软件是用 C++ 编写的,并使用 Arduino 框架。我使用 PlatformIO 来管理该项目 (至少这似乎是一个流行的选择,但我现在不确定了)。该项目严重依赖于 GxEPD2 库进行显示。我不会说谎,这个存储库中的代码有点混乱 - 我必须及时完成任务,这导致了很多复制粘贴,并且没有重新审视代码的早期部分。某些部分是由 AI (主要是 Claude) 生成的,以帮助我在设定的截止日期内完成该项目。
由于这是一个为我的朋友准备的项目,因此我也想包含一些彩蛋和乐趣。您可能认为在 应该集中精力时 添加一些随机事实将是一个坏主意,但我认为这是一个有趣的小补充。
使用设备
设备启动时,您可以更改一些设置或进入预设选择模式。从那里,您可以选择三个预设之一:
然后,计时器将启动,并在时间结束后通知您 (通过闪烁 LED 并在屏幕上显示一条消息)。您可以继续工作 (不建议这样做,但如果您想完成某些工作,这是必要的),然后开始休息。
在暂停期间,您可以查看一些统计信息。每隔几个迭代 (默认情况下为 4 个),您的暂停时间会更长,以便您有时间恢复。
开发
引脚映射
旋转编码器 (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




