3 pontos por GN⁺ 2025-03-30 | 1 comentários | Compartilhar no WhatsApp
  • Repositório de um timer físico de foco baseado em ESP32, que usa uma tela ePaper e um dial rotativo como dispositivo de entrada para implementar um fluxo de trabalho e descanso no estilo Pomodoro
  • O código não pode ser usado imediatamente porque alguns assets e fontes foram removidos, mas pode ser adaptado conforme a necessidade
  • O hardware é composto por ESP32, WaveShare e-Paper HAT de 4,26 polegadas 800x480, encoder rotativo KY-040, LED WS2812, conector USB-C, gabinete impresso em 3D e resistores/capacitores
  • A ePaper não tem backlight, reduzindo distrações durante o trabalho, e o modelo de 4,26 polegadas oferece atualização parcial em 0,3 s, evitando o piscar preto e branco durante a atualização
  • O software usa C++ com o framework Arduino, PlatformIO e a biblioteca GxEPD2, oferecendo funções como seleção de presets, notificações por LED, estatísticas de pausas e repetição de pausas longas

Visão geral do projeto

  • Este repositório reúne código e materiais de design para um timer de foco baseado em ESP32
  • A entrada é feita com um dial rotativo e a exibição ocorre em uma tela ePaper
  • O código do repositório não está em estado pronto para uso imediato, porque alguns assets e fontes foram removidos
    • Se necessário, é possível adaptar o código às próprias necessidades
  • O produto final também pode ser visto no MakerWorld

Componentes utilizados

  • Principais componentes:
    • ESP32, usando como exemplo a AZDelivery ESP32 NodeMCU
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • Outros displays também podem funcionar, mas a interface foi projetada para esta resolução
    • Encoder rotativo KY-040 com botão
    • 1 LED WS2812
      • Pode ser substituído por um LED RGB simples
    • Conector USB-C
      • Se for usado um conector USB-C de 2 fios, pode ser necessário um cabo USB-A para USB-C para alimentação
    • Gabinete impresso em 3D
    • Resistor para o LED, resistor pull-up para a chave e capacitor de 0.1uF para suavizar o sinal do encoder rotativo
    • Como componentes opcionais, podem ser usados pesos de balanceamento de pneu e pés de borracha

Motivação de criação e objetivos de design

  • O projeto começou com o objetivo de criar um timer de foco para um amigo
  • O autor gosta de experimentar técnicas de produtividade e tem o hábito de dedicar cerca de um mês por ano a um projeto que possa ajudar outra pessoa
  • Depois de comprar uma impressora 3D BambuLab X1C, queria aproveitá-la, e como havia feito formação em eletrônica antes de migrar para engenharia de software, também queria construir um dispositivo físico
  • Havia três objetivos de design
    • Ser um dispositivo físico
    • Ser divertido
    • Ser intuitivo de usar
  • Já existiam exemplos como Focus Dial by Salim Benbouziyane, mas a ideia era fazer algo do zero

Motivos para a escolha dos componentes

  • ESP32

    • Era a segunda tentativa de construir algo com microcontrolador depois de muito tempo, e como já havia familiaridade com o ESP32, foi fácil recomeçar com ele
    • Foi feita uma pesquisa prévia para confirmar o suporte ao display
  • Tela ePaper

    • As instruções de fiação do display estão em docs/display_wiring.md
    • Um dos principais objetivos do projeto era que o dispositivo não atrapalhasse o fluxo de trabalho, então a preferência era por uma tela sem backlight
    • Também era necessária uma tela grande o suficiente para ser lida sobre a mesa
    • Depois de encomendar e testar várias telas WaveShare ePaper, o modelo de 4,26 polegadas foi escolhido
    • Tem boa resolução
    • Tem um tamanho adequado
    • Suporta atualização parcial, com tempo de atualização de 0,3 s
    • Não apresenta o incômodo piscar preto e branco durante a atualização
    • No início, a intenção era usar uma tela preto/branco/vermelho, mas o modelo preferido levava 16 segundos para atualizar e não suportava atualização parcial, então foi descartado
    • Como não há backlight, fica difícil ler a tela à noite se a mesa não estiver suficientemente iluminada, e isso é visto como “não é bug, é feature”
  • Encoder rotativo

    • Foi considerado que usar um dial como dispositivo de entrada era a solução mais natural
    • A entrada por dial torna o design dos menus mais complexo e exige tratamento adequado de debounce
    • Foram adicionados capacitores de 0.1uF aos pinos CLK e DT para suavizar o sinal
  • LED

    • Nas primeiras iterações, não havia plano de incluir LED
    • Uma tela sem backlight poderia parecer sutil demais quando o período de foco terminasse
    • Várias alternativas foram testadas como forma de notificação
    • O buzzer assustava o usuário e gerava uma experiência ruim
    • O alto-falante apresentava muito ruído e zumbido na configuração testada
    • O LED WS2812 era fácil de usar e permitia animações com a biblioteca NeoPixel
    • Outra vantagem do WS2812 era não exigir muitos pinos de saída adicionais
    • No fim, o LED funcionou bem para indicar vários estados, e o gabinete ganhou uma pequena cobertura e uma camada difusora para melhorar sua aparência

