3 Punkte von GN⁺ 2025-03-30 | 1 Kommentare | Auf WhatsApp teilen
  • Repository für einen physischen Fokus-Timer auf ESP32-Basis, der mit einem ePaper-Display und einem Drehregler als Eingabegerät einen Pomodoro-ähnlichen Arbeits- und Pausenablauf umsetzt
  • Der Code ist nicht direkt einsatzbereit, da einige Assets und Fonts entfernt wurden, kann bei Bedarf aber für den eigenen Zweck angepasst werden
  • Die Hardware besteht aus ESP32, WaveShare 4,26-Zoll e-Paper HAT mit 800x480 Pixeln, KY-040-Drehencoder, WS2812-LED, USB-C-Anschluss, 3D-gedrucktem Gehäuse sowie Widerständen und Kondensatoren
  • ePaper hat keine Hintergrundbeleuchtung und stört dadurch weniger bei der Arbeit; das 4,26-Zoll-Modell unterstützt partielles Refresh in 0,3 Sekunden, wodurch das Schwarz-Weiß-Flackern beim Aktualisieren vermieden werden kann
  • Die Software nutzt C++ und das Arduino-Framework, PlatformIO sowie die GxEPD2-Bibliothek und bietet Funktionen wie Preset-Auswahl, LED-Benachrichtigungen, Pausenstatistiken und Wiederholungen für längere Pausen

Projektüberblick

  • Dieses Repository enthält Code und Designmaterialien für einen Fokus-Timer auf ESP32-Basis
  • Die Eingabe erfolgt über einen Drehregler, die Anzeige über ein ePaper-Display
  • Der Code im Repository ist nicht sofort einsatzbereit, da einige Assets und Fonts entfernt wurden
    • Bei Bedarf kann der Code an die eigenen Anforderungen angepasst und genutzt werden
  • Das fertige Produkt ist auch auf MakerWorld zu sehen

Verwendete Bauteile

  • Hauptkomponenten:
    • ESP32, als Beispiel wird AZDelivery ESP32 NodeMCU verwendet
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • Andere Displays könnten ebenfalls funktionieren, die UI ist jedoch auf diese Auflösung ausgelegt
    • KY-040-Drehencoder mit Button
    • Eine WS2812-LED
      • Kann durch eine einfache RGB-LED ersetzt werden
    • USB-C-Anschluss
      • Bei einem zweipoligen USB-C-Anschluss kann zur Stromversorgung ein USB-A-auf-USB-C-Kabel erforderlich sein
    • 3D-gedrucktes Gehäuse
    • Widerstand für die LED, Pull-up-Widerstand für den Schalter sowie 0,1-uF-Kondensatoren zur Glättung der Signale des Drehencoders
    • Optional können Reifen-Auswuchtgewichte und Gummifüße verwendet werden

Motivation und Designziele

  • Das Projekt begann mit dem Ziel, einen Fokus-Timer für einen Freund zu bauen
  • Der Ersteller probiert gern Produktivitätstechniken aus und hat die Gewohnheit, etwa einmal pro Jahr rund einen Monat in ein Projekt zu investieren, das anderen hilft
  • Nach dem Kauf eines BambuLab X1C 3D-Druckers wollte er diesen nutzen; außerdem wollte er aufgrund seiner Erfahrung, nach einer Ausbildung in Elektronik in die Softwareentwicklung gewechselt zu sein, ein physisches Gerät bauen
  • Es gab drei Designziele
    • Es sollte ein physisches Gerät sein
    • Es sollte Spaß machen
    • Es sollte intuitiv bedienbar sein
  • Es gab bereits ähnliche Projekte wie Focus Dial by Salim Benbouziyane, aber er wollte es von Grund auf selbst bauen

