一、项目介绍
番茄时钟,也称为番茄工作法,是一种简单易行的时间管理方法,通过将工作时间划分为25分钟的工作段和5分钟的休息时间来提高专注力和效率。
番茄时钟是一种基于番茄工作法的时间管理工具,旨在帮助用户通过设定工作时间和休息时间来提高专注力和工作效率。最近老师反馈儿子在学校的专注力差,建议有针对性地训练他的专注力。为避免手机使用,而手上已有的一个计时器只支持计时功能。因而盟生了设计并制作一款番茄时钟的想法,故有了本项目。
1.1 硬件介绍
- ESP32-C3-MINI-1U 是通用型 Wi-Fi 和低功耗蓝牙 (Bluetooth LE) 模组,体积小,具有丰富的外设接口,可用于智能家居、工业自动化、医疗保健、消费电子产品等领域。采用 U.FL 座子连接外部 IPEX 天线,配置了 4 MB SPI flash。ESP32-C3-MINI-1U 采用的是 ESP32-C3FN4 芯片。ESP32-C3FN4 芯片搭载 32-bit RISC-V 单核处理器,工作频率高达 160 MHz。
- TC4054 是恒流/恒压座充充电器芯片,主要应用于单节锂电池充电。无需外接检测电阻,其内部为 MOSFET 结构,因此无需外接反向二极管。在大功率和高环境温度下可以调节充电电流以限制芯片温度。它的充电电压固定在 4.2V,充电电流可以通过外置一个电阻器进行调节。
- NeoPixel LED(也被称为WS2812或WS2811)是一种流行的可编程RGB(红-绿-蓝)LED,其独特之处在于它集成了自己的驱动芯片和控制电路,使得单个数据线上可以控制多个LED。这种类型的LED广泛应用于各种装饰、艺术装置、动态照明和其他创意项目中。
1.2 功能概览
定时功能: 实现25分钟工作模式和5分钟休息模式的转换。
时间显示: 在TFT屏幕实时显示剩余时间。
按键操作: 用户可通过按键开始/暂停/重置番茄时钟。
即时提醒: 辅助蜂鸣器在时间结束时发出提示音。
低功耗管理: 通过ESP32的深度睡眠功能延长设备待机时间。
接入智能家居:通过接入智能家居平台,可以使用番茄时钟的远程同步与控制功能。
1.3 设计思路
项目的设计思路基于番茄工作法,将硬件资源充分利用,通过ESP32-C3实时控制显示和蜂鸣器提示,提升用户体验。主要包括以下几个方面:
- 模块化设计:将系统分为多个独立的模块,如时间设置模块、显示模块、声音提示模块等,便于开发和维护。
- 用户友好性:通过简洁的用户界面和易于操作的按钮,使用户可以方便地设置和调整时间。
- 低功耗设计:通过合理的电源管理和低功耗模式,延长设备的续航时间。
结合Wi-Fi/BLE的特性,已实现云端同步提醒功能与接入智能家居实现数据同步与远程控制。
二、功能实现
2.1 硬件设计
- 如以上系统框图所示,硬件部分以 ESP32-C3 为主控芯片,搭载锂电池充放电电路、LCD显示驱动电路、按键电路、氛围灯以及蜂鸣器驱动电路组成。
- 锂电池充放电电路用于锂电池充放电管理,确保电池在安全范围内运行、预防过充过放、延长电池寿命。
- LCD显示驱动电路用于展示番茄时钟的各种状态,以及番茄时钟的配置等。由于本设计存在问题,无法正常驱动LCD进行UI显示。因此,UI的展示功能全部由智能家居平台来完成。
- 用户可通过按键电路来调整番茄时钟配置,开始、暂停或结束当前番茄时钟或休息时间。是本项目的人机交互控制部分。
- 氛围灯可使用户在没有UI展示的情况下,直观地知道当前番茄时钟的状态。例如:氛围灯熄灭表示当前番茄时钟是停止或暂停状态,氛围灯显示番茄红色时表示当前已启动了一个番茄时钟。
- 蜂鸣器则从听觉的角度来提示用户番茄时钟的工作情况。例如:番茄时钟开始或暂停时发出两次短蜂鸣声。番茄时钟或休息时间结束时发出渐变的几次蜂鸣器声。
2.2 软件功能实现
原本计划使用 Arduino + LVGL 进行软件开发,打板回来后进行软件功能测试。结果无法驱动 LCD显示屏。开始以为是显示屏型号的原因,后面更换屏幕之后,重新打板回来测试问题依旧。这时时间已经过了10月中旬,距离结束日期只有十天左右了。因此,不得不放弃原来的方案,采用 ESPHome + Home Assistant 完成固件开发与远程控制。好在调整后的软件方案实现的成品效果还不错。
Home Assistant 是一款在 Python 3 上运行的家庭自动化平台。能够跟踪和控制家庭中的所有设备,并提供自动化控制平台。有一个简单的、适合移动设备的界面来控制你的所有设备,且不会将任何数据存储在云端,以保护个人隐私。
ESPHome 是一个通过简单而强大的配置文件控制您的 ESP8266/ESP32 的系统,并通过家庭自动化系统远程控制它们。
2.3 关键代码及说明
本制作由于使用的 ESPHome 作为固件的开发,因此都是通过配置文件的形式对固件进行配置相应的功能。以下是关键部分说明:
2.3.1 网络配置
网络配置时如果默认的DNS连不上,需要设置静态IP。否则在 HomeAssistant 中该设置一直是离线状态。
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.2.151
gateway: 192.168.2.1
subnet: 255.255.255.0
2.3.2 按键监听
为了使设备上的物理按键和智能家居平台上的虚拟按键实现联动,这里使用了二进制传感器这个组件来实现。当传感器检测到为按键按下时,调用 Button 组件的按键动作来实现功能联动。也因此使得物理按键和虚拟按键可以任意使用。
# 二进制传感器
binary_sensor:
# 拔轮中键
- platform: gpio
pin:
number: GPIO21
mode:
input: true
pullup: true
name: "拔轮中键 ok"
filters:
- delayed_on: 10ms
- delayed_off: 10ms
on_press:
then:
- button.press: start_pause
# BOOT键(结束当前番茄钟)
- platform: gpio
pin:
number: GPIO9
mode:
input: true
pullup: true
name: "BOOT键"
filters:
- delayed_on: 10ms
- delayed_off: 10ms
on_press:
then:
- button.press: pomodoro_finish_btn
2.3.3 氛围灯
由于 TFT-LCD显示屏 无法正常驱动,因此这里使用氛围灯显示不同和颜色来表示当前番茄时钟的状态。番茄红色表示当前番茄时钟正在运行,当番茄钟停止或暂停时氛围灯熄灭。青绿色调表示当前番茄时钟短休息正在运行,而蓝绿色调表示当前番茄时钟长休息正在运行。总之,番茄时钟运行时(倒计时)氛围灯点亮,停止或暂停时氛围灯熄灭。
# 氛围灯
light:
- platform: esp32_rmt_led_strip
id: ws2812
name: "WS2812"
rgb_order: GRB
pin: GPIO2
num_leds: 1
rmt_channel: 0
chipset: ws2812
2.3.4 番茄时钟状态同步
番茄时钟状态信息是在设备本地内存中的,为了能将番茄时钟的状态同步到智能家居平台。这里使用了三个文本传感器来同步番茄时钟的状态信息。有了这些信息后智能家居平台就可以同步显示番茄时钟的状态信息。注意:为了在实时性与功耗方面的平衡,这里使用了每1秒上报番茄时钟的状态信息。
# 文本传感器
text_sensor:
# 当前番茄时钟状态
- platform: template
id: pomodoro_state_sersor
name: "番茄时钟 Pomodoro"
lambda: |-
switch(id(pomodoro_state)) {
case 0:
return {"番茄时钟"};
case 1:
return {"短休息"};
case 2:
return {"长休息"};
default:
return {"番茄时钟"};
}
update_interval: 1s
# 当前番茄时钟启动状态
- platform: template
id: pomodoro_start_state_sersor
name: "番茄时钟启动状态 Pomodoro State"
lambda: |-
switch(id(pomodoro_start_state)) {
case 0:
return {"开始"};
case 1:
return {"暂停"};
case 2:
return {"开始"};
default:
return {"停止"};
}
update_interval: 1s
# 当前番茄时钟时间,格式(mm:ss)
- platform: template
id: pomodoro_sersor
name: "番茄时钟时间 Pomodoro Timer"
lambda: |-
char buf[6];
sprintf(buf, "%02d:%02d", id(pomodoro_time_seconds) / 60, id(pomodoro_time_seconds) % 60);
return ((std::string) buf);
update_interval: 1s
2.3.5 番茄时钟配置
默认情况下,番茄时钟的时长通常为 25分钟,短休息时长为 5分钟,长休息时长为 15分钟。当然这些也因人而异,为了方便对番茄时钟的时长进行配置,这里使用了四个 Number 组件来实现。四个组件分别为 番茄时钟时长、短休息时长、长休息时长和氛围灯亮度设置。用户可以根据自身情况对其进行灵活控制。以下为四个配置组件的功能实现。
# 滑动控制组件
number:
# 番茄时钟时长
- platform: template
id: pomodoro_seconds
name: "番茄时钟时长 Pomodoro Duration"
icon: mdi:clock-fast
entity_category: config
optimistic: true
min_value: 1
max_value: 100
restore_value: true
initial_value: 25
step: 1
unit_of_measurement: "分"
# 短休息时长
- platform: template
id: short_break_seconds
name: "短休息时长 Short Break Duration"
icon: mdi:clock-fast
entity_category: config
optimistic: true
min_value: 1
max_value: 20
restore_value: true
initial_value: 5
step: 1
unit_of_measurement: "分"
# 番茄时钟时长
- platform: template
id: long_break_seconds
name: "长休息时长 Long Break Duration"
icon: mdi:clock-fast
entity_category: config
optimistic: true
min_value: 1
max_value: 50
restore_value: true
initial_value: 15
step: 1
unit_of_measurement: "分"
# 氛围灯亮度
- platform: template
id: ws2812_brightness
name: "氛围灯亮度 ws2812 brightness"
entity_category: config
optimistic: true
min_value: 0
max_value: 100
restore_value: true
initial_value: 60
step: 1
unit_of_measurement: "%"
2.3.6 音效
番茄时钟开始、暂停或结束时,会发出相应的提示音。为了方便地定制提示音效,这里使用了 rtttl 组件来实现。Ring Tone Text Transfer Language (RTTL) 是一种用于描述电话铃声的文本语言。它使用简单的文本命令来表示不同的音调和节奏,从而可以生成各种电话铃声。RTTL 主要用于编程和自定义手机铃声,用户可以通过编写 RTTL 脚本来创建自己独特的铃声。只需简单地使用 rtttl.play: 'two_short:d=4,o=5,b=100:16e6,16e6'
即可实现驱动蜂鸣器发出音效。
# 输出
output:
# 蜂鸣器输出
- platform: ledc
pin: GPIO7
id: buzzer
# 蜂鸣器
rtttl:
output: buzzer
id: my_rtttl
gain: 0.6
2.3.7 倒计时
当番茄时钟启动后,需要进行倒计时。这里我简单地使用了 time 组件的 on_time
事件来实现。每当事件触发时,只需要简单地判断一下番茄时钟的运行状态为启动时,自减当前番茄时钟秒数即可,由于番茄时钟时长的状态值也是每秒上报的,因此这里不需要做额外的处理。只需要判断一下番茄时钟时长清零时完成当前番茄时钟即可。
time:
- platform: homeassistant
on_time:
- seconds: /1
then:
- lambda: |-
if (1 == id(pomodoro_start_state)) {
id(pomodoro_time_seconds) --;
if(0 >= id(pomodoro_time_seconds)) { // 当前番茄时钟执行结束
id(pomodoro_finish_btn).press();
}
}
2.3.8 番茄时钟UI
智能家居平台(HA)自带的卡片组件无法满足番茄时钟的卡片定制,为了更优雅美观地实现番茄时钟的UI展示。这里使用了 button-card 这个卡片组件来实现番茄时钟的卡片定制。以下为番茄时钟UI卡片的定制代码实现:
type: custom:button-card
color_type: icon
entity: sensor.pomodoro_timer_pomodoro
label: |
[[[
return states['sensor.pomodoro_timer_pomodoro_timer'].state;
]]]
show_icon: false
show_state: true
show_name: false
show_label: true
styles:
styles: null
card:
- width: 600px
- height: 400px
label:
- font-size: 200px
- color: white
state:
- justify-self: start
- margin-left: 30px
- font-size: 50px
grid:
- grid-template-areas: '"s i" "l i" "start_stop i"'
- grid-template-rows: min-content 1fr min-content min-content
- grid-template-columns: 1fr
custom_fields:
start_stop:
- color: white
- font-size: 40px
- border: 1px solid white
- border-radius: 10px
- width: 120px
- margin: 0 auto;
state:
- value: 番茄时钟
styles:
card:
- background-color: rgb(186, 73, 73)
state:
- color: white
- value: 短休息
styles:
card:
- background-color: rgb(56, 133, 138)
state:
- color: white
- value: 长休息
styles:
card:
- background-color: rgb(57, 112, 151)
state:
- color: white
custom_fields:
start_stop: |
[[[
return `<span>${states['sensor.pomodoro_timer_pomodoro_state'].state}</span>`
]]]
tap_action:
action: toggle
entity: button.pomodoro_timer_start_pause
三、功能展示
硬件展示
由于显示屏无法驱动,因此最终成品没有安装显示屏,下图为装上外壳后的效果图:
UI展示
番茄时钟启动
短休息
每个番茄时钟结束后,获得一次短休息时间,默认时长为 5分钟。可根据自身情况灵活配置。以下为短休息卡片效果图:
长休息
每四个番茄时钟结束后,获得一次长休息时间,默认时长为 15分钟。可根据自身情况灵活配置。以下为长休息卡片效果图:
番茄时钟配置
通过智能家居控制面板的徽章图标来调整番茄时钟配置项,可通过滑动条来调整番茄时钟、短休息、长休息、氛围灯亮度的配置项。下图为番茄时钟时长的配置调整界面截图:
四、总结
本项目成功实现了一个基于ESP32-C3微控制器的一款简洁、高效的番茄时钟装置。通过合理的硬件选择和精心的软件设计,实现了计时、显示、触控操作以及提示功能。通过模块化设计和低功耗设计,特别是低功耗设计,显著延长了设备的待机时间。未来还可以考虑增加更多功能,如更多的用户交互方式、更丰富的数据显示、数据统计等,以进一步提升用户体验。
遇到的问题
- TFT_LCD 无法驱动,经过两次打样。使用淘宝上购买的TFT-LCD屏幕均无法正常驱动。由于本人硬件调试功底缺乏,无法准确定位问题原因。因此,只能采用集成到智能家居平台的方案,利用智能家居平台的UI来实番茄时钟的展示。最终的成品效果其实也有一点惊喜的,原本设计是做成一个小计时器的,这样一来做成了可远程同步控制的计时器。不过如果屏幕能正常驱动效果将会更好。
- 设计时使用了
5
个按键。一个 BOOT 键,一个 RESET 键,一个拔轮开关(左、右、中)三个按键。再加上氛围灯、蜂鸣器、LCD显示屏,电池电压采集。导致 ESP32-C3的 GPIO 口有点不够用,最终将 UART0 的两个引用也加上刚刚好用完所有 GPIO 口。
心得体会
通过此次活动深刻意识到硬件设计不是那么简单的事,想要完成好一个项目,就需要将项目所需的知识点都吃透。这样遇到问题就不会搞的狼狈。项目过程中出现问题不要着急,冷静地分析问题可能的原因,逐步地去验证自己的判断,暂时实在无法解决的问题也应有备用方案。从而避免项目烂尾,给自己的自信心带来负面影响。
最后,感谢硬禾学堂联合 DigiKey 推出的这次活动!此次活动带给我许多宝贵实践经验和机会,在此表示感谢!
五、参考资料
- https://www.espressif.com.cn/sites/default/files/documentation/esp32-c3-mini-1_datasheet_cn.pdf
- https://cdn-shop.adafruit.com/product-files/1655/SKC6812RV__12VOP0274E_REV.A1_EN(12).pdf
- https://www.semiee.com/file2/9160c99fc22088e0657fd36b342c1493/Source10/FM富满-TC4054T.pdf
- https://esphome.io/components/rtttl.html
- https://eddmann.com/nokia-composer-web/
- https://docs.platformio.org/en/latest/boards/espressif32/esp32-c3-devkitm-1.html
- https://github.com/custom-cards/button-card.git