Gabinete e design físico

  • O gabinete é composto por duas partes: base e tampa
  • Por causa de um design em que a moldura do display foi impressa de uma vez como parte da base, houve um problema de leve deformação nos cantos superiores durante a impressão
  • A escolha de colocar o dial na frente ficou aquém do ideal
    • Como a peça impressa e os componentes eletrônicos são leves, pressionar o botão do dial pode empurrar o dispositivo inteiro para trás
    • Isso foi resolvido adicionando pés de borracha e pesos de balanceamento de pneu na parte inferior

Estrutura do software

  • O software foi escrito em C++ e usa o framework Arduino
  • O gerenciamento do projeto usa PlatformIO
  • O display depende fortemente da biblioteca GxEPD2
  • O código do repositório está um pouco desorganizado, com trechos copiados e colados e partes antigas não limpas, porque o objetivo era concluir tudo dentro do prazo
  • Parte do código foi gerada com IA, principalmente Claude, para atender ao prazo do projeto
  • Como era um projeto feito para um amigo, também inclui easter eggs e elementos divertidos
    • Há uma função que mostra fatos aleatórios na tela durante o foco

Fluxo de uso do dispositivo

  • Quando o dispositivo inicia, é possível alterar configurações ou entrar no modo de seleção de presets
  • Um entre três presets é escolhido
  • O timer começa e, quando o tempo termina, o LED pisca e uma mensagem é exibida na tela
  • O usuário pode continuar trabalhando ou iniciar uma pausa em seguida
  • Durante a pausa, é possível ver estatísticas
  • Por padrão, a cada 4 ciclos é oferecida uma pausa mais longa

Desenvolvimento e personalização

  • Ferramentas necessárias para desenvolvimento:
    • PlatformIO
      • Foi usada a extensão do VSCode
    • Python 3.13 ou superior para regenerar os assets
  • Para preparar imagens, ícones e fontes, é necessário executar o script generate_assets.py
    • Redimensionar imagens
    • Converter para o formato correto
    • Gerar código C++ para inclusão no projeto
  • Exemplo de execução:
uv sync

uv run scripts/generate_assets.py
  • Os presets estão definidos em src/main.cpp
  • Exemplos de presets padrão: Emails, Coding e Focus
    • Emails: 15 minutos de foco, 5 minutos de pausa, 15 minutos de pausa longa
    • Coding: 45 minutos de foco, 15 minutos de pausa, 30 minutos de pausa longa, 2 repetições
    • Focus: 25 minutos de foco, 5 minutos de pausa, 20 minutos de pausa longa

Mapeamento de pinos

  • Encoder rotativo KY-040:
    • CLK: 32
    • DT: 21
    • SW: 14
  • Tela ePaper WaveShare preta e branca de 4,26 polegadas:
    • BUSY: 4
    • RST: 16
    • DC: 17
    • CS: 5
    • CLK: 18
    • DIN: 23
  • LED WS2812:
    • DIN: 25

