Kura DayChomp:把一天变成吃豆人的 24 小时时间线

基于 ESP32-C6 的吃豆人风格每日进度时钟:时间不再只是数字,而是一条会被慢慢吃掉的轨道。

项目源码:liuhao192/kura-daychomp

Kura DayChomp 是一套运行在 Waveshare ESP32-C6-LCD-1.47 上的小型桌面时钟。它把一天压缩成 24 颗豆子,让吃豆人随着当天进度从左向右移动;已经过去的小时会变暗,前方剩余的豆子和终点幽灵则提醒我:今天还有多少时间可以使用。

1. 最终显示的信息

320 × 172 的横屏界面同时展示:

  • 当前时间,使用 HH:MM 的 24 小时格式;
  • 日期与英文星期;
  • 当天已经过去的百分比;
  • 距离零点还剩多少小时和分钟;
  • 由 24 颗豆子、吃豆人和幽灵组成的进度轨道;
  • 当前设备的局域网 IP 地址。

整个画面采用深蓝黑色街机风格:吃豆人和主要时间使用黄色,幽灵使用青色,轨道和辅助信息降低亮度。信息很多,但视觉焦点仍然落在时间与吃豆人身上。

2. 硬件与依赖

项目配置
开发板Waveshare ESP32-C6-LCD-1.47
芯片ESP32-C6FH4
Flash4 MB
屏幕ST7789,172 × 320,横屏显示为 320 × 172
开发环境Arduino IDE 2.x 或 Arduino CLI
图形库LovyanGFX
时间同步Wi-Fi + NTP
默认时区中国标准时间 UTC+8

项目使用 LovyanGFX 驱动 ST7789,并通过内存 Sprite 完成整帧绘制后一次推送到屏幕,减少动画刷新时的闪烁。

3. 一天如何变成吃豆人轨道

核心计算非常直接:先把当前时、分、秒换算成今天已经经过的秒数,再除以一天的 86400 秒。

float progress =
    (hour * 3600.0f + minute * 60.0f + second) / 86400.0f;

吃豆人在轨道上的横坐标由 progress 决定;24 颗豆子分别代表一天中的 24 个小时。位于吃豆人身后的豆子会缩小并变暗,前面的豆子保持明亮。

const int pacX = trackLeft + static_cast<int>(progress * trackWidth);
uint16_t color = dotProgress < progress ? COLOR_ELAPSED : COLOR_PELLET;

界面还会计算当天剩余秒数,并显示为 xxh xxm left。因此同一条轨道既表达“已经走了多少”,也表达“还剩多少”。

4. 轻量的街机动画

吃豆人使用圆形、三角形和线条直接绘制,不依赖图片资源。程序每 250 ms 切换一次嘴巴的开合状态,既保留街机角色的生命力,又不会让小屏幕显得过于躁动。

幽灵固定在轨道终点附近。它不是需要躲避的敌人,更像一天结束的位置标记。

5. 首次 Wi-Fi 配置

源码中没有写死 Wi-Fi 名称或密码。第一次开机或连接失败时,设备会创建一个名为 KURA-CLOCK-xxxxxx 的临时无线网络,并进入配网模式:

  1. 使用手机或电脑连接 KURA-CLOCK-xxxxxx
  2. 等待配网页面自动弹出;
  3. 如果没有弹出,在浏览器访问 http://192.168.4.1
  4. 选择 2.4 GHz Wi-Fi,输入密码并保存。

网络信息只会写入 ESP32 的 Preferences/NVS,不会编译进固件,也不会提交到 GitHub。需要重新配网时,按住 BOOT 键并按下 RESET,即可清除已保存的配置。

6. NTP 校时与中国时区

连接 Wi-Fi 后,程序依次尝试阿里云 NTP 与公共 NTP 服务:

configTzTime("CST-8",
             "ntp.aliyun.com",
             "ntp1.aliyun.com",
             "pool.ntp.org");

POSIX 时区字符串中的负号代表东区,所以 CST-8 对应中国标准时间 UTC+8。同步成功前,屏幕显示 --:--,不会把未初始化的时间当成真实结果。

7. 编译与烧录

安装 ESP32 Arduino Core 3.x 和 LovyanGFX 后,打开 PacmanDayClock/PacmanDayClock.ino,开发板选择 ESP32C6 Dev Module。也可以使用 Arduino CLI:

arduino-cli compile --fqbn esp32:esp32:esp32c6 PacmanDayClock
arduino-cli upload -p /dev/cu.usbmodemXXXX \
  --fqbn esp32:esp32:esp32c6 PacmanDayClock

串口名称需要根据自己的电脑修改。烧录完成后,设备会自动尝试连接已保存的网络;没有配置时则显示配网提示。

8. 实机效果

下面是 Kura DayChomp 在 ESP32-C6-LCD-1.47 上的实际运行效果。横屏布局将时间、日期、联网状态、24 小时进度轨道和剩余时间集中在一块 1.47 英寸屏幕中。

Kura DayChomp 手持运行效果

手持测试:吃豆人沿着当天的 24 小时时间线前进。

Kura DayChomp 固定使用效果

固定使用:接通 USB 供电后,可作为桌面上的常驻时间显示。

9. 项目地址

完整源码、中英文说明和配网步骤已经发布在 GitHub:

Kura DayChomp · GitHub

这个项目不追求复杂功能,只想用一个熟悉的游戏角色,让一天的流逝变得直观一点。每吃掉一颗豆子,都是今天已经走过的一小段路。