- รีโพซิทอรีของ ตัวจับเวลาโฟกัสแบบกายภาพ ที่ใช้ ESP32 โดยใช้จอ ePaper และปุ่มหมุนโรตารีเป็นอุปกรณ์รับอินพุต เพื่อทำงานตามลำดับงาน–พักแบบโพโมโดโร
- โค้ดมีการ ลบแอสเซ็ตและฟอนต์บางส่วนออก จึงยังไม่สามารถนำไปใช้ได้ทันที แต่หากต้องการก็สามารถแก้ไขให้เหมาะกับการใช้งานของตนเองได้
- ฮาร์ดแวร์ประกอบด้วย ESP32, WaveShare e-Paper HAT ขนาด 4.26 นิ้ว 800x480, โรตารีเอนโคเดอร์ KY-040, LED WS2812, คอนเนกเตอร์ USB-C, เคสพิมพ์ 3D และตัวต้านทาน·คาปาซิเตอร์
- ePaper ไม่มีแบ็กไลต์จึงลดสิ่งรบกวนระหว่างทำงานได้ และรุ่น 4.26 นิ้วรองรับ partial refresh 0.3 วินาที ทำให้หลีกเลี่ยงการกะพริบดำ–ขาวตอนรีเฟรชได้
- ซอฟต์แวร์ใช้ C++ และ Arduino framework, PlatformIO, ไลบรารี GxEPD2 พร้อมฟีเจอร์อย่างการเลือกพรีเซ็ต การแจ้งเตือนด้วย LED สถิติช่วงพัก และการวนพักยาว
ภาพรวมโปรเจ็กต์
- รีโพซิทอรีนี้เก็บโค้ดและไฟล์ออกแบบสำหรับ ตัวจับเวลาโฟกัสที่ใช้ ESP32
- ใช้ ปุ่มหมุนโรตารี สำหรับอินพุต และใช้จอ ePaper สำหรับการแสดงผล
- โค้ดในรีโพซิทอรีมีการลบแอสเซ็ตและฟอนต์บางส่วนออก จึง ยังไม่อยู่ในสภาพพร้อมใช้งานทันที
- หากต้องการ สามารถแก้ไขโค้ดให้ตรงกับความต้องการของตนเองแล้วนำไปใช้ได้
- ผลงานที่ประกอบเสร็จแล้วสามารถดูได้บน MakerWorld เช่นกัน
ชิ้นส่วนที่ใช้
- องค์ประกอบหลักมีดังนี้:
- ESP32 โดยในตัวอย่างใช้ AZDelivery ESP32 NodeMCU
- WaveShare 4.26inch e-Paper display HAT, 800x480
- จออื่นก็อาจใช้งานได้ แต่ UI ถูกออกแบบมาให้พอดีกับความละเอียดนี้
- โรตารีเอนโคเดอร์ KY-040 และปุ่มกด
- LED WS2812 จำนวน 1 ดวง
- สามารถแทนด้วย RGB LED แบบธรรมดาได้
- คอนเนกเตอร์ USB-C
- หากใช้คอนเนกเตอร์ USB-C แบบ 2 เส้น อาจต้องใช้สาย USB-A to USB-C เพื่อจ่ายไฟ
- เคสพิมพ์ 3D
- ตัวต้านทานสำหรับ LED, ตัวต้านทาน pull-up สำหรับสวิตช์ และคาปาซิเตอร์ 0.1uF สำหรับลดสัญญาณรบกวนของโรตารีเอนโคเดอร์
- อุปกรณ์เสริมที่เลือกใช้ได้ เช่น ตุ้มน้ำหนักถ่วงล้อรถและยางรองฐาน
แรงบันดาลใจและเป้าหมายการออกแบบ
- โปรเจ็กต์นี้เริ่มต้นจากความตั้งใจจะทำ ตัวจับเวลาโฟกัส ให้เพื่อน
- ผู้สร้างชอบลองเทคนิคเพิ่มประสิทธิภาพการทำงาน และมีนิสัยใช้เวลาราวหนึ่งเดือนในแต่ละปีเพื่อทำโปรเจ็กต์ที่ช่วยคนอื่นได้
- หลังจากซื้อเครื่องพิมพ์ 3D BambuLab X1C ก็อยากนำมันมาใช้งาน และด้วยประสบการณ์ที่เคยฝึกงานด้านอิเล็กทรอนิกส์ก่อนเปลี่ยนมาทำซอฟต์แวร์วิศวกรรม จึงอยากสร้างอุปกรณ์ที่จับต้องได้
- เป้าหมายการออกแบบมีสามข้อ
- ต้องเป็นอุปกรณ์จริง
- ต้องสนุก
- ต้องใช้งานได้อย่างเป็นธรรมชาติ
- แม้จะมีงานก่อนหน้าอย่าง Focus Dial by Salim Benbouziyane อยู่แล้ว แต่ก็อยากสร้างขึ้นเองตั้งแต่ต้น
เหตุผลในการเลือกชิ้นส่วน
-
ESP32
- นี่เป็นความพยายามครั้งที่สองในการทำอะไรบางอย่างด้วยไมโครคอนโทรลเลอร์หลังจากห่างไปนาน และคุ้นเคยกับ ESP32 อยู่แล้วจึงกลับมาเริ่มได้ง่าย
- มีการหาข้อมูลล่วงหน้าเพื่อตรวจสอบว่าสนับสนุนจอแสดงผลหรือไม่
-
จอ ePaper
- คำแนะนำการเดินสายจออยู่ใน
docs/display_wiring.md
- หนึ่งในเป้าหมายหลักของโปรเจ็กต์คือให้อุปกรณ์ ไม่รบกวนโฟลว์การทำงาน จึงต้องการจอที่ไม่มีแบ็กไลต์
- ต้องการหน้าจอที่ใหญ่พอจะอ่านได้เมื่อวางไว้บนโต๊ะ
- หลังจากสั่งและลองใช้จอ WaveShare ePaper หลายรุ่น จึงเลือกโมเดล 4.26 นิ้ว
- ความละเอียดดี
- ขนาดเหมาะสม
- รองรับ partial refresh และใช้เวลารีเฟรช 0.3 วินาที
- ไม่มีอาการกะพริบดำ–ขาวที่รบกวนสายตาระหว่างรีเฟรช
- ตอนแรกอยากใช้จอขาวดำ-แดง แต่รุ่นที่ชอบใช้เวลารีเฟรชนาน 16 วินาทีและไม่รองรับ partial refresh จึงตัดออก
- เนื่องจากไม่มีแบ็กไลต์ หากโต๊ะไม่สว่างพอจะอ่านหน้าจอตอนกลางคืนได้ยาก ซึ่งมองว่านี่ “ไม่ใช่บั๊ก แต่เป็นฟีเจอร์”
-
โรตารีเอนโคเดอร์
- มองว่าการใช้ ปุ่มหมุน เป็นอุปกรณ์อินพุตนั้นเป็นธรรมชาติที่สุด
- อินพุตแบบปุ่มหมุนทำให้การออกแบบเมนูซับซ้อนขึ้น และต้องจัดการ debounce ของอินพุตให้ดี
- เพิ่มคาปาซิเตอร์ 0.1uF ที่ขา CLK และ DT เพื่อลดสัญญาณรบกวน
-
LED
- ในเวอร์ชันวนซ้ำช่วงแรกยังไม่มีแผนจะใช้ LED
- จอที่ไม่มีแบ็กไลต์อาจทำให้ช่วงเวลาที่โฟกัสจบลงดูไม่เด่นพอ
- จึงทดลองหลายทางเลือกสำหรับการแจ้งเตือน
- buzzer ทำให้ผู้ใช้ตกใจและให้ประสบการณ์ที่ไม่ดี
- ลำโพงในการตั้งค่าที่ลองใช้มีทั้งเสียงจี่และเสียงครางค่อนข้างมาก
- LED WS2812 สามารถทำแอนิเมชันได้ด้วยไลบรารี NeoPixel และใช้งานง่าย
- WS2812 ยังมีข้อดีคือไม่ต้องใช้ขาเอาต์พุตจำนวนมาก
- สุดท้าย LED ทำงานได้ดีในการแสดงสถานะต่าง ๆ และมีการเพิ่มฉากบังเล็ก ๆ กับชั้นกระจายแสงในเคสเพื่อให้ LED ดูสวยขึ้น
เคสและการออกแบบทางกายภาพ
- เคสประกอบด้วยสองส่วนคือ ฐานและฝาปิด
- เนื่องจากออกแบบให้พิมพ์กรอบจอเป็นส่วนหนึ่งของฐานในครั้งเดียว จึงเกิดปัญหามุมบนโก่งเล็กน้อยระหว่างการพิมพ์
- การเลือกวางปุ่มหมุนไว้ด้านหน้าถือเป็นจุดที่น่าเสียดาย
- เพราะชิ้นงานพิมพ์และชิ้นส่วนอิเล็กทรอนิกส์มีน้ำหนักเบา เมื่อต้องกดสวิตช์ของปุ่มหมุน อุปกรณ์ทั้งชิ้นอาจเลื่อนถอยหลังได้
- แก้ปัญหาโดยเพิ่มยางรองฐานและตุ้มน้ำหนักถ่วงล้อรถไว้ด้านล่าง
โครงสร้างซอฟต์แวร์
- ซอฟต์แวร์เขียนด้วย C++ และใช้ Arduino framework
- ใช้ PlatformIO สำหรับจัดการโปรเจ็กต์
- การแสดงผลพึ่งพาไลบรารี GxEPD2 อย่างมาก
- โค้ดในรีโพซิทอรีค่อนข้างยังไม่เป็นระเบียบ เพราะมีการคัดลอก-วางและโค้ดเก่าที่ยังไม่ได้เก็บกวาดเพื่อให้ทำโปรเจ็กต์เสร็จทันกำหนด
- โค้ดบางส่วนถูกสร้างด้วย AI โดยหลัก ๆ คือ Claude เพื่อให้ทันเดดไลน์ของโปรเจ็กต์
- เนื่องจากเป็นโปรเจ็กต์ที่ทำให้เพื่อน จึงมีการใส่ easter egg และองค์ประกอบสนุก ๆ ไว้ด้วย
- มีฟีเจอร์แสดงข้อมูลสุ่มบนหน้าจอระหว่างช่วงโฟกัส
ลำดับการใช้งานอุปกรณ์
- เมื่ออุปกรณ์เริ่มทำงาน สามารถเปลี่ยนการตั้งค่าหรือเข้าสู่ โหมดเลือกพรีเซ็ต ได้
- พรีเซ็ตมีให้เลือกหนึ่งในสามแบบ
- เมื่อเริ่มตัวจับเวลาและเวลาหมด LED จะกะพริบและมีข้อความแสดงบนหน้าจอ
- ผู้ใช้สามารถทำงานต่อได้ หรือเริ่มพักหลังจากนั้น
- ระหว่างพักสามารถดูสถิติได้
- ตามค่าเริ่มต้น จะมีช่วงพักยาวหลังครบทุก 4 รอบ
การพัฒนาและการปรับแต่ง
- เครื่องมือที่ต้องใช้สำหรับการพัฒนา:
- PlatformIO
- Python 3.13 ขึ้นไป สำหรับสร้างแอสเซ็ตใหม่
- หากต้องการเตรียมภาพ ไอคอน และฟอนต์ ต้องรันสคริปต์
generate_assets.py
- ปรับขนาดภาพ
- แปลงเป็นฟอร์แมตที่ถูกต้อง
- สร้างโค้ด C++ เพื่อนำเข้าโปรเจ็กต์
- ตัวอย่างการรันมีดังนี้
uv sync
uv run scripts/generate_assets.py
- พรีเซ็ตถูกกำหนดไว้ใน
src/main.cpp
- ตัวอย่างพรีเซ็ตเริ่มต้นคือ Emails, Coding, Focus
- Emails: โฟกัส 15 นาที, พัก 5 นาที, พักยาว 15 นาที
- Coding: โฟกัส 45 นาที, พัก 15 นาที, พักยาว 30 นาที, จำนวนรอบ 2
- Focus: โฟกัส 25 นาที, พัก 5 นาที, พักยาว 20 นาที
การแมปพิน
- โรตารีเอนโคเดอร์ KY-040:
- จอ WaveShare ePaper ขาวดำ 4.26 นิ้ว:
- BUSY: 4
- RST: 16
- DC: 17
- CS: 5
- CLK: 18
- DIN: 23
- LED WS2812:
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อย่างน้อยก็สำคัญกับผม ผมทำให้ มิเตอร์ไฟฟ้า “ฉลาดขึ้น” ด้วยการติดอุปกรณ์ที่ใช้ ESP32 กับ photoresistor วัดการกะพริบของมิเตอร์ไฟฟ้า ถึงจะดูหยาบ ๆ แต่ทำงานได้ดี ทุกครั้งที่ไปโรงรถแล้วเห็นอุปกรณ์เล็ก ๆ กะพริบอยู่ก็รู้สึกสนุก และทำให้อยากทำโปรเจกต์ถัดไปต่อ มันให้ความมั่นใจว่าผมสร้างอะไรบางอย่างได้ ทำสำเร็จได้ และทำให้ชีวิตดีขึ้นได้
อาจฟังดูโง่ ๆ แต่ผมรับโปรเจกต์ในโพสต์ต้นฉบับในแบบนั้น
ถ้าคุณกำลังเขียนโปรแกรมจอ eInk กับไมโครชิปเพื่อแก้นิสัยผัดวันประกันพรุ่ง ก็ควรหยุดโปรเจกต์นั้น ซื้อไทเมอร์แบบจับต้องได้ แล้วไปทำสิ่งที่ต้องทำ
ถ้าก่อนทำงานคุณอยากช็อปปิงหาไทเมอร์ ผมจะช่วยลดเวลาค้นหาให้ อันนี้ก็ใช้งานได้ดี: https://www.amazon.com/dp/B07TLC9SFZ แน่นอนว่าไทเมอร์อะไรก็ได้
ไปทำงานนั้นเถอะ มันคุ้มค่า
แต่โพสต์ต้นฉบับเขียนชัดเจนว่าเป็นโปรเจกต์ที่ทำอะไรบางอย่างให้เพื่อน พร้อมลองใช้เครื่องมือใหม่ ๆ
โปรเจกต์แฮ็ก สนุก ๆ ไม่จำเป็นต้องตอบสนองความต้องการจริงของตลาดเสมอไป แค่สนุกก็พอ
[0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
ส่วนตัวผมชอบดีไซน์ ไทเมอร์ทรงจานหมุน แบบนี้: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
ถ้ากำลังหาโปรเจกต์แฮ็กกาธอนอยู่ ระบบนิเวศของ E-ink ค่อนข้างโตเต็มที่แล้ว โปรแกรมได้ง่าย และ AI อย่าง Claude ก็เข้าใจพื้นผิว API ได้ดี โดยทั่วไปผู้คนมักไม่รู้ว่ากำลังดูอะไรอยู่ เลยต้องอธิบายว่าเป็น “หน้าจอแบบ Kindle” แต่ดูเหมือนในห้องนั่งเล่น คนจะชอบจอ e-ink มากกว่าจอมีแบ็กไลต์ เพราะรบกวนสายตาน้อยกว่ามาก
อ้างอิงเพิ่มเติม E-ink [0] และ Pomodoro [1] ต่างก็เป็นหัวข้อที่ผมสนใจเจาะลึกอยู่พอสมควร
[0] https://sambroner.com/posts/raspberry-pi-train
[1] https://sambroner.com/posts/personal-analytics-2024
ผมชอบการเลือกหน้าจอมาก และชอบที่ README อธิบายเหตุผลด้านวัตถุประสงค์และการใช้งานไว้อย่างดี
มีความคิดบางอย่างเกี่ยวกับดีไซน์ของตัววัตถุเอง ผมเองก็รู้สึกว่าส่วนนี้ยากมาก และใช้เวลาเยอะกับการปรับปรุงซ้ำ ๆ ถ้าวางปุ่มหมุนให้กว้างและแบนไว้ด้านบนของอุปกรณ์ ก็จะวางหน้าจอไว้ตรงกลางได้ ทำให้อุปกรณ์เล็กลง และลดโอกาสที่กล่องจะไถลตอนหมุนได้ด้วย การลบมุมและทำขอบโค้งช่วยเพิ่มความเนี้ยบได้มาก ความต่างระหว่างขอบคมกับขอบมนเป็นรายละเอียดเล็ก ๆ แต่ให้ความรู้สึกต่างกันค่อนข้างมาก
ถ้าเมนูมีสามอย่างเสมอ ลองใช้ปุ่มสามปุ่มด้านบนแบบปุ่ม “snooze” ของนาฬิกาปลุกแทนปุ่มหมุนไหม การใช้งานจะน้อยขั้นตอนลง ถ้าใช้ฟิลาเมนต์กึ่งโปร่งแสง ก็ทำชิ้นส่วน “ท่อนำแสง” เท่ ๆ ได้ด้วย เช่น ถ้าทำกล่อง LED เป็นชิ้นเดียว ก็อาจให้ความรู้สึกเหมือนแผงหน้าปัดยุค 80 หรือถ้าพิมพ์ขอบจอแล้วทำให้ส่วนนั้นสว่าง ก็อาจได้ดีไซน์ที่มินิมอลกว่า
ผมชอบคิดเรื่องพวกนี้ เลยช่วยไม่ได้ สงสัยว่าปุ่มหมุนออกแบบยังไง ใช้ OpenSCAD หรือเปล่า? ลาย knurling ดูดี และดูเหมือนสร้างด้วยโปรแกรม
ถ้าออกแบบปุ่มหมุนใหม่ ผมน่าจะย้ายไปไว้ด้านบน โปรเจกต์นี้มีไทม์ไลน์รวม 4 สัปดาห์ และตอนเจอปัญหาเรื่องน้ำหนัก ผมไม่มั่นใจพอจะทำเคสใหม่แล้วพิมพ์ต้นแบบออกมา แต่ถ้าทำแบบนั้นก็น่าจะดีขึ้นแน่นอน
ผมใส่การทำขอบมน/ลบมุมไว้เกือบทุกขอบ และพิมพ์เคสสุดท้ายด้วย fuzzy skin เพื่อให้รู้สึกพรีเมียมขึ้น
เดิมทีปุ่มหมุนตั้งใจไว้ให้ใช้เปลี่ยนเวลาของไทเมอร์ด้วย เลยรู้สึกว่าไดอัลเหมาะกว่า แต่สุดท้ายไม่ได้เป็นแบบนั้น สำหรับเมนูตอนนี้ ปุ่มสามปุ่มอาจให้ UX ที่ดีกว่า อุปกรณ์ก็จะเล็กลงด้วย
เดิมทีแผงบังแสงเริ่มจากการกันแสงรั่ว แล้วภายหลังผมพิมพ์ใหม่เป็นสีขาวพร้อมฟิล์มพลาสติกกระจายแสง เพื่อเพิ่มการกระจายแสงของ LED เล็กน้อย ผมชอบไอเดียการวางแถบ LED ไว้ที่ขอบหน้าจอ ไม่เคยนึกถึงเลย
ปกติผมใช้ Blender มากกว่า เลยทำตามบทเรียนสอนทำ knurling ใน Onshape เครื่องมือนี้ไม่ค่อยชอบเรขาคณิตระดับนั้น เลยหน่วง ๆ เวลาทำงาน แต่ไฟล์ Onshape ที่ลิงก์ไว้ใน README เปิดดูได้ตามสบาย
สำหรับมือใหม่ น่าจะใส่ไว้ในบทความว่า Pomodoro เดิมทีได้ชื่อมาจากไทเมอร์แบบจับต้องได้ที่มี rotary encoder
https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
ถ้าวันหนึ่งได้ใช้หน้าจอ e-ink สีแดงตามที่ตั้งใจไว้ ก็น่าจะเป็นทางเลือกที่น่าสนุกแทน Pepe
[0] - https://github.com/lvgl/lvgl
ผมใช้แอป Visual Timer [0] บนโทรศัพท์ Android มาโดยตลอด และโดยรวมก็ยอดเยี่ยม แต่ถ้าเก็บโทรศัพท์ให้พ้นมือได้ก็คงดีกว่าแน่นอน
[0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
สำหรับผม UX ที่ดีที่สุดของเทคนิค Pomodoro อยู่ในตัวจับเวลาในครัวแบบกายภาพนั้นเอง
แต่ถ้าจะทำของแบบนั้น ผมต้องเผชิญกับขีดจำกัดด้านความรู้และทักษะของตัวเอง และก็อยากลองทำในแบบของตัวเองด้วย อีกอย่าง สุดท้ายแล้วผมก็ชอบ หน้าจอกระดาษอิเล็กทรอนิกส์ นั้นมากจริง ๆ
อัปเดต: อยู่ที่นี่ https://github.com/robertolupi/augmented-awareness/tree/main...
สำหรับคนที่ใช้ในออฟฟิศ หรือคนที่ไม่อยากมองหน้าจอเพื่อดูเวลาที่เหลือ ไฟ LED แสดงสถานะ ที่ด้านบนของอุปกรณ์น่าจะมีประโยชน์ เป็นไลต์บาร์สวย ๆ ที่เปิดไฟสีแดงหรือสีเขียว เพื่อให้คนที่อยู่อีกฝั่งซึ่งมองไม่เห็นหน้าจอรู้ได้ว่าตอนนี้ขัดจังหวะได้หรือไม่ ถ้าต้องการก็ทำเป็นไลต์บาร์แสดงความคืบหน้าได้ด้วย