- ESP32 tabanlı fiziksel odaklanma zamanlayıcısı deposu; ePaper ekranı ve giriş aygıtı olarak döner kadranı kullanarak Pomodoro tarzı çalışma–mola akışını uygular
- Kodda bazı varlıklar ve fontlar kaldırıldığı için doğrudan kullanılabilir durumda değildir, ancak gerekirse kendi kullanımınıza göre düzenlenebilir
- Donanım ESP32, WaveShare 4.26 inç 800x480 e-Paper HAT, KY-040 döner enkoder, WS2812 LED, USB-C konektörü, 3D baskı kasa, dirençler ve kapasitörlerden oluşur
- ePaper’ın arka aydınlatması olmadığı için çalışma sırasında dikkat dağıtmayı azaltır; 4.26 inç model 0,3 saniyelik kısmi yenilemeyi desteklediğinden yenileme sırasında siyah-beyaz yanıp sönmeyi önleyebilir
- Yazılım C++ ve Arduino framework’ü, PlatformIO ve GxEPD2 kütüphanesini kullanır; ön ayar seçimi, LED bildirimi, mola istatistikleri ve uzun mola tekrarı gibi özellikler sunar
Proje özeti
- Bu depo, ESP32 tabanlı bir odaklanma zamanlayıcısı için kod ve tasarım materyalleri içerir
- Giriş için döner kadran kullanılır, gösterim ise ePaper ekranla yapılır
- Depodaki kod, bazı varlıklar ve fontlar kaldırıldığı için hemen kullanılabilir durumda değildir
- Gerekirse kodu kendi ihtiyaçlarınıza göre değiştirip kullanabilirsiniz
- Bitmiş ürünü MakerWorld’de de görebilirsiniz
Kullanılan parçalar
- Başlıca parça bileşimi:
- ESP32; örnek olarak AZDelivery ESP32 NodeMCU kullanılmıştır
- WaveShare 4.26inch e-Paper display HAT, 800x480
- Başka ekranlar da çalışabilir, ancak arayüz bu çözünürlüğe göre tasarlanmıştır
- KY-040 döner enkoder ve buton
- 1 adet WS2812 LED
- Basit bir RGB LED ile değiştirilebilir
- USB-C konektörü
- 2 telli USB-C konektörü kullanırsanız güç sağlamak için USB-A’dan USB-C’ye kablo gerekebilir
- 3D baskı kasa
- LED için direnç, anahtar için pull-up direnci, döner enkoder sinyalini yumuşatmak için 0.1uF kapasitör
- İsteğe bağlı parçalar olarak lastik balans ağırlığı ve kauçuk ayaklar kullanılabilir
Yapım motivasyonu ve tasarım hedefleri
- Proje, bir arkadaş için odaklanma zamanlayıcısı yapma amacıyla başladı
- Yapımcı üretkenlik tekniklerini denemeyi seviyor ve her yıl yaklaşık bir kez, başkalarına faydası olacak bir projeye yaklaşık bir ay ayırma alışkanlığına sahip
- BambuLab X1C 3D yazıcı aldıktan sonra bunu kullanmak istedi; elektronik çıraklığını tamamladıktan sonra yazılım mühendisliğine geçiş yapma deneyimi nedeniyle fiziksel bir cihaz yapmak istedi
- Tasarım hedefleri üç taneydi
- Fiziksel bir cihaz olması
- Eğlenceli olması
- Sezgisel şekilde kullanılabilmesi
- Focus Dial by Salim Benbouziyane gibi mevcut projeler vardı, ancak en baştan kendisi yapmak istedi
Parça seçme nedenleri
-
ESP32
- Uzun bir aradan sonra mikrodenetleyiciyle bir şey yapmaya yönelik ikinci denemesiydi ve ESP32’ye aşina olduğu için yeniden başlamak kolaydı
- Ekran desteği olup olmadığını kontrol etmek için ön araştırma yaptı
-
ePaper ekran
- Ekran kablolama kılavuzu
docs/display_wiring.md içinde yer alır
- Projenin ana hedeflerinden biri cihazın çalışma akışını bölmemesiydi; bunun için arka aydınlatması olmayan bir ekran istedi
- Masanın üstünde dururken okunabilecek kadar büyük bir ekrana ihtiyaç vardı
- Birkaç WaveShare ePaper ekran sipariş edip denedikten sonra 4.26 inç modeli seçti
- Çözünürlüğü iyi
- Boyutu uygun
- Kısmi yenilemeyi destekler ve yenileme süresi 0,3 saniyedir
- Yenileme sırasında rahatsız edici siyah-beyaz yanıp sönme yoktur
- Başta siyah-beyaz-kırmızı bir ekran kullanmak istedi, ancak beğendiği modelin yenileme süresi 16 saniyeydi ve kısmi yenilemeyi desteklemediği için elendi
- Arka aydınlatması olmadığı için masa yeterince aydınlık değilse gece ekranı okumak zordur; bunu “hata değil özellik” olarak görüyor
-
Döner enkoder
- Giriş aygıtı olarak kadran kullanmanın en doğal seçenek olduğuna karar verdi
- Kadran girişi menü tasarımını daha karmaşık hale getirir ve giriş debounce işleminin doğru ele alınmasını gerektirir
- CLK ve DT pinlerine sinyali yumuşatmak için 0.1uF kapasitör eklendi
-
LED
- İlk yineleme sürümlerinde LED planı yoktu
- Arka aydınlatmasız ekran, odaklanma süresi bittiğinde fazla belirsiz kalabilirdi
- Bildirim aracı olarak çeşitli alternatifler denendi
- Buzzer kullanıcıyı irkilttiği için iyi bir deneyim değildi
- Hoparlör, denenen yapılandırmada çok fazla gürültü ve uğultu üretti
- WS2812 LED, NeoPixel kütüphanesiyle animasyon yapılmasına izin verir ve kullanımı kolaydı
- WS2812 LED’in çok sayıda ek çıkış pini gerektirmemesi gibi bir avantajı vardı
- Sonuçta LED çeşitli durumları göstermek için iyi çalıştı; kasaya LED’in daha hoş görünmesi için küçük bir siper ve difüzyon katmanı eklendi
Kasa ve fiziksel tasarım
- Kasa taban ve kapak olmak üzere iki parçadan oluşur
- Ekran çerçevesini tabanın bir parçası olarak tek seferde basma tasarımı nedeniyle, baskı sırasında üst köşelerin biraz eğilmesi sorunu yaşandı
- Kadranı ön tarafa koyma tercihi pişmanlık duyulan bir noktaydı
- Baskı parça ve elektronikler hafif olduğundan, kadran düğmesine basıldığında tüm cihaz geriye itilebiliyor
- Altına kauçuk ayaklar ve lastik balans ağırlıkları eklenerek çözüldü
Yazılım yapısı
- Yazılım C++ ile yazıldı ve Arduino framework’ü kullanır
- Proje yönetimi için PlatformIO kullanılır
- Ekran büyük ölçüde GxEPD2 kütüphanesine dayanır
- Depodaki kod, teslim tarihine yetiştirmek için kopyala-yapıştır ve eski kodun temizlenmemiş kısımlarını içerdiğinden biraz dağınık durumdadır
- Bazı kodlar proje teslimine yetişmek için yapay zeka ile, çoğunlukla Claude kullanılarak üretildi
- Bir arkadaş için yapılan proje olduğu için easter egg’ler ve eğlenceli unsurlar da içerir
- Odaklanma sırasında ekranda rastgele bilgiler gösteren bir özellik bulunur
Cihaz kullanım akışı
- Cihaz başlatıldığında ayarlar değiştirilebilir veya ön ayar seçme moduna girilebilir
- Üç ön ayardan biri seçilir
- Zamanlayıcı başlar; süre bittiğinde LED yanıp söner ve ekranda bir mesaj gösterilir
- Kullanıcı çalışmaya devam edebilir veya ardından molayı başlatabilir
- Mola sırasında istatistikler görülebilir
- Varsayılan değerlere göre her 4 turda bir daha uzun mola süresi verilir
Geliştirme ve özelleştirme
- Geliştirme için gereken araçlar:
- PlatformIO
- VSCode eklentisi kullanılır
- Varlıkları yeniden oluşturmak için Python 3.13 veya üzeri
- Görselleri, ikonları ve fontları hazırlamak için
generate_assets.py betiği çalıştırılmalıdır
- Görsel boyutlandırma
- Doğru biçime dönüştürme
- Projeye eklenecek C++ kodunu üretme
- Çalıştırma örneği şöyledir
uv sync
uv run scripts/generate_assets.py
- Ön ayarlar
src/main.cpp içinde tanımlıdır
- Varsayılan ön ayar örnekleri Emails, Coding, Focus’tur
- Emails: 15 dakika odaklanma, 5 dakika mola, 15 dakika uzun mola
- Coding: 45 dakika odaklanma, 15 dakika mola, 30 dakika uzun mola, tekrar sayısı 2
- Focus: 25 dakika odaklanma, 5 dakika mola, 20 dakika uzun mola
Pin eşlemesi
- KY-040 döner enkoder:
- WaveShare 4.26 inç siyah-beyaz ePaper ekran:
- BUSY: 4
- RST: 16
- DC: 17
- CS: 5
- CLK: 18
- DIN: 23
- WS2812 LED:
1 yorum
Hacker News yorumları
En azından benim için önemli. ESP32 ve fotodirençle elektrik sayacının yanıp sönmelerini ölçen bir cihaz takıp elektrik sayacımı “akıllı” hale getirdim; kaba saba ama iyi çalışıyor. Garaja her gittiğimde küçük cihazın yanıp söndüğünü görmek hoşuma gidiyor ve bir sonraki projeye devam etmek istiyorum. Bir şeyler yapabileceğime, başarılı olabileceğime ve hayatta daha iyiye gidebileceğime dair güven veriyor
Aptalca gelebilir ama özgün yazıdaki projeyi de böyle görüyorum
Erteleme alışkanlığını düzeltmek için eInk ekran ve mikroçip programlıyorsan, o projeyi durdurup fiziksel bir zamanlayıcı satın alarak yapman gereken işi yapman gerekir
Çalışmaya başlamadan önce zamanlayıcı seçmek için alışverişe dalmak istiyorsan aramayı daraltayım. Bu da iyi çalışıyor: https://www.amazon.com/dp/B07TLC9SFZ Tabii herhangi bir zamanlayıcı da olur
Git o işi yap. Buna değer
Ama özgün yazıda bunun bir arkadaş için bir şey yaparken yeni araçları deneme projesi olduğu açıkça yazıyor
Eğlenceli bir hacking projesinin gerçek bir pazar talebini karşılaması şart değil. Sadece eğlenceli olması da yeter
[0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
Şahsen bu tür disk biçimli zamanlayıcı tasarımını seviyorum: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
Hackathon projesi arıyorsanız, E-ink ekosistemi oldukça olgun; programlaması kolay ve Claude gibi yapay zekalar da API yüzeyini iyi kavrıyor. Çoğu zaman insanlar neye baktığını bilmediği için “Kindle benzeri ekran” diye açıklamak gerekiyor ama oturma odasında arkadan aydınlatmalı ekranlara göre e-ink ekranları daha çok tercih ediyorlar gibi. Çünkü çok daha az göze batıyor
Bu arada E-ink [0] ve Pomodoro [1], ikisi de benim epey derinlemesine ilgilendiğim konular
[0] https://sambroner.com/posts/raspberry-pi-train
[1] https://sambroner.com/posts/personal-analytics-2024
Ekran seçimini çok beğendim; amacın ve kullanılabilirliğin README’de iyi açıklanmış olması da hoş
Nesnenin kendi tasarımı hakkında birkaç düşüncem var. Ben de bu kısmı çok zor buluyorum ve yinelemeli iyileştirmeye çok zaman harcıyorum. Düğmeyi cihazın üstüne geniş ve yassı şekilde koymak, ekranı ortaya alıp cihazı daha küçük yapmayı sağlayabilir; çevirirken kutunun kayma ihtimalini de azaltır. Pah kırma ve yuvarlatma, bitmişlik hissini ciddi biçimde artırıyor. Keskin köşelerle yuvarlak köşeler arasındaki fark küçük bir detay olsa da oldukça büyük hissediliyor
Menü her zaman üç seçenekliyse, düğme yerine üstte çalar saatlerdeki “snooze” gibi üç buton koymaya ne dersin diye düşündüm. Daha az işlem gerektirir. Yarı saydam filament kullanırsan güzel “ışık kılavuzu” parçaları da yapabilirsin. Örneğin LED kutusunu tek parça yaparsan 80’ler gösterge paneli havası verebilir. Ya da ekran çerçevesini basıp o kısmı aydınlatırsan daha minimalist bir tasarım da olabilir
Böyle şeyleri düşünmeyi seviyorum, elimde değil. Düğmeyi nasıl tasarladığını merak ediyorum. OpenSCAD miydi? Knurling güzel olmuş ve programatik olarak yapılmış gibi görünüyor
Düğmeyi yeniden tasarlasam muhtemelen üste taşırdım. Bu projenin toplam takvimi 4 haftaydı; ağırlık sorunu çıktığında kasayı yeniden yapıp prototip basacak kadar kendime güvenmedim ama öyle yapsam kesinlikle daha iyi olurdu
Neredeyse tüm kenarlara yuvarlatma/pah koydum ve son kasayı daha kaliteli hissettirsin diye fuzzy skin ile bastım
Düğme başlangıçta zamanlayıcı süresini değiştirmek için de düşünülmüştü, bu yüzden kadran doğru gelmişti. Sonuçta öyle olmadı; mevcut menü için üç buton daha iyi bir UX olabilir. Cihaz da küçülür
Siperlik başta ışık sızıntısını engellemek için başladı; sonra difüzör plastik filmle birlikte LED yayılımını biraz artırmak için beyaz olarak yeniden bastım. Ekran kenarına LED şerit koyma fikrini sevdim. Aklıma gelmemişti
Genelde Blender’ı daha çok kullandığım için Onshape’te knurling yapma eğitimini takip ettim. Bu araç o kadar geometriyi pek sevmiyor, çalışırken kasıyor ama README’de bağlantısı verilen Onshape dosyasına istediğin gibi bakabilirsin
Yeni başlayanlar için yazıya Pomodoro’nun adını aslında döner enkoderli fiziksel bir zamanlayıcıdan aldığını eklemek iyi olurdu
https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
Bir gün hedeflediği gibi kırmızı bir e-ink ekran kullanırsa Pepe’ye eğlenceli bir alternatif olabilir gibi duruyor
[0] - https://github.com/lvgl/lvgl
Android telefonda Visual Timer uygulamasını [0] kullanıyordum ve genel olarak harikaydı; ama telefonu ortadan kaldırabilsem elbette daha iyi olurdu
[0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
Bana göre Pomodoro tekniği için en iyi UX tam da o fiziksel mutfak zamanlayıcısında bulunuyor
Ancak öyle bir şey yapmak için bilgi ve becerilerimin sınırlarıyla yüzleşmem gerekiyordu; bir yandan da bunu kendi yöntemimle denemek istedim. Üstelik sonunda o e-paper ekranı gerçekten çok sevdim
Güncelleme: burada https://github.com/robertolupi/augmented-awareness/tree/main...
Ofiste kullananlar veya kalan süreye bakmak için ekrana bakmak istemeyenler için cihazın üstündeki LED gösterge yararlı olabilir. Güzel bir ışık çubuğu biçiminde kırmızı ya da yeşil yanar; böylece ekranı göremeyen karşı taraftaki kişi de o anda rahatsız edip edemeyeceğini anlayabilir. İstersen bunu ilerleme gösteren bir ışık çubuğu olarak da yapabilirsin