3 points par GN⁺ 2025-03-30 | 1 commentaires | Partager sur WhatsApp
  • Dépôt d’un minuteur de concentration physique basé sur ESP32, qui met en œuvre un flux de travail/repos de type Pomodoro avec un écran ePaper et une molette rotative comme dispositif d’entrée
  • Le code n’est pas utilisable tel quel car certains assets et polices ont été retirés, mais il peut être modifié selon vos besoins
  • Le matériel se compose d’un ESP32, d’un WaveShare e-Paper HAT 4,26 pouces 800x480, d’un encodeur rotatif KY-040, d’une LED WS2812, d’un connecteur USB-C, d’un boîtier imprimé en 3D, ainsi que de résistances et condensateurs
  • L’ePaper n’a pas de rétroéclairage, ce qui réduit les distractions pendant le travail, et le modèle 4,26 pouces prend en charge un rafraîchissement partiel en 0,3 seconde, évitant le clignotement noir et blanc lors de l’actualisation
  • Le logiciel utilise C++, le framework Arduino, PlatformIO et la bibliothèque GxEPD2, et propose des fonctions comme la sélection de préréglages, les notifications LED, les statistiques de pause et les longues pauses récurrentes

Vue d’ensemble du projet

  • Ce dépôt contient le code et les éléments de conception d’un minuteur de concentration basé sur ESP32
  • L’entrée se fait via une molette rotative, et l’affichage via un écran ePaper
  • Le code du dépôt n’est pas immédiatement exploitable car certains assets et polices ont été retirés
    • Si besoin, vous pouvez l’adapter à vos propres usages
  • Le produit fini est aussi visible sur MakerWorld

Composants utilisés

  • Principaux composants :
    • ESP32, par exemple AZDelivery ESP32 NodeMCU
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • D’autres écrans peuvent fonctionner, mais l’interface a été conçue pour cette résolution
    • Encodeur rotatif KY-040 et bouton
    • 1 LED WS2812
      • Peut être remplacée par une simple LED RGB
    • Connecteur USB-C
      • Avec un connecteur USB-C à 2 fils, un câble USB-A vers USB-C peut être nécessaire pour l’alimentation
    • Boîtier imprimé en 3D
    • Résistance pour la LED, résistance de pull-up pour l’interrupteur, et condensateur de 0.1uF pour lisser le signal de l’encodeur rotatif
    • En option, masses d’équilibrage de pneus et patins en caoutchouc

Motivation de fabrication et objectifs de conception

  • Le projet a commencé avec l’objectif de fabriquer un minuteur de concentration pour un ami
  • L’auteur aime tester des méthodes de productivité et a l’habitude de consacrer environ un mois par an à un projet utile pour quelqu’un d’autre
  • Après avoir acheté une imprimante 3D BambuLab X1C, il voulait l’exploiter, et son parcours d’apprenti en électronique devenu ingénieur logiciel lui donnait envie de créer un appareil physique
  • Trois objectifs guidaient la conception
    • être un appareil physique
    • être amusant
    • être intuitif à utiliser
  • Il existait déjà des projets comme Focus Dial by Salim Benbouziyane, mais l’auteur voulait tout construire lui-même dès le départ

Pourquoi ces composants

  • ESP32

    • C’était sa deuxième tentative de fabriquer quelque chose avec un microcontrôleur après une longue pause, et il était déjà familier avec l’ESP32, ce qui facilitait la reprise
    • Une recherche préalable a été menée pour vérifier la prise en charge de l’écran
  • Écran ePaper

    • Les instructions de câblage de l’écran se trouvent dans docs/display_wiring.md
    • L’un des objectifs majeurs du projet était que l’appareil n’interrompe pas le flux de travail, d’où le choix d’un écran sans rétroéclairage
    • Il fallait un écran assez grand pour être lisible sur un bureau
    • Après avoir commandé et essayé plusieurs écrans ePaper WaveShare, le modèle 4,26 pouces a été retenu
    • La résolution est bonne
    • La taille est adaptée
    • Il prend en charge le rafraîchissement partiel, avec un temps de rafraîchissement de 0,3 seconde
    • Il évite le clignotement noir et blanc gênant pendant les rafraîchissements
    • Au départ, l’auteur voulait utiliser un écran noir/blanc/rouge, mais le modèle préféré avait un temps de rafraîchissement de 16 secondes et ne prenait pas en charge le rafraîchissement partiel, donc il a été écarté
    • L’absence de rétroéclairage rend la lecture difficile la nuit si le bureau n’est pas assez éclairé, ce qui est considéré comme « une fonctionnalité, pas un bug »
  • Encodeur rotatif

    • L’utilisation d’une molette comme dispositif d’entrée semblait la plus naturelle
    • Une entrée par molette complique davantage la conception des menus et impose de bien gérer l’anti-rebond
    • Des condensateurs de 0.1uF ont été ajoutés sur les broches CLK et DT pour lisser le signal
  • LED

    • Les premières itérations ne prévoyaient pas de LED
    • Avec un écran sans rétroéclairage, la fin d’une session de concentration pouvait paraître trop discrète
    • Plusieurs solutions de notification ont été testées
    • Le buzzer surprenait trop l’utilisateur et donnait une mauvaise expérience
    • Le haut-parleur produisait beaucoup de bruit parasite et de grésillements dans la configuration testée
    • La LED WS2812 permettait de créer des animations avec la bibliothèque NeoPixel et restait simple à utiliser
    • La WS2812 avait aussi l’avantage de ne pas monopoliser beaucoup de broches de sortie
    • Au final, la LED s’est révélée efficace pour afficher différents états, et le boîtier a reçu un petit cache et une couche de diffusion pour mieux la mettre en valeur