Gründe für die Auswahl der Bauteile

  • ESP32

    • Es war der zweite Versuch seit längerer Zeit, wieder etwas mit einem Mikrocontroller zu bauen; da er mit dem ESP32 vertraut war, fiel der Wiedereinstieg leicht
    • Vorab wurde recherchiert, ob das Display unterstützt wird
  • ePaper-Display

    • Hinweise zur Display-Verkabelung stehen in docs/display_wiring.md
    • Eines der Hauptziele des Projekts war, dass das Gerät den Arbeitsfluss nicht stört, weshalb ein Display ohne Hintergrundbeleuchtung gewünscht war
    • Der Bildschirm musste groß genug sein, um ihn auf dem Schreibtisch lesen zu können
    • Nach dem Bestellen und Ausprobieren mehrerer WaveShare-ePaper-Displays fiel die Wahl auf das 4,26-Zoll-Modell
    • Die Auflösung ist gut
    • Die Größe ist passend
    • Es unterstützt partielles Refresh mit einer Aktualisierungszeit von 0,3 Sekunden
    • Es gibt kein störendes Schwarz-Weiß-Flackern während des Refreshs
    • Anfangs sollte ein Schwarz-Weiß-Rot-Display verwendet werden, aber das favorisierte Modell hatte eine Refresh-Zeit von 16 Sekunden und unterstützte kein partielles Refresh, weshalb es ausgeschlossen wurde
    • Da es keine Hintergrundbeleuchtung gibt, ist der Bildschirm nachts schwer zu lesen, wenn der Schreibtisch nicht hell genug ist; das wird als „Feature, nicht Bug“ betrachtet
  • Drehencoder

    • Ein Drehregler wurde als natürlichste Eingabemethode angesehen
    • Die Eingabe per Drehregler macht das Menüdesign komplexer, außerdem muss das Debouncing der Eingaben sauber umgesetzt werden
    • An den CLK- und DT-Pins wurden 0,1-uF-Kondensatoren hinzugefügt, um die Signale zu glätten
  • LED

    • In den frühen Iterationen war keine LED geplant
    • Ein Display ohne Hintergrundbeleuchtung konnte sich zu unauffällig anfühlen, wenn eine Fokuszeit endet
    • Verschiedene Alternativen als Benachrichtigung wurden getestet
    • Ein Buzzer erschreckte den Nutzer und war daher keine gute Erfahrung
    • Ein Lautsprecher erzeugte in der getesteten Konfiguration viel Rauschen und Heulen
    • Eine WS2812-LED lässt sich mit der NeoPixel-Bibliothek animieren und ist einfach zu verwenden
    • Die WS2812-LED hat den Vorteil, dass nicht viele zusätzliche Output-Pins benötigt werden
    • Am Ende funktionierte die LED gut zur Anzeige verschiedener Zustände; im Gehäuse wurden eine kleine Blende und eine Diffusionsschicht ergänzt, damit die LED besser aussieht

Gehäuse und physisches Design

  • Das Gehäuse besteht aus zwei Teilen: Basis und Deckel
  • Weil der Displayrahmen als Teil der Basis in einem Stück gedruckt wurde, gab es beim Drucken das Problem, dass sich die oberen Ecken leicht verzogen
  • Die Entscheidung, den Drehregler auf der Vorderseite zu platzieren, war ein Schwachpunkt
    • Da Druckteil und Elektronik leicht sind, kann beim Drücken des Drehreglers das ganze Gerät nach hinten geschoben werden
    • Das wurde durch Gummifüße und Auswuchtgewichte am Boden gelöst

Softwareaufbau

  • Die Software wurde in C++ geschrieben und nutzt das Arduino-Framework
  • Für das Projektmanagement wird PlatformIO verwendet
  • Das Display hängt stark von der GxEPD2-Bibliothek ab
  • Der Code im Repository ist etwas unaufgeräumt, weil zur Einhaltung der Deadline Copy-and-paste-Code und nicht bereinigter alter Code übrig geblieben sind
  • Teile des Codes wurden zur Einhaltung des Projekttermins mit KI generiert, hauptsächlich mit Claude
  • Da es ein Projekt für einen Freund war, enthält es auch Easter Eggs und spaßige Elemente
    • Während der Fokusphase werden zufällige Fakten auf dem Bildschirm angezeigt

Nutzungsablauf des Geräts

  • Beim Starten des Geräts kann man Einstellungen ändern oder in den Preset-Auswahlmodus wechseln
  • Es wird eines von drei Presets ausgewählt
  • Der Timer startet, und wenn die Zeit abgelaufen ist, blinkt die LED und auf dem Bildschirm erscheint eine Nachricht
  • Der Nutzer kann weiterarbeiten oder anschließend eine Pause starten
  • Während der Pause können Statistiken angezeigt werden
  • Standardmäßig gibt es nach jeweils vier Durchläufen eine längere Pause