1 comentários

 
GN⁺ 2025-03-30
Opiniões no Hacker News
  • Um timer Pomodoro físico: <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • Não se deve subestimar o prazer de usar um objeto bonito e feito por você mesmo. Esses pequenos prazeres acabam se acumulando.
      Pelo menos para mim isso é importante. Transformei meu medidor de energia em algo “inteligente” prendendo nele um dispositivo com ESP32 e fotorresistor para medir as piscadas do medidor; é tosco, mas funciona bem. Toda vez que vou à garagem e vejo o pequeno dispositivo piscando, fico feliz e com vontade de continuar o próximo projeto. Isso me dá a certeza de que consigo criar algo, ter sucesso e melhorar na vida.
      Pode soar bobo, mas é assim que encaro o projeto do post original.
    • Concordo. Qualquer timer serve.
      Se você está programando um display eInk e um microchip para corrigir o hábito de procrastinar, o certo é parar esse projeto, comprar um timer físico e fazer o que precisa ser feito.
      Se antes de trabalhar você ficar com vontade de pesquisar para escolher um timer, vou reduzir sua busca. Este também funciona bem: https://www.amazon.com/dp/B07TLC9SFZ Claro, qualquer timer serve.
      Vá fazer essa tarefa. Vale a pena.
    • Claro, esse é o jeito mais fácil de resolver o problema.
      Mas o autor deixa claro que é um projeto para fazer algo para um amigo e experimentar novas ferramentas.
      Um projeto de hacking divertido não precisa necessariamente atender a uma demanda real de mercado. Pode ser só divertido.
    • É engraçado ler as avaliações de 1 estrela [0]. O problema é que os timers mecânicos de hoje são malfeitos e difíceis de confiar. Parece que ninguém mais sabe fabricar timers mecânicos de alta qualidade.
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • Se você consegue aguentar o tique-taque, tudo bem ;)
      Pessoalmente, gosto deste design de timer em formato de disco: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • Gosto muito deste projeto. A UI é agradável e parece ter sido desenhada com cuidado. Acho que encontrei mais uma atividade para um fim de semana, talvez algumas semanas.
    Se você está procurando um projeto de hackathon, o ecossistema de E-ink já está bem maduro, é fácil de programar, e IAs como o Claude entendem bem a superfície das APIs. Em geral, as pessoas não sabem o que estão vendo, então é preciso explicar como uma “tela tipo Kindle”, mas na sala de estar elas parecem preferir telas e-ink a displays com backlight, porque incomodam muito menos.
    Para referência, E-ink [0] e Pomodoro [1] são dois assuntos nos quais venho me aprofundando bastante.
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • Projetos desse tipo de “dispositivo” são sempre interessantes. Mesmo quando o objetivo é simples, geralmente são os mais difíceis. O ponto de encontro entre design de produto, eletrônica e código é um excelente playground.
    Gostei muito da escolha da tela e também do fato de o README explicar bem as decisões considerando o propósito e a usabilidade.
    Tenho algumas ideias sobre o design do objeto em si. Também acho essa parte muito difícil e passo bastante tempo iterando. Se o botão giratório ficasse na parte de cima do dispositivo, largo e achatado, seria possível centralizar a tela e tornar o aparelho menor, além de reduzir a chance de a caixa escorregar ao girá-lo. Chanfros e arredondamentos aumentam muito a sensação de acabamento. A diferença entre cantos vivos e cantos arredondados é um detalhe pequeno, mas parece bem significativa.
    Se o menu sempre tem três opções, talvez fosse melhor colocar três botões na parte de cima, como o botão “snooze” de um despertador, em vez do botão giratório. Exigiria menos interação. Com filamento translúcido, também dá para criar peças legais de “guia de luz”. Por exemplo, se a caixa dos LEDs fosse uma peça única, poderia ficar com cara de painel dos anos 80. Ou, se você imprimisse uma moldura para a tela e iluminasse essa parte, poderia virar um design mais minimalista.
    Não consigo evitar, gosto de pensar nessas coisas. Fiquei curioso sobre como você projetou o botão giratório. Foi em OpenSCAD? O serrilhado ficou bom e parece ter sido gerado programaticamente.
    • Boas perguntas.
      Se eu fosse redesenhar o botão giratório, provavelmente o moveria para a parte de cima. O cronograma inteiro deste projeto foi de 4 semanas e, quando surgiu o problema de peso, eu não tinha confiança suficiente para refazer a carcaça e imprimir outro protótipo, mas isso certamente teria ficado melhor.
      Coloquei arredondamentos/chanfros em quase todas as bordas, e a carcaça final foi impressa com fuzzy skin para dar uma sensação mais premium.
      O botão giratório originalmente também foi pensado para alterar o tempo do timer, então um dial parecia fazer sentido. No fim, isso não aconteceu; para o menu atual, três botões talvez fossem uma UX melhor. O dispositivo também ficaria menor.
      A cobertura começou originalmente como uma forma de impedir vazamento de luz e, depois, foi reimpressa em branco junto com um filme plástico difusor para aumentar um pouco a difusão dos LEDs. Gosto da ideia de colocar uma fita de LEDs na borda da tela. Não tinha pensado nisso.
      Normalmente uso mais o Blender, então segui um tutorial de serrilhado no Onshape. A ferramenta não gosta muito desse nível de geometria, então fica engasgando durante o trabalho, mas fique à vontade para conferir o arquivo do Onshape linkado no README.
  • É um ótimo acréscimo o fato de mirar exatamente três casos de uso, em vez de apenas um período simples de 25 minutos de foco, e ainda oferecer estatísticas.
    Para iniciantes, seria bom incluir no texto que o Pomodoro originalmente recebeu esse nome por causa de um timer físico com encoder rotativo.

