3P by GN⁺ | ★ favorite | 댓글 1개
  • ESP32 기반 물리적 집중 타이머 저장소로, ePaper 디스플레이와 로터리 다이얼을 입력 장치로 사용해 포모도로식 작업·휴식 흐름을 구현함
  • 코드는 일부 에셋과 폰트가 제거되어 바로 사용할 수는 없지만, 필요하면 자신의 용도에 맞게 수정할 수 있음
  • 하드웨어는 ESP32, WaveShare 4.26인치 800x480 e-Paper HAT, KY-040 로터리 인코더, WS2812 LED, USB-C 커넥터, 3D 프린트 케이스, 저항·커패시터로 구성됨
  • ePaper는 백라이트가 없어 작업 중 방해를 줄이고, 4.26인치 모델은 부분 새로고침 0.3초를 지원해 새로고침 시 검은색·흰색 깜빡임을 피할 수 있음
  • 소프트웨어는 C++와 Arduino 프레임워크, PlatformIO, GxEPD2 라이브러리를 사용하며, 프리셋 선택·LED 알림·휴식 통계·긴 휴식 반복 같은 기능을 제공함

프로젝트 개요

  • 이 저장소는 ESP32 기반 집중 타이머를 위한 코드와 설계 자료를 담고 있음
  • 입력은 로터리 다이얼을 사용하고, 표시는 ePaper 디스플레이로 처리함
  • 저장소의 코드는 일부 에셋과 폰트가 제거되어 즉시 사용 가능한 상태는 아님
    • 필요하면 코드를 자신의 요구에 맞게 수정해 사용할 수 있음
  • 완성품은 MakerWorld에서도 볼 수 있음

사용 부품

  • 주요 부품 구성:
    • ESP32, 예시로 AZDelivery ESP32 NodeMCU 사용
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • 다른 디스플레이도 동작할 수 있지만 UI는 이 해상도에 맞춰 설계됨
    • KY-040 로터리 인코더와 버튼
    • WS2812 LED 1개
      • 단순 RGB LED로 대체 가능함
    • USB-C 커넥터
      • 2선식 USB-C 커넥터를 쓰면 전원 공급을 위해 USB-A to USB-C 케이블이 필요할 수 있음
    • 3D 프린트 케이스
    • LED용 저항, 스위치용 풀업 저항, 로터리 인코더 신호를 완화하기 위한 0.1uF 커패시터
    • 선택 부품으로 타이어 밸런싱 웨이트와 고무발 사용 가능

제작 동기와 설계 목표

  • 프로젝트는 친구를 위한 집중 타이머를 만드는 목적에서 시작됨
  • 제작자는 생산성 기법을 시도하는 것을 좋아하고, 매년 한 번 정도 다른 사람에게 도움이 되는 프로젝트에 약 한 달의 시간을 쓰는 습관이 있음
  • BambuLab X1C 3D 프린터를 산 뒤 이를 활용하고 싶었고, 전자공학 견습을 마친 뒤 소프트웨어 엔지니어링으로 전환한 경험 때문에 물리적인 장치를 만들고 싶었음
  • 설계 목표는 세 가지였음
    • 물리적 장치일 것
    • 재미있을 것
    • 직관적으로 사용할 수 있을 것
  • 기존 프로젝트인 Focus Dial by Salim Benbouziyane 같은 사례가 있었지만, 처음부터 직접 만들고 싶었음

부품 선택 이유

  • ESP32

    • 오랜만에 마이크로컨트롤러로 무언가를 만드는 두 번째 시도였고, ESP32에 익숙해 다시 시작하기 편했음
    • 디스플레이 지원 여부를 확인하기 위해 사전 조사를 진행함
  • ePaper 디스플레이

    • 디스플레이 배선 안내는 docs/display_wiring.md에 있음
    • 프로젝트의 주요 목표 중 하나는 장치가 작업 흐름을 방해하지 않는 것이었고, 이를 위해 백라이트 없는 디스플레이를 원했음
    • 책상 위에 두고도 읽을 수 있을 만큼 큰 화면이 필요했음
    • 여러 WaveShare ePaper 디스플레이를 주문해 사용해 본 뒤 4.26인치 모델을 선택함
    • 해상도가 좋음
    • 크기가 적절함
    • 부분 새로고침을 지원하며, 새로고침 시간은 0.3초임
    • 새로고침 중 방해되는 검은색·흰색 깜빡임이 없음
    • 처음에는 흑백·빨강 디스플레이를 쓰고 싶었지만, 마음에 든 모델은 새로고침 시간이 16초였고 부분 새로고침을 지원하지 않아 제외됨
    • 백라이트가 없기 때문에 책상이 충분히 밝지 않으면 밤에는 화면을 읽기 어렵고, 이를 “버그가 아니라 기능”으로 봄
  • 로터리 인코더

    • 입력 장치로 다이얼을 쓰는 것이 가장 자연스럽다고 판단함
    • 다이얼 입력은 메뉴 설계를 더 복잡하게 만들고, 입력 디바운싱을 제대로 처리해야 함
    • CLK와 DT 핀에는 신호를 완화하기 위해 0.1uF 커패시터를 추가함
  • LED

    • 초기 반복 버전에는 LED 계획이 없었음
    • 백라이트 없는 디스플레이는 집중 시간이 끝났을 때 너무 미묘하게 느껴질 수 있었음
    • 알림 수단으로 여러 대안을 시험함
    • 버저는 사용자를 놀라게 해 좋지 않은 경험이었음
    • 스피커는 시도한 구성에서 잡음과 우는 소리가 많았음
    • WS2812 LED는 NeoPixel 라이브러리로 애니메이션을 만들 수 있고 사용이 쉬웠음
    • WS2812 LED는 더 많은 출력 핀을 많이 쓰지 않아도 되는 장점이 있었음
    • 최종적으로 LED는 여러 상태를 표시하는 데 잘 동작했고, 케이스에는 LED를 더 보기 좋게 만들기 위한 작은 가림막과 확산 레이어를 추가함