Entwicklung und Customizing

  • Benötigte Werkzeuge für die Entwicklung:
    • PlatformIO
      • Verwendet wird die VSCode-Erweiterung
    • Python 3.13 oder höher zur Neuerzeugung der Assets
  • Um Bilder, Icons und Fonts vorzubereiten, muss das Skript generate_assets.py ausgeführt werden
    • Größenänderung von Bildern
    • Konvertierung ins richtige Format
    • Generierung von C++-Code zur Einbindung ins Projekt
  • Beispiel zur Ausführung:
uv sync

uv run scripts/generate_assets.py
  • Presets sind in src/main.cpp definiert
  • Beispiele für Standard-Presets sind Emails, Coding und Focus
    • Emails: 15 Minuten Fokus, 5 Minuten Pause, 15 Minuten lange Pause
    • Coding: 45 Minuten Fokus, 15 Minuten Pause, 30 Minuten lange Pause, Wiederholungszahl 2
    • Focus: 25 Minuten Fokus, 5 Minuten Pause, 20 Minuten lange Pause

Pin-Mapping

  • KY-040-Drehencoder:
    • CLK: 32
    • DT: 21
    • SW: 14
  • WaveShare 4,26-Zoll-Schwarz-Weiß-ePaper-Display:
    • BUSY: 4
    • RST: 16
    • DC: 17
    • CS: 5
    • CLK: 18
    • DIN: 23
  • WS2812-LED:
    • DIN: 25

