制作一个由Arduino IDE驱动的学习计时器,配备0.96英寸OLED显示屏
作为一名学生,我常常难以合理分配时间来专注于某些作业。虽然我曾使用过在线计时器,但随着时间推移,几乎所有的计时器都变得令人分心,因为我不喜欢它们要显示在与我工作相同的屏幕上。
本项目旨在通过将计时器转换为一个便携的实体装置来解决这一问题。计时器被封装在一个定制的3D打印外壳中,尺寸为长3.3英寸、宽2.4英寸、高2.7英寸。为了实现明亮的显示效果,使用了一块0.96英寸的OLED屏幕来展示倒计时,并由Arduino Nano提供电源。此外,还配备了旋转编码器,使用户能够轻松设置工作或学习的时间长度。
通过这个设备,我和学生们都能提高学习效率和时间管理能力。
工作原理:
将项目插入5V USB电源后,会显示一个简短的标题界面,随后开始倒计时,时间为25分钟。
通过多次按下编码器旋钮,即可访问该项目的主要功能。
1 按键:暂停计时器
2个按钮:允许用户通过顺时针或逆时针旋转编码器来调整“分钟”数值
3个按钮:允许用户通过顺时针或逆时针旋转编码器来调整“第二”数值
4 次按键:提示用户是否要返回倒计时
5 次按压:恢复计时器
倒计时结束后,将显示“学习时间结束!”并自动暂停计时器。
名称原因:
该项目的名称灵感来源于番茄工作法,这是一种时间管理策略,包括25分钟的工作时段,之间间隔5分钟的休息。
第一步:编写定时器代码
1.1:时间设置机制
我首先开始项目,编写了在OLED屏幕上显示对象所需的程序。由于屏幕分辨率的原因,我决定使用OLED屏幕而不是LCD。
然后我编写了代码,用于响应用户转动并按下编码器旋钮。
由于我将编码器旋钮用作按钮,因此决定开发一个消除按钮弹跳的系统。通过使用 millis() 函数,将按钮按下响应分为 50 毫秒的间隔进行处理。有关 millis() 的更多详细信息将在项目后续部分列出。
此后,我重新设计了程序结构,将编码器逻辑拆分为多个中断。其中两个中断——minuteTurnSensing() 和 secondTurnSensing()——通过一系列简单的 if 语句来实现操作。
第一句话比较了变量 "currentStateClick" 和 "lastStateClick" 的状态。由于 "currentStateClick" 总是在 "lastStateClick" 之前从 "CLK" 中获取新值进行更新,因此按钮始终处于响应状态。
第二条语句将“DT”的值与“currentStateClick”进行比较。这行代码使程序能够记录编码器旋钮的旋转方向。
1.2:设置定时器
我设计的倒计时屏幕布局类似于标准的数字秒表。在编程过程中,我发现0.96英寸的OLED屏幕每行只能显示10个字符。因此,项目中的所有文字都非常简洁。
1.3 计时倒计时机制
此时,我开始研究创建倒计时功能的方法。由于程序的多个部分需要以不同速率进行轮询,我决定使用 millis() 来设定一个“节拍”,使函数能够持续按此节奏运行。
millis() 是 Arduino 中的一个函数,用于计算程序初始化以来经过的毫秒数。
由于倒计时机制必须每秒运行一次,因此递减计时器的函数需要每隔1000毫秒进行一次调用。它通过将 millis() 与一个名为“previousCountdownMillis”的自定义变量进行比较来实现这一功能。
程序开始时,"previousCountdownMillis" 初始值为 0。重要的是,在 "millis()" 与 "previousCountdownMillis" 的差值达到 1000 毫秒之前,该值不会被更新以匹配 millis() 的时间。
通过这种方法,定时器递减的代码可以精确地每秒运行一次,而无需延迟整个while循环。更进一步,该系统可应用于并定制到代码中任何需要以特定间隔运行的部分,例如检测按钮按下事件。
第二步:构建3D模型
2.1:测量与建模
为了使项目便于携带,我努力将它的外壳设计得非常紧凑。
最初计划的尺寸与普通电脑鼠标相当,但在移除小型面包板后进一步缩小。在当前的设计中,该项目仅使用了1块迷你面包板。
该设计还包括多个结构,用于固定微电子元件。
在3D模型的前面,我加了一个凹槽,用于固定OLED屏幕。计时器的“顶部”厚度仅为0.18英寸,以便将编码器螺栓固定到上面。
打印时,将模型的OLED屏幕一侧朝上,模型背面放置在打印床上。
打印材料可以是任何颜色或线材,我使用了黑色PLA。
第三步:组装计时器
组装前:
•收集Arduino Nano、OLED屏幕、编码器和一块小型面包板。
•收集9根4英寸的公母跳线。
•将编码器旋钮从编码器上取下。
1:将编码器对准面包板。确保编码器左侧有2个触点未连接,右侧有3个触点未连接。
2:将一根跳线连接到编码器的GND引脚上,将跳线的公头端插入微控制器GND引脚正对面的接触点。对连接5V和+号引脚的跳线重复此操作。
3:将跳线从SW引脚连接到D4引脚旁的孔。然后,将导线从DT引脚连接到D3引脚。接着,将导线从CLK引脚连接到D2引脚。
4:将跳线连接到OLED的GND引脚,然后将其连接到编码器GND引脚正对面的接触点。重复此操作,用第二根跳线将OLED的VCC引脚连接到编码器5V引脚正对面的接触点。
5:将跳线连接在OLED的SCL引脚与微控制器A5引脚旁的接点之间。同样,将跳线连接在OLED的SDA引脚与A4引脚旁的接点之间。
6:准备3D打印件,清除外壳和盖子的边缘毛刺。支架可能会出现在OLED凹槽孔内以及编码器旋钮盖内部,这些部分必须移除。
7:将编码器插入模型天花板上的孔中。使编码器的导线朝向机箱的左侧墙壁,然后使用M7六角螺母将其拧紧固定。
8:将OLED屏幕放入凹槽中。
9:将微控制器滑入机箱,确保USB接口朝向机箱侧面的孔洞。然后将USB线插入接口,并将盖子滑入机箱侧边的凹槽中。
10:将编码器旋钮安装到轴上,然后将盖子盖在旋钮顶部。
本文编译自hackster.io