케이스와 물리적 설계

  • 케이스는 베이스와 뚜껑 두 부분으로 구성됨
  • 디스플레이 프레임을 베이스의 일부로 한 번에 출력한 설계 때문에, 출력 중 상단 모서리가 약간 휘어지는 문제가 있었음
  • 다이얼을 전면에 둔 선택은 아쉬운 지점이었음
    • 출력물과 전자부품이 가벼워 다이얼 스위치를 누르면 장치 전체가 뒤로 밀릴 수 있음
    • 바닥에 고무발과 타이어 밸런싱용 웨이트를 추가해 해결함

소프트웨어 구성

  • 소프트웨어는 C++ 로 작성되었고 Arduino 프레임워크를 사용함
  • 프로젝트 관리는 PlatformIO를 사용함
  • 디스플레이는 GxEPD2 라이브러리에 크게 의존함
  • 저장소의 코드는 마감 기한 안에 완성하기 위해 복사·붙여넣기와 이전 코드 미정리가 남아 있어 다소 정리되지 않은 상태임
  • 일부 코드는 프로젝트 마감에 맞추기 위해 AI, 주로 Claude로 생성됨
  • 친구를 위한 프로젝트였기 때문에 이스터에그와 재미 요소도 포함함
    • 집중 중 화면에 무작위 사실을 표시하는 기능이 들어 있음

기기 사용 흐름

  • 장치가 시작되면 설정을 바꾸거나 프리셋 선택 모드로 들어갈 수 있음
  • 프리셋은 세 가지 중 하나를 선택함
  • 타이머가 시작되고 시간이 끝나면 LED가 깜빡이며 화면에 메시지가 표시됨
  • 사용자는 계속 작업할 수도 있고, 이후 휴식을 시작할 수 있음
  • 휴식 중에는 통계를 볼 수 있음
  • 기본값 기준 4회마다 더 긴 휴식 시간이 주어짐

개발과 커스터마이징

  • 개발에 필요한 도구:
    • PlatformIO
      • VSCode 확장을 사용함
    • 에셋 재생성을 위한 Python 3.13 이상
  • 이미지, 아이콘, 폰트를 준비하려면 generate_assets.py 스크립트를 실행해야 함
    • 이미지 크기 조정
    • 올바른 형식으로 변환
    • 프로젝트에 포함할 C++ 코드 생성
  • 실행 예시는 다음과 같음
uv sync

uv run scripts/generate_assets.py
  • 프리셋은 src/main.cpp에 정의되어 있음
  • 기본 프리셋 예시는 Emails, Coding, Focus임
    • Emails: 집중 15분, 휴식 5분, 긴 휴식 15분
    • Coding: 집중 45분, 휴식 15분, 긴 휴식 30분, 반복 수 2
    • Focus: 집중 25분, 휴식 5분, 긴 휴식 20분

핀 매핑

  • KY-040 로터리 인코더:
    • CLK: 32
    • DT: 21
    • SW: 14
  • WaveShare 4.26인치 흑백 ePaper 디스플레이:
    • BUSY: 4
    • RST: 16
    • DC: 17
    • CS: 5
    • CLK: 18
    • DIN: 23
  • WS2812 LED:
    • DIN: 25

댓글과 토론