1 Kommentare

 
GN⁺ 2025-03-30
Meinungen auf Hacker News
  • Ein physischer Pomodoro-Timer: <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • Man sollte die Freude daran, ein schönes, selbstgebautes Ding zu benutzen, nicht unterschätzen. Solche kleinen Freuden summieren sich am Ende.
      Zumindest für mich ist das wichtig. Ich habe meinen Stromzähler „smart“ gemacht, indem ich ein Gerät mit ESP32 und Fotowiderstand daran befestigt habe, das das Blinken des Stromzählers misst. Es ist grob zusammengebaut, funktioniert aber gut. Jedes Mal, wenn ich in die Garage gehe und das kleine Gerät blinken sehe, freue ich mich und bekomme Lust, am nächsten Projekt weiterzumachen. Es gibt mir die Gewissheit, dass ich Dinge bauen kann, dass sie gelingen können und dass sich im Leben etwas verbessern lässt.
      Klingt vielleicht albern, aber so nehme ich auch das Projekt im Originalbeitrag wahr.
    • Stimmt. Jeder Timer reicht aus.
      Wenn man gerade ein eInk-Display und einen Mikrochip programmiert, um seine Aufschieberitis zu bekämpfen, sollte man dieses Projekt stoppen, einen physischen Timer kaufen und die eigentliche Aufgabe erledigen.
      Falls man vor der Arbeit erst einmal shoppen möchte, um einen Timer auszuwählen: Ich erspare die Suche. Dieser funktioniert auch gut: https://www.amazon.com/dp/B07TLC9SFZ Natürlich ist jeder beliebige Timer okay.
      Geh hin und erledige die Sache. Es lohnt sich.
    • Klar, das ist der einfachere Weg, das Problem zu lösen.
      Aber der Originalbeitrag sagt eindeutig, dass es ein Projekt ist, bei dem jemand für einen Freund etwas baut und dabei neue Tools ausprobiert.
      Ein spaßiges Hacking-Projekt muss keinen echten Marktbedarf erfüllen. Es darf einfach nur Spaß machen.
    • Die 1-Stern-Rezensionen zu lesen ist lustig [0]. Das Problem ist, dass mechanische Timer heutzutage so billig gemacht sind, dass man ihnen kaum trauen kann. Offenbar weiß inzwischen niemand mehr, wie man hochwertige mechanische Timer baut.
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • Wenn man das Ticken ertragen kann, ist das okay ;)
      Persönlich mag ich dieses scheibenförmige Timer-Design: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • Ich mag dieses Projekt wirklich. Die UI wirkt angenehm und sorgfältig durchdacht. Sieht so aus, als hätte ich noch eine Wochenendbeschäftigung gefunden, vielleicht sogar eine für ein paar Wochen.
    Wenn man nach einem Hackathon-Projekt sucht: Das E-Ink-Ökosystem ist inzwischen ziemlich ausgereift und leicht zu programmieren, und auch KI wie Claude versteht die API-Oberfläche gut. Meist wissen die Leute nicht, was sie da ansehen, sodass man es als „Bildschirm wie beim Kindle“ erklären muss, aber im Wohnzimmer scheinen sie E-Ink-Displays gegenüber Displays mit Hintergrundbeleuchtung zu bevorzugen. Sie sind einfach deutlich weniger aufdringlich.
    Zur Einordnung: E-Ink [0] und Pomodoro [1] sind beides Themen, in die ich mich ziemlich vertieft habe.
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • Solche Projekte vom Typ „Gerät“ sind immer interessant. Selbst wenn das Ziel simpel ist, sind sie meist am schwierigsten. Der Schnittpunkt von Produktdesign, Elektronik und Code ist ein großartiger Spielplatz.
    Die Wahl des Displays gefällt mir sehr, und auch, dass im README gut erklärt wird, was Zweck und Nutzung angeht.
    Zum Design des Gegenstands selbst habe ich ein paar Gedanken. Ich finde diesen Teil ebenfalls sehr schwierig und verbringe viel Zeit mit iterativen Verbesserungen. Wenn man den Griff oben am Gerät breit und flach platziert, könnte man das Display zentrieren, das Gerät kleiner machen und außerdem die Wahrscheinlichkeit verringern, dass die Box beim Drehen wegrutscht. Fasen und Abrundungen erhöhen die Wertigkeit enorm. Der Unterschied zwischen scharfen und abgerundeten Kanten ist ein kleines Detail, fühlt sich aber ziemlich groß an.
    Wenn das Menü immer aus drei Punkten besteht, könnte man statt des Griffs oben drei Tasten wie die „Snooze“-Taste eines Weckers anbringen. Dann braucht es weniger Bedienungsschritte. Mit transluzentem Filament ließen sich auch schöne „Lichtleiter“-Teile bauen. Wenn man zum Beispiel die LED-Box aus einem Stück macht, könnte das wie ein Armaturenbrett aus den 80ern wirken. Oder man druckt den Rahmen des Displays und beleuchtet diesen Bereich, was ein minimalistischeres Design ergeben könnte.
    Ich denke einfach gern über solche Dinge nach, da kann ich nicht anders. Mich würde interessieren, wie du den Griff entworfen hast. War das OpenSCAD? Die Rändelung ist gut und sieht aus, als wäre sie programmatisch erzeugt.
    • Gute Fragen.
      Wenn ich den Griff neu entwerfen würde, würde ich ihn wohl nach oben verlegen. Der gesamte Zeitplan für dieses Projekt lag bei vier Wochen, und als das Gewichtsproblem aufkam, hatte ich nicht genug Vertrauen, das Gehäuse noch einmal neu zu machen und einen Prototyp zu drucken. Aber das hätte es sicher besser gemacht.
      Ich habe an fast allen Kanten Abrundungen/Fasen eingefügt, und das finale Gehäuse mit fuzzy skin gedruckt, damit es hochwertiger wirkt.
      Der Griff war ursprünglich auch dafür gedacht, die Timer-Zeit zu ändern, deshalb fühlte sich ein Drehregler passend an. Am Ende ist es nicht dazu gekommen, sodass für das aktuelle Menü drei Tasten vielleicht die bessere UX wären. Das Gerät würde dadurch auch kleiner.
      Die Blende entstand ursprünglich, um Lichtlecks zu verhindern, und später habe ich sie in Weiß neu gedruckt, um zusammen mit einer diffusen Kunststofffolie die LED-Streuung etwas zu erhöhen. Die Idee, einen LED-Streifen am Rand des Displays anzubringen, gefällt mir. Darauf war ich nicht gekommen.
      Normalerweise nutze ich eher Blender, deshalb habe ich in Onshape einem Tutorial zum Erstellen von Rändelungen gefolgt. Dieses Tool mag Geometrie dieser Art nicht besonders, daher ruckelt es bei der Arbeit, aber die im README verlinkte Onshape-Datei kannst du dir gern frei ansehen.
  • Dass es nicht nur um eine simple 25-minütige Fokuszeit geht, sondern genau drei Anwendungsfälle adressiert werden und sogar Statistiken bereitgestellt werden, ist ein schönes Extra.
    Für Einsteiger wäre es gut, im Text zu erwähnen, dass Pomodoro ursprünglich nach einem physischen Timer mit Drehencoder benannt wurde.