Boîtier et conception physique

  • Le boîtier se compose de deux parties : la base et le couvercle
  • La décision d’imprimer en une seule fois le cadre de l’écran comme partie intégrante de la base a provoqué un léger gauchissement des coins supérieurs pendant l’impression
  • Le choix de placer la molette en façade a été un point de regret
    • Comme l’impression 3D et les composants électroniques sont légers, appuyer sur l’interrupteur de la molette peut faire reculer tout l’appareil
    • Le problème a été corrigé en ajoutant des patins en caoutchouc et des masses d’équilibrage de pneus sous le boîtier

Structure logicielle

  • Le logiciel est écrit en C++ et utilise le framework Arduino
  • La gestion du projet repose sur PlatformIO
  • L’affichage dépend fortement de la bibliothèque GxEPD2
  • Le code du dépôt reste assez peu nettoyé, avec du copier-coller et d’anciens morceaux de code conservés pour respecter la date limite du projet
  • Une partie du code a été générée par l’IA, principalement Claude, afin de terminer le projet à temps
  • Comme il s’agissait d’un projet pour un ami, des easter eggs et quelques éléments amusants ont aussi été ajoutés
    • Par exemple, l’écran affiche des faits aléatoires pendant les phases de concentration

Flux d’utilisation de l’appareil

  • Au démarrage, l’appareil permet de modifier les réglages ou d’entrer en mode de sélection des préréglages
  • L’utilisateur choisit l’un des trois préréglages
  • Le minuteur démarre et, à la fin du temps imparti, la LED clignote tandis qu’un message s’affiche à l’écran
  • L’utilisateur peut continuer à travailler, puis lancer ensuite une pause
  • Pendant les pauses, il est possible de consulter des statistiques
  • Par défaut, une pause plus longue est accordée toutes les 4 répétitions

Développement et personnalisation

  • Outils nécessaires pour le développement :
    • PlatformIO
      • L’extension VSCode est utilisée
    • Python 3.13 ou supérieur pour régénérer les assets
  • Pour préparer les images, icônes et polices, il faut exécuter le script generate_assets.py
    • redimensionnement des images
    • conversion au bon format
    • génération du code C++ à inclure dans le projet
  • Exemple d’exécution :
uv sync

uv run scripts/generate_assets.py
  • Les préréglages sont définis dans src/main.cpp
  • Exemples de préréglages par défaut : Emails, Coding, Focus
    • Emails : 15 minutes de concentration, 5 minutes de pause, 15 minutes de pause longue
    • Coding : 45 minutes de concentration, 15 minutes de pause, 30 minutes de pause longue, 2 répétitions
    • Focus : 25 minutes de concentration, 5 minutes de pause, 20 minutes de pause longue

Correspondance des broches

  • Encodeur rotatif KY-040 :
    • CLK : 32
    • DT : 21
    • SW : 14
  • Écran ePaper noir et blanc WaveShare 4,26 pouces :
    • BUSY : 4
    • RST : 16
    • DC : 17
    • CS : 5
    • CLK : 18
    • DIN : 23
  • LED WS2812 :
    • DIN : 25