Hacker News 의견들
  • 물리적인 Pomodoro 타이머: <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • 아름답고 직접 만든 물건을 쓰는 즐거움을 과소평가하면 안 됨. 그런 작은 즐거움이 결국 쌓임
      적어도 내게는 중요함. ESP32와 포토레지스터로 전력량계의 깜빡임을 측정하는 장치를 붙여 전력량계를 “스마트하게” 만들었는데, 조잡하지만 잘 동작함. 차고에 갈 때마다 작은 장치가 깜빡이는 걸 보면 즐겁고, 다음 프로젝트를 계속하고 싶어짐. 뭔가를 만들 수 있고 성공할 수 있으며 삶에서 나아질 수 있다는 확신을 줌
      바보처럼 들릴 수도 있지만, 원글의 프로젝트도 그렇게 받아들임
    • 맞음. 어떤 타이머든 충분함
      미루는 습관을 고치려고 eInk 디스플레이와 마이크로칩을 프로그래밍하고 있다면, 그 프로젝트는 멈추고 물리 타이머를 사서 해야 할 일을 하는 게 맞음
      일하기 전에 타이머를 고르느라 쇼핑하고 싶어진다면 검색을 줄여주겠음. 이것도 잘 작동함: https://www.amazon.com/dp/B07TLC9SFZ 물론 아무 타이머나 괜찮음
      가서 그 일을 하셈. 그럴 가치가 있음
    • 물론 그게 문제를 푸는 더 쉬운 방법임
      하지만 원글은 친구를 위해 뭔가를 만들며 새 도구를 써보는 프로젝트라고 분명히 적고 있음
      재미있는 해킹 프로젝트가 실제 시장 수요를 만족해야만 하는 건 아님. 그냥 재미있어도 됨
    • 1점 리뷰를 읽어보면 웃김 [0]. 요즘 기계식 타이머는 조잡해서 믿고 쓰기 어렵다는 게 문제임. 이제는 고품질 기계식 타이머를 만드는 법을 아무도 모르는 듯함
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • 째깍거리는 소리를 견딜 수 있다면 괜찮음 ;)
      개인적으로는 이런 원반형 타이머 디자인이 마음에 듦: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • 이 프로젝트 정말 좋음. UI가 즐겁고 세심하게 설계된 느낌임. 또 하나의 주말용, 어쩌면 몇 주짜리 활동을 찾은 듯함
    해커톤 프로젝트를 찾는다면, E-ink 생태계는 꽤 성숙해서 프로그래밍하기 쉽고 Claude 같은 AI도 API 표면을 잘 파악함. 대체로 사람들은 뭘 보고 있는지 몰라서 “Kindle 같은 화면”이라고 설명해야 하지만, 거실에는 백라이트 디스플레이보다 e-ink 화면을 더 선호하는 듯함. 훨씬 덜 거슬리기 때문임
    참고로 E-ink [0]와 Pomodoro [1]는 둘 다 내가 꽤 파고 있는 주제임
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • 이런 “장치” 유형의 프로젝트는 늘 흥미로움. 목표가 단순해도 보통 가장 어렵기 때문임. 제품 디자인, 전자회로, 코드가 만나는 지점은 훌륭한 놀이터임
    화면 선택이 아주 마음에 들고, 목적과 사용성을 고려한 내용이 README에 잘 설명된 점도 좋음
    물건 자체의 디자인에 대해 몇 가지 생각이 있음. 나도 이 부분을 매우 어렵게 느끼고, 반복 개선에 많은 시간을 씀. 손잡이를 기기 위쪽에 넓고 납작하게 두면 화면을 중앙에 놓고 기기를 더 작게 만들 수 있으며, 돌릴 때 상자가 밀릴 가능성도 줄어듦. 모서리 깎기와 둥글림은 완성도를 크게 높여줌. 날카로운 모서리와 둥근 모서리의 차이가 작은 디테일인데도 꽤 크게 느껴짐
    메뉴가 항상 세 가지라면 손잡이 대신 상단에 알람시계의 “snooze” 같은 버튼 세 개를 두는 건 어떨까 싶음. 조작이 더 적어짐. 반투명 필라멘트를 쓰면 멋진 “빛 도관” 부품도 만들 수 있음. 예를 들어 LED 박스를 통짜로 만들면 80년대 계기판 같은 느낌이 날 수 있음. 아니면 화면 테두리를 출력해서 그 부분을 밝히면 더 미니멀한 디자인이 될 수도 있음
    이런 것들 생각하는 걸 좋아해서 어쩔 수 없음. 손잡이는 어떻게 설계했는지 궁금함. OpenSCAD였나? 널링 처리가 좋고, 프로그램적으로 만든 것처럼 보임
    • 좋은 질문들임
      손잡이는 다시 설계한다면 위쪽으로 옮길 것 같음. 이 프로젝트 전체 일정이 4주였고, 무게 문제가 생겼을 때 케이스를 다시 만들고 프로토타입을 출력할 만큼 자신이 없었지만, 그렇게 하면 확실히 더 나아졌을 것임
      거의 모든 모서리에 둥글림/모서리 깎기를 넣었고, 최종 케이스는 더 고급스럽게 느껴지도록 fuzzy skin으로 출력했음
      손잡이는 원래 타이머 시간을 바꾸는 용도도 염두에 둔 거라 다이얼이 맞다고 느꼈음. 결과적으로 그렇게 되지는 않아서, 지금의 메뉴에는 버튼 세 개가 더 나은 UX일 수 있음. 기기도 더 작아지고
      가림막은 원래 빛샘을 막으려고 시작했고, 나중에는 확산 플라스틱 필름과 함께 LED 확산을 조금 높이려고 흰색으로 다시 출력했음. 화면 가장자리에 LED 스트립을 두는 아이디어는 마음에 듦. 생각하지 못했음
      보통은 Blender를 더 많이 쓰는 편이라, Onshape에서 널링하는 튜토리얼을 따라 했음. 이 도구는 그 정도 지오메트리를 별로 좋아하지 않아서 작업할 때 버벅이지만, README에 링크된 Onshape 파일은 자유롭게 확인해도 됨
  • 단순한 25분 집중 시간이 아니라 세 가지 사용 사례를 정확히 겨냥하고, 통계까지 제공한 점이 멋진 추가 요소임
    입문자를 위해 Pomodoro가 원래 회전식 인코더가 달린 물리 타이머에서 이름을 따왔다는 점을 글에 넣으면 좋겠음
    https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
    언젠가 목표대로 빨간 e-ink 화면을 쓰게 된다면 Pepe의 재미있는 대안이 될 듯함
  • 멋진 프로젝트임. 임베디드 UI를 만들기 위한 그래픽 라이브러리인 LVGL [0]도 확인해보길 권함. 사용이 꽤 단순하고 HTML과 약간 비슷한 느낌임. 하드웨어 통신 설정은 조금 더 어렵지만, 한 번 설정하고 나면 UI 작성과 입력 처리 흐름이 크게 좋아짐
    [0] - https://github.com/lvgl/lvgl
    • 오, 아주 멋져 보임. 시작할 때 조사에 시간을 좀 썼는데 이건 못 봤음
  • 매우 흥미로움. 물리 Pomodoro 타이머, 또는 단순히 표시 장치를 어떻게 만들지 생각해왔는데, 원형 화면에 남은 정확한 시간이 보이지 않는 형태를 선호함. 내게는 그게 산만하고 불안감을 유발하기 때문임
    Android 폰에서 Visual Timer 앱 [0]을 써왔고 대체로 훌륭했지만, 폰을 치워둘 수 있다면 당연히 더 나을 것임
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • 나도 그 이유로 4인치 원형 LCD를 샀지만, 결국 전자종이 디스플레이로 바꿨음. 너무 산만하지 않도록 분 단위만 보여주고, 마지막 1분에는 10초 간격으로만 갱신되게 했음
  • Pomodoro라는 개념 자체가 물리적인 주방 타이머에서 나왔고, 그 모양은 예상대로 토마토였음
    내 기준으로 Pomodoro 기법에 가장 좋은 UX는 바로 그 물리 주방 타이머에서 찾을 수 있음
    • 기능적으로는 Focus Dial이 내가 만든 것보다 훨씬 더 나은 “제품”이고, README에도 링크했듯이 바로 그 UX를 유지함
      다만 그런 걸 만들기에는 내 지식과 기술의 한계를 마주해야 했고, 내 방식대로 해보고 싶기도 했음. 게다가 결국 그 전자종이 화면이 정말 마음에 들었음
  • 조립하는 게 재미의 절반이라는 건 알지만, 화면과 버튼이 있는 범용 ESP32 장치만 필요하다면 M5Stack을 추천함. 저렴하고, 프로그래밍 가능하고, 널리 쓰임
  • 아는 사람이 예전에 물리 Pomodoro 타이머로 사업을 해보려 했음: https://www.indiegogo.com/projects/timechi-your-smart-produc...
    사무실에서 쓰는 사람들, 또는 남은 시간을 보려고 화면을 보고 싶지 않은 사람들에게는 기기 상단의 LED 표시등이 유용할 듯함. 예쁜 라이트바 형태로 빨간색이나 초록색을 켜서, 화면을 볼 수 없는 반대편 사람도 지금 방해해도 되는지 알 수 있게 하는 것임. 원한다면 진행형 라이트바로도 만들 수 있음
  • 정말 좋음. 내 생산성 도구도 현실 장치로 옮겨보고 싶다는 생각이 듦