https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
Parece que, se um dia eu usar uma tela e-ink vermelha como planejo, isso pode ser uma alternativa divertida ao Pepe

  • Projeto bacana. Recomendo também dar uma olhada na LVGL [0], uma biblioteca gráfica para criar UIs embarcadas. Ela é bem simples de usar e lembra um pouco HTML. Configurar a comunicação com o hardware é um pouco mais difícil, mas, depois de configurado, o fluxo de escrever a UI e tratar entradas melhora bastante
    [0] - https://github.com/lvgl/lvgl
    • Ah, isso parece muito legal. Passei um tempo pesquisando no começo, mas não vi essa
  • Muito interessante. Tenho pensado em como criar um timer Pomodoro físico, ou simplesmente um dispositivo de exibição, e prefiro uma tela circular que não mostre o tempo exato restante. Para mim, isso distrai e gera ansiedade
    Tenho usado o app Visual Timer [0] no Android, e no geral ele é excelente, mas obviamente seria melhor poder deixar o celular de lado
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • Também comprei uma LCD circular de 4 polegadas por esse motivo, mas acabei mudando para uma tela de papel eletrônico. Para não distrair demais, deixei mostrando só os minutos e, no último minuto, atualizando apenas a cada 10 segundos
  • O próprio conceito de Pomodoro veio de um timer físico de cozinha, e o formato dele era, como era de se esperar, um tomate
    Para mim, a melhor UX para a técnica Pomodoro está justamente nesse timer físico de cozinha
    • Funcionalmente, o Focus Dial é um “produto” muito melhor do que o que eu fiz e, como linkei no README, mantém exatamente essa UX
      Mas, para fazer algo assim, eu teria que encarar os limites do meu conhecimento e das minhas habilidades, e também queria tentar do meu jeito. Além disso, no fim das contas, eu gostei muito daquela tela de papel eletrônico
  • Sei que montar é metade da diversão, mas, se você só precisa de um dispositivo ESP32 genérico com tela e botões, recomendo o M5Stack. É barato, programável e bastante usado
  • Um conhecido tentou, tempos atrás, criar um negócio com um timer Pomodoro físico: https://www.indiegogo.com/projects/timechi-your-smart-produc...
    Para quem usa no escritório, ou para quem não quer olhar para a tela para ver o tempo restante, um indicador de LED na parte superior do aparelho parece útil. Seria uma lightbar bonita acendendo em vermelho ou verde, para que até alguém do outro lado, que não consegue ver a tela, saiba se pode interromper naquele momento. Se quiser, também dá para fazer como uma lightbar de progresso
  • Muito bom. Me dá vontade de levar também minhas ferramentas de produtividade para dispositivos físicos