1 commentaires

 
GN⁺ 2025-03-30
Avis sur Hacker News
  • Un minuteur Pomodoro physique : <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • Il ne faut pas sous-estimer le plaisir d’utiliser un bel objet fabriqué soi-même. Ces petits plaisirs finissent par s’accumuler
      En tout cas, pour moi, c’est important. J’ai rendu mon compteur électrique « intelligent » en y fixant un dispositif avec un ESP32 et une photorésistance pour mesurer les clignotements du compteur ; c’est rudimentaire, mais ça fonctionne bien. Chaque fois que je vais au garage et que je vois le petit appareil clignoter, ça me fait plaisir et ça me donne envie de continuer le projet suivant. Ça me donne la certitude que je peux fabriquer quelque chose, réussir, et améliorer ma vie
      Ça peut paraître idiot, mais c’est aussi comme ça que je vois le projet de l’article
    • Exact. N’importe quel minuteur suffit
      Si tu es en train de programmer un écran eInk et une puce pour corriger ta tendance à procrastiner, il faut arrêter ce projet, acheter un minuteur physique et faire ce que tu as à faire
      Si tu as envie de faire du shopping pour choisir un minuteur avant de travailler, je vais t’épargner quelques recherches. Celui-ci fonctionne bien aussi : https://www.amazon.com/dp/B07TLC9SFZ Bien sûr, n’importe quel minuteur fera l’affaire
      Va faire ce truc. Ça en vaut la peine
    • Bien sûr, c’est la manière la plus simple de résoudre le problème
      Mais l’article dit clairement que c’est un projet pour fabriquer quelque chose pour un ami et essayer de nouveaux outils
      Un projet de hacking amusant n’a pas forcément besoin de répondre à une vraie demande du marché. Il peut juste être amusant
    • C’est drôle de lire les avis à une étoile [0]. Le problème, c’est que les minuteurs mécaniques actuels sont tellement bâclés qu’il est difficile de leur faire confiance. On dirait que plus personne ne sait fabriquer des minuteurs mécaniques de qualité
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • Si tu supportes le tic-tac, ça va ;)
      Personnellement, j’aime bien ce design de minuteur en forme de disque : https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • J’adore vraiment ce projet. L’UI est plaisante et donne l’impression d’avoir été conçue avec soin. On dirait que je viens de trouver une nouvelle activité pour un week-end, voire pour quelques semaines
    Si vous cherchez un projet de hackathon, l’écosystème E-ink est assez mature, facile à programmer, et les IA comme Claude comprennent bien la surface d’API. La plupart du temps, les gens ne savent pas ce qu’ils regardent, donc il faut leur expliquer que c’est « un écran comme un Kindle », mais dans un salon, ils semblent préférer les écrans e-ink aux écrans rétroéclairés, parce qu’ils sont beaucoup moins intrusifs
    Pour référence, E-ink [0] et Pomodoro [1] sont deux sujets dans lesquels je me suis pas mal plongé
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • Ce type de projet d’« appareil » est toujours intéressant. Même quand l’objectif est simple, c’est généralement ce qu’il y a de plus difficile. Le point de rencontre entre design produit, électronique et code est un formidable terrain de jeu
    J’aime beaucoup le choix de l’écran, et le fait que le README explique bien l’objectif et les considérations d’usage
    J’ai quelques réflexions sur le design de l’objet lui-même. C’est aussi quelque chose que je trouve très difficile, et je passe beaucoup de temps à itérer dessus. Si la poignée était large et plate sur le dessus de l’appareil, on pourrait placer l’écran au centre, rendre l’appareil plus compact et réduire le risque que la boîte glisse quand on la tourne. Les chanfreins et les arrondis améliorent beaucoup la finition. La différence entre des arêtes vives et des arêtes arrondies est un petit détail, mais elle se ressent beaucoup
    Si le menu comporte toujours trois options, je me demande s’il ne vaudrait pas mieux mettre trois boutons sur le dessus, comme le bouton « snooze » d’un réveil, au lieu d’une poignée. Il y aurait moins de manipulations. Avec un filament translucide, on pourrait aussi créer de jolis éléments de « guide de lumière ». Par exemple, en faisant un boîtier de LED d’un seul bloc, ça pourrait donner un effet tableau de bord des années 80. Ou bien on pourrait imprimer la bordure de l’écran et l’éclairer, pour un design plus minimaliste
    J’aime réfléchir à ce genre de choses, je n’y peux rien. Je suis curieux de savoir comment tu as conçu la poignée. C’était avec OpenSCAD ? Le moletage est réussi et donne l’impression d’avoir été généré de manière programmatique
    • Bonnes questions
      Si je devais reconcevoir la poignée, je pense que je la déplacerais vers le haut. L’ensemble du projet s’est étalé sur 4 semaines, et quand le problème de poids est apparu, je n’étais pas assez confiant pour refaire le boîtier et imprimer un prototype, mais ça aurait clairement été mieux
      J’ai ajouté des arrondis/chanfreins sur presque toutes les arêtes, et le boîtier final a été imprimé avec une fuzzy skin pour lui donner un rendu plus haut de gamme
      La poignée était aussi prévue à l’origine pour modifier la durée du minuteur, donc un cadran me semblait logique. Au final, ça n’a pas pris cette direction, et pour le menu actuel, trois boutons seraient peut-être une meilleure UX. L’appareil serait aussi plus compact
      Le cache a d’abord été conçu pour bloquer les fuites de lumière, puis je l’ai réimprimé en blanc afin d’améliorer un peu la diffusion des LED, avec un film plastique diffusant. J’aime bien l’idée de mettre une bande LED sur le pourtour de l’écran. Je n’y avais pas pensé
      J’utilise généralement davantage Blender, donc j’ai suivi un tutoriel pour faire le moletage dans Onshape. Cet outil n’aime pas trop ce niveau de géométrie, donc il rame pendant le travail, mais le fichier Onshape lié dans le README peut être consulté librement
  • Le fait de viser précisément trois cas d’usage, plutôt qu’une simple session de concentration de 25 minutes, et d’ajouter des statistiques, est un très bon plus
    Pour les débutants, ce serait bien d’ajouter dans l’article que Pomodoro tire son nom d’un minuteur physique muni d’un encodeur rotatif

