尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于树莓派与Pygame的实体交互项目:打造你的专属“小憩按钮”

基于树莓派与Pygame的实体交互项目:打造你的专属“小憩按钮” 1. 项目概述什么是“The Nap Button”如果你和我一样是个经常在电脑前工作、学习或者沉迷于某个项目到忘记时间的人那你肯定对“休息一下”这件事又爱又恨。知道该休息了但手头的工作正到关键处或者游戏正打到兴头上总想着“再等五分钟”。结果就是眼睛干涩、腰酸背痛效率反而越来越低。“The Nap Button”小憩按钮这个项目就是为了解决这个痛点而生的。它的核心想法非常简单用一个实体的、触手可及的按钮来强制自己进入一段短暂的、高质量的休息时间。这不仅仅是一个软件定时器而是一个结合了硬件交互、视觉和听觉反馈的完整体验装置。当你按下这个按钮电脑屏幕会变暗播放一段舒缓的音乐或白噪音并开始一个倒计时比如20分钟。在这段时间里你被“强制”离开屏幕可以真正地闭目养神、伸展身体或者听听音乐。时间一到系统会温和地提醒你休息结束。听起来是不是比手机上的番茄钟App更有仪式感和约束力这正是实体交互的魅力所在。这个项目非常适合那些喜欢动手、希望将数字习惯与物理世界结合的创客、程序员或者任何想改善自己工作休息节奏的人。它用到的核心技术正是搜索热词里提到的Raspberry Pi树莓派、GPIO通用输入输出接口和Pygame库。通过这个项目你不仅能做出一个实用的小工具还能深入理解如何用Python控制硬件、处理事件以及创建简单的图形界面。2. 核心思路与方案选型为什么选择树莓派和这一套技术栈这里面的每一个选择都有其背后的逻辑我们拆开来看。2.1 为什么是树莓派首先我们需要一个能运行完整操作系统、连接显示器、播放音频同时又能方便地连接外部按钮和LED等元件的计算核心。树莓派几乎是满足所有这些条件的“标准答案”。完整的计算环境它本质上是一台微型电脑可以运行Linux如Raspbian/Raspberry Pi OS这意味着我们可以用熟悉的Python进行开发安装各种库如Pygame并且能轻松地处理图形显示和音频播放——这是实现屏幕变暗和播放休息音乐的基础。丰富的GPIO引脚这是树莓派相对于普通电脑最大的优势。GPIO引脚允许我们通过编程直接读取按钮的状态按下/松开和控制LED的亮灭。我们不需要额外的单片机如Arduino作为中介所有逻辑可以在一台设备上完成简化了系统和连线。极低的功耗与常开运行树莓派功耗很低可以像一个小家电一样7x24小时常开放在桌角随时待命。你总不希望每次想休息时还得先启动一台电脑吧2.2 为什么用Pygame而不是其他GUI库Pygame虽然常被用来做游戏但它其实是一个功能强大的多媒体库非常适合我们这个项目。事件驱动与硬件事件整合Pygame的主循环天然是事件驱动的。它不仅能处理鼠标、键盘事件还能通过pygame.time模块方便地管理定时器用于倒计时。更重要的是我们可以将GPIO按钮的检测逻辑无缝融入到Pygame的事件循环中。当检测到按钮按下时我们生成一个自定义的用户事件pygame.USEREVENTPygame的主循环就能像处理一次鼠标点击一样来处理这次“按钮按下”代码结构非常清晰。便捷的图形与音频功能用几行代码就能创建一个全屏窗口、填充颜色实现屏幕变暗、绘制文字显示倒计时和播放背景音乐。它提供的功能对于本项目来说既足够又简单避免了像GTK、Qt这类大型GUI库的复杂性。广泛的社区支持与文档作为经典库遇到任何问题几乎都能找到解决方案。2.3 GPIO工作模式与电路设计考量搜索热词里提到了“gpio的8种工作模式”这通常指某些微控制器如STM32的复杂配置。对于树莓派的GPIO我们最关心的是输入模式下的防抖动和上拉/下拉电阻。输入模式与上拉电阻我们将按钮连接的一个引脚设置为输入模式用于读取按钮状态。机械按钮在按下和弹起的瞬间会产生快速的、不稳定的电平跳变称为“抖动”。如果直接读取程序可能会误判为多次按下。解决方法有软件防抖在检测到变化后延时一小段时间再确认和硬件防抖通过RC电路。更简单的方法是启用内部上拉电阻。内部上拉电阻原理树莓派的GPIO可以配置为内部上拉。这意味着当引脚未被连接按钮断开时内部电路会通过一个电阻将引脚电平“拉”到高电平3.3V。当按钮按下将引脚连接到地GND时引脚电平被“拉”到低电平0V。这样我们就得到了一个稳定的默认高电平、按下为低电平的信号同时省去了外部电阻。“回读是0但实际是高电平”的排查这个搜索热词反映了一个常见坑点。可能的原因包括1引脚模式设置错误应设为输入2外部电路影响比如短路3最可能的——未启用上拉电阻引脚处于“浮空”状态。浮空引脚的电平是不确定的极易受干扰读到的值自然不可靠。所以在我们的代码中必须明确将输入引脚配置为上拉模式。基于以上分析我们的方案确定为使用树莓派作为主控通过其GPIO连接一个常开式按钮并启用内部上拉电阻。使用Python编写主程序利用RPi.GPIO库读取按钮利用Pygame库创建全屏界面、管理倒计时和播放媒体。项目结构清晰且所有组件都能在树莓派上原生运行。3. 硬件准备与电路连接动手之前我们先准备好所有“食材”。这个项目的硬件部分非常简单成本极低。3.1 所需材料清单树莓派任何型号均可推荐3B或4B性能更充裕已安装好Raspberry Pi OS系统并完成基本设置联网、更新等。微动按钮开关一个常开式的按钮推荐使用那种带帽的、手感清晰的比如12x12mm的轻触开关。这是我们的“Nap Button”本体。LED及电阻可选一个LED灯和一个220Ω或330Ω的限流电阻。用于提供状态反馈比如按下时闪烁一下或者倒计时期间常亮。这不是必须的但能大大提升体验。面包板与杜邦线用于连接电路方便测试。当然如果你追求美观后期可以焊接在一块洞洞板或定制PCB上。音箱或耳机树莓派通过3.5mm音频口或HDMI连接音响用于播放提示音和休息音乐。3.2 电路连接详解与原理图我们来连接一个最经典、最可靠的电路。这里假设我们使用树莓派的GPIO17作为按钮输入GPIO18作为LED输出如果使用。连接步骤按钮连接输入回路将按钮的一个引脚用杜邦线连接到树莓派的GPIO17物理引脚11。将按钮的另一个引脚连接到树莓派的GND接地例如物理引脚6或9等。关键点我们不需要在GPIO17和3.3V之间连接外部上拉电阻因为我们将通过软件启用内部上拉。所以按钮直接连接在GPIO和GND之间即可。当按钮未按下时GPIO17因内部上拉为高电平3.3V按下时GPIO17直接连接到GND变为低电平0V。LED连接输出回路可选重要LED必须串联限流电阻否则会烧毁将LED的正极长脚通过一个220Ω电阻连接到树莓派的GPIO18物理引脚12。将LED的负极短脚连接到树莓派的GND。这样当我们在程序中将GPIO18设置为高电平时电流从GPIO18流出经过电阻和LED到GNDLED点亮。设置为低电平时LED熄灭。注意务必确认你的树莓派引脚编号。我们这里使用的是BCM编号GPIO17, GPIO18而不是物理引脚编号。在代码中我们将使用BCM编号系统。连接前最好查阅一下树莓派的GPIO引脚图。电路逻辑这个设计利用了内部上拉电阻构成了一个简洁可靠的输入检测电路。对于输出则是标准的数字输出驱动LED电路。整个硬件部分没有复杂元件非常适合初学者理解和搭建。4. 软件环境配置与依赖安装硬件搭好了现在来准备软件的“土壤”。我们将在树莓派上创建一个独立的Python环境来运行项目避免污染系统级的Python包。4.1 创建并使用Python虚拟环境虚拟环境virtualenv是一个独立的Python工作空间可以让你为每个项目安装特定版本的库而不会相互冲突。这是Python开发的最佳实践。# 1. 首先更新系统包列表并安装python3-venv工具如果尚未安装 sudo apt update sudo apt install python3-venv -y # 2. 为我们的项目创建一个目录并进入 mkdir ~/nap_button_project cd ~/nap_button_project # 3. 创建一个名为‘venv’的虚拟环境 python3 -m venv venv # 4. 激活虚拟环境 source venv/bin/activate激活后你的命令行提示符前通常会显示(venv)表示你正在这个虚拟环境中工作。之后所有的pip安装操作都请确保在虚拟环境激活的状态下进行这样包才会安装到./venv目录下而不是系统目录。4.2 安装核心Python库我们需要两个核心库RPi.GPIO用于控制硬件Pygame用于创建应用。# 确保在虚拟环境 (venv) 中 # 安装RPi.GPIO这是访问树莓派GPIO的标准库 pip3 install RPi.GPIO # 安装Pygame。由于它有一些系统依赖最好用apt先安装一些包再用pip安装 sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev -y sudo apt install libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev -y sudo apt install libfreetype6-dev -y # 现在用pip安装pygame pip3 install pygame安装完成后你可以通过python3 -c import RPi.GPIO; import pygame; print(All imports successful)来快速测试是否安装成功。实操心得在树莓派上从pip编译安装Pygame有时会比较慢也可能遇到依赖问题。如果pip install pygame失败可以尝试先使用sudo apt install python3-pygame安装系统版本的pygame但版本可能较旧。对于本项目只要基础功能正常版本差异影响不大。优先保证RPi.GPIO能正确导入。5. 核心代码实现与分步解析现在进入最核心的部分——编写“The Nap Button”的程序。我们将代码分成几个功能模块并逐一解释。5.1 初始化与引脚配置首先我们创建一个名为nap_button.py的Python文件。开头部分负责导入库、初始化设置。#!/usr/bin/env python3 The Nap Button - 主程序 一个用树莓派和Pygame实现的物理休息提醒器。 import RPi.GPIO as GPIO import pygame import time import sys from datetime import datetime, timedelta # 初始化Pygame pygame.init() pygame.mixer.init() # 初始化音频 mixer # 定义GPIO引脚 (使用BCM编号) BUTTON_PIN 17 LED_PIN 18 # 可选如果不使用LED可以设为None或注释掉相关代码 # 休息时长秒例如20分钟 1200秒 NAP_DURATION 1200 # 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM) # 设置BUTTON_PIN为输入并启用内部上拉电阻 GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_downGPIO.PUD_UP) # 设置LED_PIN为输出 if LED_PIN: GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, GPIO.LOW) # 初始状态为低电平熄灭 # 定义Pygame自定义事件 NAP_START_EVENT pygame.USEREVENT 1 NAP_END_EVENT pygame.USEREVENT 2 # 状态变量 nap_active False nap_end_time None代码解析GPIO.setmode(GPIO.BCM)这非常重要它告诉RPi.GPIO库我们使用BCM编号即GPIOxx来指代引脚而不是物理引脚序号。GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_downGPIO.PUD_UP)这是关键配置。将按钮引脚设置为输入模式并启用内部上拉电阻PUD_UP。这样引脚默认读数为高电平1当按钮按下接地时读数变为低电平0。NAP_START_EVENT和NAP_END_EVENT我们定义了两个自定义事件。当检测到按钮被按下时我们触发NAP_START_EVENT当倒计时结束时我们触发NAP_END_EVENT。这样可以将硬件检测和定时逻辑解耦都通过Pygame的主事件循环来处理代码更清晰。5.2 GPIO检测与防抖处理我们不能在主循环里简单地读取引脚电平因为机械抖动和循环速度会导致问题。我们将使用GPIO库的add_event_detect功能它在底层使用中断机制效率更高且自带防抖选项。# 在初始化部分之后添加事件检测 # 在BUTTON_PIN上添加下降沿检测从高到低即按钮按下并设置防抖时间为200毫秒 GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callbackbutton_pressed_callback, bouncetime200) def button_pressed_callback(channel): GPIO中断回调函数。当按钮被按下检测到下降沿时由系统调用。 注意此函数在中断上下文中运行应尽快返回避免耗时操作。 global nap_active # 只有在非休息状态时按下按钮才启动休息 if not nap_active: # 发送一个自定义事件到Pygame事件队列 event pygame.event.Event(NAP_START_EVENT) pygame.event.post(event) print(f[{datetime.now().strftime(%H:%M:%S)}] Button pressed. Nap sequence initiated.)代码解析GPIO.add_event_detect(...)这行代码设置了一个后台监听。当BUTTON_PIN上发生下降沿FALLING事件即电平从高变低对应按钮按下动作时会自动调用button_pressed_callback函数。参数bouncetime200设置了200毫秒的防抖时间意味着在第一次触发后的200毫秒内忽略其他的边沿变化有效滤除抖动。回调函数原则button_pressed_callback函数运行在一个“中断”上下文中它应该尽快执行完毕。因此我们不在这里直接开始复杂的休息流程比如初始化Pygame屏幕、播放音乐而是仅仅向Pygame的主事件队列post一个自定义事件。所有耗时的、涉及Pygame的操作都留给主循环去处理。这是一种非常优雅的线程间或进程/事件循环间通信方式。5.3 Pygame主循环与状态管理这是程序的大脑负责处理所有事件、更新状态和渲染界面。def main(): global nap_active, nap_end_time # 创建Pygame窗口这里我们先设置为一个非常小的窗口因为主要用全屏 # 实际全屏将在开始休息时切换 screen pygame.display.set_mode((100, 100), pygame.NOFRAME) pygame.display.set_caption(The Nap Button - Waiting...) clock pygame.time.Clock() # 加载音效和音乐请将文件放在项目目录下 try: button_sound pygame.mixer.Sound(button_click.wav) # 按钮按下音效 alarm_sound pygame.mixer.Sound(alarm_gentle.wav) # 休息结束提示音 background_music calm_music.mp3 # 背景音乐 except FileNotFoundError as e: print(f警告音频文件缺失 - {e}. 将继续运行但无声音。) button_sound alarm_sound None background_music None # 定义字体 font_large pygame.font.SysFont(None, 120) font_small pygame.font.SysFont(None, 48) running True while running: current_time time.time() # 1. 处理事件队列 for event in pygame.event.get(): if event.type pygame.QUIT: running False elif event.type pygame.KEYDOWN: if event.key pygame.K_ESCAPE: # 按ESC键退出程序 running False elif event.key pygame.K_f: # 按F键手动触发测试用 if not nap_active: test_event pygame.event.Event(NAP_START_EVENT) pygame.event.post(test_event) # 处理我们的自定义事件 elif event.type NAP_START_EVENT: start_nap(screen, background_music, button_sound) elif event.type NAP_END_EVENT: end_nap(screen, alarm_sound) # 2. 状态更新与倒计时计算 if nap_active and nap_end_time: time_left nap_end_time - current_time if time_left 0: # 时间到发送结束事件 end_event pygame.event.Event(NAP_END_EVENT) pygame.event.post(end_event) else: # 更新显示在休息状态下我们在 draw 函数里处理 pass # 3. 绘制界面 draw(screen, font_large, font_small, current_time) # 4. 控制帧率 clock.tick(30) # 30 FPS足够 # 退出前清理 cleanup() if __name__ __main__: try: main() except KeyboardInterrupt: print(\n程序被用户中断。) finally: cleanup()主循环逻辑事件处理循环检查Pygame事件队列。包括系统事件退出、按键、以及我们自定义的NAP_START_EVENT和NAP_END_EVENT。状态更新如果休息状态nap_active为真则计算剩余时间。如果时间到就发送一个NAP_END_EVENT事件让事件处理逻辑来优雅地结束休息而不是直接在这里处理。绘制调用draw函数根据当前状态是否在休息绘制不同的界面。帧率控制clock.tick(30)确保循环每秒大约运行30次避免CPU占用率100%。5.4 休息开始与结束的核心函数这两个函数包含了休息仪式的主要逻辑。def start_nap(screen, bg_music, click_sound): 开始休息流程 global nap_active, nap_end_time print(--- Nap Started ---) nap_active True nap_end_time time.time() NAP_DURATION # 视觉反馈切换到全屏深色背景 screen pygame.display.set_mode((0, 0), pygame.FULLSCREEN) pygame.mouse.set_visible(False) # 隐藏鼠标光标 # 音频反馈播放点击音效和背景音乐 if click_sound: click_sound.play() if bg_music: pygame.mixer.music.load(bg_music) pygame.mixer.music.play(-1, fade_ms2000) # -1表示循环播放淡入2秒 # 硬件反馈点亮LED如果连接了 if LED_PIN: GPIO.output(LED_PIN, GPIO.HIGH) def end_nap(screen, alarm_sound): 结束休息流程 global nap_active, nap_end_time print(--- Nap Ended ---) nap_active False nap_end_time None # 停止背景音乐 pygame.mixer.music.stop() # 播放结束提示音 if alarm_sound: alarm_sound.play() # 恢复窗口和鼠标 screen pygame.display.set_mode((100, 100), pygame.NOFRAME) pygame.mouse.set_visible(True) pygame.display.set_caption(The Nap Button - Ready) # 关闭LED if LED_PIN: GPIO.output(LED_PIN, GPIO.LOW) # 可以添加一个视觉提醒比如窗口闪烁几下这里用打印代替 print(休息时间结束请回到工作中。)函数解析start_nap它做了几件营造仪式感的事1) 切换到全屏模式并隐藏鼠标最大化减少干扰2) 播放积极的声音反馈点击声和舒缓音乐3) 提供硬件反馈LED亮起。这些多感官反馈共同强化了“现在进入休息时间”的心理暗示。end_nap负责清理状态恢复原状停止音乐、播放温和的提醒音、退出全屏、熄灭LED。整个过程流畅自然。5.5 界面绘制函数绘制函数根据当前状态在屏幕上显示不同的内容。def draw(screen, font_large, font_small, current_time): 根据状态绘制界面 if nap_active and nap_end_time: # --- 休息状态全屏深色背景 大号倒计时 --- screen.fill((10, 15, 30)) # 深蓝灰色背景护眼 time_left max(0, nap_end_time - current_time) minutes int(time_left // 60) seconds int(time_left % 60) time_text f{minutes:02d}:{seconds:02d} # 渲染倒计时文字 text_surface font_large.render(time_text, True, (220, 220, 220)) # 浅灰色 text_rect text_surface.get_rect(centerscreen.get_rect().center) screen.blit(text_surface, text_rect) # 在底部添加提示文字 hint_surface font_small.render(Relax..., True, (150, 150, 180)) hint_rect hint_surface.get_rect(center(screen.get_width()//2, screen.get_height() - 80)) screen.blit(hint_surface, hint_rect) else: # --- 等待状态小窗口显示就绪信息 --- screen.fill((40, 40, 40)) ready_text font_small.render(Ready, True, (100, 255, 100)) ready_rect ready_text.get_rect(center(50, 30)) screen.blit(ready_text, ready_rect) press_text font_small.render(Press Button, True, (200, 200, 200)) press_rect press_text.get_rect(center(50, 70)) screen.blit(press_text, press_rect) pygame.display.flip() # 更新整个屏幕绘制逻辑通过nap_active状态变量完全区分两种界面。休息时是全屏沉浸式倒计时等待时是一个简洁的小状态窗口。pygame.display.flip()用于将绘制好的内容更新到实际屏幕上。5.6 清理函数这是一个好习惯确保程序退出时GPIO状态被正确重置音频系统退出。def cleanup(): 程序退出前的清理工作 print(进行清理...) pygame.mixer.quit() pygame.quit() GPIO.cleanup() # 释放GPIO资源将其重置为安全状态 print(清理完成。)GPIO.cleanup()至关重要它会将使用过的GPIO引脚恢复为默认的输入状态避免在程序意外退出后某个输出引脚依然保持高/低电平可能导致短路或意外行为。6. 部署、优化与问题排查代码写完了但要让它成为一个稳定可靠、随时可用的桌面工具还需要一些步骤。6.1 让程序开机自启动我们希望树莓派一开机“The Nap Button”程序就自动在后台运行随时等待按钮按下。方法使用 systemd 服务推荐创建一个服务文件sudo nano /etc/systemd/system/nap-button.service写入以下内容请根据你的实际路径修改WorkingDirectory和ExecStart[Unit] DescriptionThe Nap Button Service Aftergraphical.target sound.target # 在图形和音频服务启动后启动 [Service] Typesimple Userpi # 替换为你的用户名 WorkingDirectory/home/pi/nap_button_project # 替换为你的项目绝对路径 EnvironmentDISPLAY:0 EnvironmentXAUTHORITY/home/pi/.Xauthority # 确保Pygame能访问显示 ExecStart/home/pi/nap_button_project/venv/bin/python3 /home/pi/nap_button_project/nap_button.py Restarton-failure # 如果程序崩溃自动重启 RestartSec5 [Install] WantedBymulti-user.target保存并退出CtrlX然后Y然后Enter。启用并启动服务sudo systemctl daemon-reload sudo systemctl enable nap-button.service sudo systemctl start nap-button.service检查服务状态sudo systemctl status nap-button.service如果看到active (running)说明成功了。现在重启树莓派程序也会自动启动。注意事项DISPLAY和XAUTHORITY环境变量的设置对于Pygame在后台访问图形界面至关重要。如果程序启动失败可以查看日志sudo journalctl -u nap-button.service -f来排查。6.2 常见问题与排查技巧在开发和运行过程中你可能会遇到以下问题问题现象可能原因排查与解决运行程序后按下按钮无反应1. GPIO引脚编号错误BCM vs 物理。2. 内部上拉未启用引脚浮空。3. 回调函数未被触发。1. 确认代码中BUTTON_PIN的BCM编号与物理连接一致。2. 确保GPIO.setup中设置了pull_up_downGPIO.PUD_UP。3. 在button_pressed_callback函数开头加print语句看是否执行。检查接线是否牢固。程序报错“pygame.error: No available video device”程序在无图形界面的环境如SSH会话或系统服务中尝试创建窗口。1.对于SSH需要启用X11转发ssh -X但这通常用于调试不适用于部署。2.对于系统服务确保服务文件中正确设置了DISPLAY:0和XAUTHORITY环境变量如上文所示。倒计时结束后屏幕没有恢复/音乐没停NAP_END_EVENT事件未正确处理或end_nap函数中的恢复逻辑有误。1. 检查主循环中是否对NAP_END_EVENT进行了判断并调用end_nap。2. 在end_nap函数中添加print语句确认其被调用。3. 检查全屏切换的代码逻辑确保恢复窗口的尺寸模式正确。LED不亮或常亮1. LED正负极接反。2. 限流电阻阻值过大或过小。3. GPIO输出模式设置错误。1. 确认LED长脚正极接GPIO短脚负极接GND。2. 使用220Ω-1kΩ的电阻。3. 确认代码中GPIO.setup(LED_PIN, GPIO.OUT)已执行。音频无法播放1. 音频文件路径错误或格式不支持。2. Pygame mixer初始化失败或与其他音频服务冲突。3. 树莓派音频输出未设置正确。1. 使用绝对路径或确保文件在程序工作目录下。Pygame支持WAV、MP3需依赖、OGG等。2. 尝试在代码最开头先pygame.mixer.quit()再pygame.mixer.init()。3. 运行sudo raspi-config在System Options-Audio中选择正确的输出设备HDMI或3.5mm耳机孔。6.3 功能扩展与优化建议基础版本已经可用但你可以让它变得更聪明、更贴心可配置的休息时间不要硬编码NAP_DURATION。可以设计成短按按钮启动20分钟休息长按按钮如按住3秒启动5分钟“快速休息”。这需要修改GPIO检测逻辑使用time.time()来计算按钮按下的时长。休息统计与日志每次按下按钮将开始时间、计划时长记录到一个CSV文件或SQLite数据库中。周末可以回顾一下自己这周休息了多少次培养成就感。网络同步与远程控制给程序添加一个简单的HTTP服务器比如用Flask你就可以在手机浏览器上查看状态、远程启动/取消休息或者在公司电脑上控制家里的树莓派。环境光感应连接一个光敏传感器通过GPIO或I2C。在启动休息时如果检测到环境光很强可以自动调暗屏幕的亮度如果使用官方7寸屏可通过/sys/class/backlight/...接口控制甚至通过PWM控制一个LED台灯的亮度营造更佳的休息氛围。更丰富的反馈除了LED可以加一个迷你震动马达在休息结束时提供触觉提醒或者用一个OLED小屏幕在等待状态显示一句随机的鼓励语录。这个项目的魅力在于它从一个简单的想法出发通过硬件和软件的结合创造了一个有形的、交互式的工具。它强迫你从数字世界中抽离片刻这个按下按钮的物理动作本身就是一种重要的心理锚定。
返回列表