https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
Falls irgendwann wie geplant ein rotes E-Ink-Display zum Einsatz kommt, könnte das eine witzige Alternative zu Pepe werden.

  • Tolles Projekt. Ich empfehle auch einen Blick auf LVGL [0], eine Grafikbibliothek zum Erstellen von Embedded-UIs. Sie ist ziemlich einfach zu benutzen und fühlt sich ein wenig wie HTML an. Die Einrichtung der Hardware-Kommunikation ist etwas schwieriger, aber sobald sie einmal steht, werden das Schreiben der UI und der Ablauf der Eingabeverarbeitung deutlich besser.
    [0] - https://github.com/lvgl/lvgl
    • Oh, das sieht sehr cool aus. Ich habe am Anfang einiges an Zeit in Recherche gesteckt, aber das hier ist mir nicht begegnet.
  • Sehr interessant. Ich habe darüber nachgedacht, einen physischen Pomodoro-Timer oder schlicht ein Anzeigegerät zu bauen, und bevorzuge eine runde Anzeige, auf der die exakt verbleibende Zeit nicht sichtbar ist. Für mich ist das ablenkend und löst Unruhe aus.
    Auf meinem Android-Telefon habe ich die App Visual Timer [0] genutzt, und sie war insgesamt großartig, aber wenn ich das Telefon weglegen könnte, wäre das natürlich besser.
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • Aus genau diesem Grund habe ich mir auch ein rundes 4-Zoll-LCD gekauft, bin am Ende aber auf ein E-Paper-Display umgestiegen. Damit es nicht zu sehr ablenkt, zeige ich nur Minuten an, und in der letzten Minute wird nur alle 10 Sekunden aktualisiert.
  • Das Konzept Pomodoro selbst stammt von einem physischen Küchentimer, und dessen Form war, wie zu erwarten, eine Tomate.
    Für mich findet sich die beste UX für die Pomodoro-Technik genau in diesem physischen Küchentimer.
    • Funktional ist Focus Dial ein deutlich besseres „Produkt“ als das, was ich gebaut habe, und wie im README verlinkt, behält es genau diese UX bei.
      Allerdings musste ich mich, um so etwas zu bauen, mit den Grenzen meines Wissens und meiner Fähigkeiten auseinandersetzen, und ich wollte es auch auf meine eigene Art versuchen. Außerdem mochte ich dieses E-Paper-Display am Ende wirklich sehr.
  • Ich weiß, dass der Zusammenbau die Hälfte des Spaßes ausmacht, aber wenn man nur ein universelles ESP32-Gerät mit Display und Tasten braucht, empfehle ich M5Stack. Günstig, programmierbar und weit verbreitet.
  • Jemand, den ich kenne, hat früher versucht, mit einem physischen Pomodoro-Timer ein Geschäft aufzubauen: https://www.indiegogo.com/projects/timechi-your-smart-produc...
    Für Leute, die ihn im Büro nutzen, oder für Menschen, die nicht auf ein Display schauen möchten, um die verbleibende Zeit zu sehen, könnten die LED-Anzeigen auf der Oberseite des Geräts nützlich sein. In Form einer hübschen Lightbar leuchtet sie rot oder grün, sodass auch Personen auf der anderen Seite, die das Display nicht sehen können, erkennen, ob man gerade gestört werden darf. Wenn man möchte, ließe sie sich auch als Fortschritts-Lightbar umsetzen.
  • Wirklich schön. Das bringt mich auf den Gedanken, auch meine Produktivitätstools in echte Geräte zu übertragen.