https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
Si un jour l’écran e-ink rouge est utilisé comme prévu, cela pourrait être une alternative amusante à Pepe.

  • Super projet. Je recommande aussi de jeter un œil à LVGL [0], une bibliothèque graphique pour créer des UI embarquées. Elle est assez simple à utiliser et donne une impression un peu proche du HTML. La configuration de la communication avec le matériel est un peu plus difficile, mais une fois en place, le flux d’écriture de l’UI et de gestion des entrées s’améliore nettement.
    [0] - https://github.com/lvgl/lvgl
    • Oh, ça a l’air vraiment chouette. J’ai passé un peu de temps à faire des recherches au début, mais je n’avais pas vu ça.
  • Très intéressant. Je réfléchissais à la façon de fabriquer un minuteur Pomodoro physique, ou simplement un dispositif d’affichage, et je préfère une forme avec un écran circulaire qui ne montre pas le temps exact restant. Pour moi, c’est distrayant et anxiogène.
    J’utilise l’application Visual Timer [0] sur Android, et elle est globalement excellente, mais pouvoir mettre le téléphone de côté serait évidemment mieux.
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • J’avais aussi acheté un LCD circulaire de 4 pouces pour cette raison, mais je suis finalement passé à un écran à encre électronique. Pour éviter que ce soit trop distrayant, je n’affiche que les minutes, et pendant la dernière minute, la mise à jour ne se fait que toutes les 10 secondes.
  • Le concept même de Pomodoro vient d’un minuteur de cuisine physique, dont la forme était, comme on pouvait s’y attendre, une tomate.
    À mon avis, la meilleure UX pour la technique Pomodoro se trouve justement dans ce minuteur de cuisine physique.
    • Fonctionnellement, Focus Dial est un « produit » bien meilleur que ce que j’ai fait, et comme indiqué dans le README, il conserve précisément cette UX.
      Mais pour construire quelque chose comme ça, j’aurais dû me confronter aux limites de mes connaissances et de mes compétences, et j’avais aussi envie d’essayer à ma façon. En plus, au final, cet écran à encre électronique m’a vraiment plu.
  • Je sais que l’assemblage représente la moitié du plaisir, mais si vous avez seulement besoin d’un appareil ESP32 généraliste avec un écran et des boutons, je recommande M5Stack. C’est bon marché, programmable et largement utilisé.
  • Quelqu’un que je connais avait essayé de lancer une activité autour d’un minuteur Pomodoro physique : https://www.indiegogo.com/projects/timechi-your-smart-produc...
    Pour les personnes qui l’utilisent au bureau, ou celles qui ne veulent pas regarder l’écran pour voir le temps restant, les voyants LED sur le dessus de l’appareil pourraient être utiles. Sous forme d’une jolie barre lumineuse, elle pourrait s’allumer en rouge ou en vert, afin que même quelqu’un de l’autre côté, qui ne peut pas voir l’écran, sache s’il peut vous interrompre ou non. Si on le souhaite, on peut aussi en faire une barre de progression lumineuse.
  • Vraiment sympa. Ça me donne envie de porter mes propres outils de productivité sur un appareil physique.