- यह ESP32 आधारित फिजिकल फोकस टाइमर रिपॉजिटरी है, जो ePaper डिस्प्ले और rotary dial को input device के रूप में इस्तेमाल करके Pomodoro-स्टाइल काम और ब्रेक का flow लागू करती है
- कोड में कुछ assets और fonts हटाए गए हैं, इसलिए इसे तुरंत इस्तेमाल नहीं किया जा सकता, लेकिन जरूरत हो तो आप इसे अपने use case के हिसाब से modify कर सकते हैं
- हार्डवेयर में ESP32, WaveShare 4.26-inch 800x480 e-Paper HAT, KY-040 rotary encoder, WS2812 LED, USB-C connector, 3D-printed case, resistors और capacitors शामिल हैं
- ePaper में backlight नहीं है, जिससे काम के दौरान distraction कम होता है, और 4.26-inch मॉडल 0.3 सेकंड partial refresh सपोर्ट करता है, इसलिए refresh के समय काले-सफेद flicker से बचा जा सकता है
- सॉफ्टवेयर C++ और Arduino framework, PlatformIO, GxEPD2 library का उपयोग करता है, और preset selection, LED notifications, break statistics, long break repetition जैसी सुविधाएं देता है
प्रोजेक्ट ओवरव्यू
- यह रिपॉजिटरी ESP32 आधारित focus timer के लिए code और design materials रखती है
- input के लिए rotary dial इस्तेमाल होता है, और display ePaper डिस्प्ले से संभाला जाता है
- रिपॉजिटरी का code कुछ assets और fonts हटाए जाने के कारण तुरंत इस्तेमाल करने योग्य स्थिति में नहीं है
- जरूरत हो तो code को अपनी requirements के हिसाब से modify करके इस्तेमाल किया जा सकता है
- तैयार product MakerWorld पर भी देखा जा सकता है
इस्तेमाल किए गए parts
- मुख्य parts की संरचना:
- ESP32, उदाहरण के तौर पर AZDelivery ESP32 NodeMCU इस्तेमाल किया गया
- WaveShare 4.26inch e-Paper display HAT, 800x480
- दूसरे displays भी काम कर सकते हैं, लेकिन UI इसी resolution के लिए design किया गया है
- KY-040 rotary encoder और button
- 1 WS2812 LED
- इसे simple RGB LED से replace किया जा सकता है
- USB-C connector
- अगर 2-wire USB-C connector इस्तेमाल करें, तो power supply के लिए USB-A to USB-C cable की जरूरत पड़ सकती है
- 3D-printed case
- LED के लिए resistor, switch के लिए pull-up resistor, और rotary encoder signals को smooth करने के लिए 0.1uF capacitors
- optional parts के रूप में tyre balancing weights और rubber feet इस्तेमाल किए जा सकते हैं
बनाने की प्रेरणा और design goals
- प्रोजेक्ट एक दोस्त के लिए focus timer बनाने के उद्देश्य से शुरू हुआ
- बनाने वाले को productivity techniques आजमाना पसंद है, और उनकी आदत है कि हर साल करीब एक बार दूसरों के काम आने वाले project पर लगभग एक महीना लगाते हैं
- BambuLab X1C 3D printer खरीदने के बाद वे उसका उपयोग करना चाहते थे, और electronics apprenticeship पूरी करने के बाद software engineering में आने के अनुभव के कारण physical device बनाना चाहते थे
- design goals तीन थे
- physical device होना
- मजेदार होना
- intuitively इस्तेमाल किया जा सकना
- मौजूदा projects जैसे Focus Dial by Salim Benbouziyane के उदाहरण थे, लेकिन वे शुरुआत से खुद बनाना चाहते थे
parts चुनने की वजह
-
ESP32
- लंबे समय बाद microcontroller से कुछ बनाने की यह दूसरी कोशिश थी, और ESP32 से परिचित होने के कारण फिर से शुरू करना आसान था
- display support की स्थिति जांचने के लिए पहले से research की गई
-
ePaper display
- display wiring guide
docs/display_wiring.md में है
- project के मुख्य लक्ष्यों में से एक था कि device work flow में बाधा न डाले, और इसके लिए backlight रहित display चाहिए था
- desk पर रखकर भी पढ़ा जा सके, इतना बड़ा screen चाहिए था
- कई WaveShare ePaper displays order करके इस्तेमाल करने के बाद 4.26-inch model चुना गया
- resolution अच्छा है
- size उपयुक्त है
- partial refresh support करता है, और refresh time 0.3 सेकंड है
- refresh के दौरान परेशान करने वाला black-white flicker नहीं होता
- शुरुआत में black-white-red display इस्तेमाल करना चाहते थे, लेकिन पसंद आया model 16 सेकंड refresh time वाला था और partial refresh support नहीं करता था, इसलिए उसे हटाया गया
- backlight न होने के कारण अगर desk पर्याप्त रोशन न हो तो रात में screen पढ़ना मुश्किल है, और इसे “bug नहीं, feature” माना गया
-
rotary encoder
- input device के तौर पर dial इस्तेमाल करना सबसे natural लगा
- dial input menu design को ज्यादा complex बनाता है, और input debouncing को सही से handle करना पड़ता है
- CLK और DT pins पर signals को smooth करने के लिए 0.1uF capacitors जोड़े गए
-
LED
- शुरुआती iteration में LED का plan नहीं था
- backlight रहित display focus time खत्म होने पर बहुत subtle लग सकता था
- notification method के तौर पर कई alternatives test किए गए
- buzzer ने user को चौंका दिया, इसलिए experience अच्छा नहीं था
- speaker में आजमाई गई configuration में noise और whining ज्यादा थी
- WS2812 LED के साथ NeoPixel library से animations बनाई जा सकती हैं और इसे इस्तेमाल करना आसान था
- WS2812 LED का फायदा था कि ज्यादा output pins इस्तेमाल नहीं करने पड़ते
- अंत में LED कई states दिखाने में अच्छी तरह काम आई, और case में LED को बेहतर दिखाने के लिए छोटा cover और diffusion layer जोड़े गए
case और physical design
- case base और lid दो parts से बना है
- display frame को base का हिस्सा बनाकर एक साथ print करने वाले design के कारण, printing के दौरान top corners में हल्का warp होने की समस्या आई
- dial को front पर रखना एक अफसोसजनक choice थी
- print और electronic parts हल्के होने के कारण dial switch दबाने पर पूरा device पीछे खिसक सकता है
- bottom में rubber feet और tyre balancing weights जोड़कर इसे solve किया गया
software structure
- software C++ में लिखा गया है और Arduino framework इस्तेमाल करता है
- project management के लिए PlatformIO इस्तेमाल होता है
- display काफी हद तक GxEPD2 library पर निर्भर है
- repository का code deadline में पूरा करने के लिए copy-paste और पुराने code की incomplete cleanup के कारण कुछ हद तक messy है
- कुछ code project deadline पूरी करने के लिए AI, मुख्य रूप से Claude, से generate किया गया
- चूंकि project दोस्त के लिए था, इसमें easter eggs और fun elements भी शामिल हैं
- focus के दौरान screen पर random facts दिखाने की सुविधा शामिल है
device usage flow
- device start होने पर settings बदली जा सकती हैं या preset selection mode में जाया जा सकता है
- presets में से तीन में से एक चुना जाता है
- timer शुरू होता है, और समय खत्म होने पर LED blink करती है और screen पर message दिखता है
- user काम जारी रख सकता है, या फिर break शुरू कर सकता है
- break के दौरान statistics देखे जा सकते हैं
- default के अनुसार हर 4 cycles के बाद लंबा break दिया जाता है
development और customization
- development के लिए जरूरी tools:
- PlatformIO
- VSCode extension इस्तेमाल होता है
- assets regenerate करने के लिए Python 3.13 या उससे ऊपर
- images, icons और fonts तैयार करने के लिए
generate_assets.py script चलानी होगी
- image resizing
- सही format में conversion
- project में शामिल करने के लिए C++ code generation
- run example इस प्रकार है
uv sync
uv run scripts/generate_assets.py
- presets
src/main.cpp में defined हैं
- default preset examples Emails, Coding, Focus हैं
- Emails: focus 15 मिनट, break 5 मिनट, long break 15 मिनट
- Coding: focus 45 मिनट, break 15 मिनट, long break 30 मिनट, repeat count 2
- Focus: focus 25 मिनट, break 5 मिनट, long break 20 मिनट
pin mapping
- KY-040 rotary encoder:
- WaveShare 4.26-inch black-and-white ePaper display:
- BUSY: 4
- RST: 16
- DC: 17
- CS: 5
- CLK: 18
- DIN: 23
- WS2812 LED:
1 टिप्पणियां
Hacker News की राय
कम से कम मेरे लिए तो यह अहम है। मैंने ESP32 और photoresistor से बिजली मीटर की blinking मापने वाला एक डिवाइस लगाकर बिजली मीटर को “smart” बना दिया; यह कच्चा-सा है, लेकिन अच्छी तरह काम करता है। जब भी garage में जाता हूं और उस छोटे device को blink करते देखता हूं तो खुशी होती है, और अगला project जारी रखने का मन करता है। यह भरोसा देता है कि मैं कुछ बना सकता हूं, सफल हो सकता हूं और जीवन में बेहतर हो सकता हूं
सुनने में बेवकूफी लग सकती है, लेकिन मूल पोस्ट के project को भी मैं इसी तरह देखता हूं
अगर आप टालमटोल की आदत सुधारने के लिए eInk display और microchip program कर रहे हैं, तो वह project रोककर एक physical timer खरीदना और जो काम करना है उसे करना ही सही रहेगा
अगर काम शुरू करने से पहले timer चुनने के लिए shopping करने का मन हो रहा है, तो मैं आपकी search कम कर देता हूं। यह भी ठीक काम करता है: https://www.amazon.com/dp/B07TLC9SFZ बेशक कोई भी timer चलेगा
जाइए और वह काम करिए। यह इसके लायक है
लेकिन मूल पोस्ट में साफ लिखा है कि यह दोस्त के लिए कुछ बनाते हुए नए tools आजमाने वाला project है
किसी मजेदार hacking project के लिए असली market demand पूरी करना जरूरी नहीं है। बस मजेदार होना भी काफी है
[0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
निजी तौर पर मुझे इस तरह का disc-shaped timer design पसंद है: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
अगर hackathon project ढूंढ रहे हैं, तो E-ink ecosystem काफी mature है, इसलिए इसके लिए programming आसान है, और Claude जैसे AI भी API surface को अच्छी तरह समझ लेते हैं। आम तौर पर लोग समझ नहीं पाते कि वे क्या देख रहे हैं, इसलिए इसे “Kindle जैसी screen” बताना पड़ता है, लेकिन living room में लोग backlight display की तुलना में e-ink screen को ज्यादा पसंद करते लगते हैं। क्योंकि यह बहुत कम खटकती है
संदर्भ के लिए, E-ink [0] और Pomodoro [1] दोनों ऐसे विषय हैं जिनमें मैं काफी गहराई से रुचि रखता हूं
[0] https://sambroner.com/posts/raspberry-pi-train
[1] https://sambroner.com/posts/personal-analytics-2024
screen का चुनाव मुझे बहुत पसंद आया, और यह भी अच्छा लगा कि उद्देश्य और usability को ध्यान में रखकर README में अच्छी तरह समझाया गया है
वस्तु के design के बारे में मेरे कुछ विचार हैं। मुझे भी यह हिस्सा बहुत कठिन लगता है, और मैं iteration में काफी समय लगाता हूं। अगर knob को device के ऊपर चौड़ा और चपटा रखा जाए, तो screen को बीच में रखा जा सकता है, device छोटा बनाया जा सकता है, और घुमाते समय box के खिसकने की संभावना भी घटेगी। chamfering और rounding finishing को काफी बेहतर कर देते हैं। sharp edges और rounded edges का अंतर छोटा detail होने पर भी काफी बड़ा महसूस होता है
अगर menu हमेशा तीन ही options का है, तो knob की जगह ऊपर alarm clock के “snooze” जैसे तीन buttons रखने का क्या खयाल है? Interaction कम हो जाएगा। translucent filament इस्तेमाल करें तो शानदार “light pipe” parts भी बनाए जा सकते हैं। उदाहरण के लिए LED box को एक ही piece में बनाया जाए तो 80s के instrument panel जैसा feel आ सकता है। या screen bezel print करके उसी हिस्से को illuminate करें तो design और minimal हो सकता है
ऐसी चीजों के बारे में सोचना मुझे पसंद है, इसलिए खुद को रोक नहीं पाता। knob कैसे design किया, यह जानने की जिज्ञासा है। OpenSCAD था क्या? knurling अच्छी है, और programmatically बनाई हुई लगती है
अगर knob को फिर से design करता तो शायद उसे ऊपर ले जाता। इस पूरे project की timeline 4 हफ्ते थी, और जब weight की समस्या आई तो case फिर से बनाने और prototype print करने का आत्मविश्वास नहीं था, लेकिन ऐसा करने से निश्चित तौर पर बेहतर होता
लगभग सभी edges पर rounding/chamfering डाला था, और final case को ज्यादा premium feel देने के लिए fuzzy skin के साथ print किया
knob को मूल रूप से timer का समय बदलने के लिए भी सोचा गया था, इसलिए dial सही लगा। आखिर में ऐसा नहीं हुआ, इसलिए मौजूदा menu के लिए तीन buttons बेहतर UX हो सकते हैं। device भी छोटा हो जाएगा
shroud की शुरुआत असल में light leak रोकने के लिए हुई थी, और बाद में diffusion plastic film के साथ LED diffusion थोड़ा बढ़ाने के लिए इसे सफेद रंग में फिर से print किया। screen के किनारे LED strip लगाने का idea पसंद आया। मैंने सोचा नहीं था
आम तौर पर मैं Blender ज्यादा इस्तेमाल करता हूं, इसलिए Onshape में knurling करने वाला tutorial follow किया। यह tool उस स्तर की geometry को ज्यादा पसंद नहीं करता, इसलिए काम करते समय lag करता है, लेकिन README में linked Onshape file आप आराम से देख सकते हैं
शुरुआती लोगों के लिए article में यह जोड़ना अच्छा होगा कि Pomodoro का नाम मूल रूप से rotary encoder वाले physical timer से आया है
https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
अगर कभी लक्ष्य के मुताबिक लाल e-ink स्क्रीन इस्तेमाल हो पाई, तो यह Pepe का एक मज़ेदार विकल्प लगेगा
[0] - https://github.com/lvgl/lvgl
Android phone पर Visual Timer app [0] इस्तेमाल करता आया हूँ और वह कुल मिलाकर बढ़िया रहा है, लेकिन अगर phone को दूर रखा जा सके तो ज़ाहिर है और बेहतर होगा
[0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
मेरे हिसाब से Pomodoro technique के लिए सबसे अच्छा UX उसी physical kitchen timer में मिलता है
हालांकि वैसा कुछ बनाने के लिए मुझे अपने ज्ञान और skills की सीमाओं का सामना करना पड़ता, और मैं अपने तरीके से भी करके देखना चाहता था। ऊपर से आखिरकार वह e-paper screen मुझे सच में बहुत पसंद आई
Update: यह रहा https://github.com/robertolupi/augmented-awareness/tree/main...
Office में इस्तेमाल करने वालों, या बचे हुए time को देखने के लिए screen की तरफ़ नहीं देखना चाहने वालों के लिए device के ऊपर का LED indicator उपयोगी हो सकता है। एक सुंदर lightbar के रूप में red या green light जलाकर, screen न देख पाने वाली दूसरी तरफ़ की person भी जान सके कि अभी disturb करना ठीक है या नहीं। चाहें तो इसे progress-style lightbar भी बनाया जा सकता है