An ESP32-S3 desk companion for ADHD users. Combines focus timers, wellness reminders, and desk controller features in a compact touchscreen device with a web dashboard for remote control.
Focus & Productivity
- Pomodoro timer with configurable work/break cycles
- Deep focus session timer
- Task anchor — "Working on: X" displayed on screen and web dashboard
- Daily stats tracking (pomodoros completed, focus sessions, drinks, stretches)
Wellness Reminders
- Hydration tracking with drink logging and countdown to next reminder
- Stretch break timer with proactive reminders
- Audio alerts through onboard speaker (ES8311 codec)
Information
- Clock (NTP-synced when connected to WiFi)
- Weather display (temperature, humidity, wind, conditions via Open-Meteo API)
- 12/24 hour time format
Web Dashboard
- Preact SPA with DaisyUI dark theme
- Real-time sync via WebSocket
- Remote control — start/stop timers from your phone
- Settings configuration — all durations, reminders, volume, task, weather zip code
- Daily stats dashboard
- WiFi configuration
Board: Freenove FNK0104 ESP32-S3 CYD 2.8" (Amazon)
- ESP32-S3 with 8MB flash
- 2.8" ILI9341 320x240 TFT display (SPI)
- FT6336U capacitive touch (I2C)
- ES8311 audio codec + FM8002E amplifier (I2S)
- WS2812B NeoPixel LED
- USB-C (native USB)
- WiFi + Bluetooth
Enclosure: 3D-printed deskpad with 4 mechanical keyboard switches and EC11 rotary encoder
Input Expansion: PCF8574 I2C GPIO expander for buttons and encoder (shares I2C bus with touch)
| Screen | Color | Description |
|---|---|---|
| Home | Navy | Clock, task anchor, next reminder, daily stats, WiFi status |
| Pomodoro | Red | 25-min work timer with arc visualization |
| Focus | Purple | 50-min deep focus timer |
| Hydration | Blue | Drink countdown, last drink time, daily count |
| Stretch | Green | 5-min stretch break timer |
| Weather | Grey | Temperature, conditions, humidity, wind |
- PlatformIO
- Freenove FNK0104 ESP32-S3 CYD board
# Build
pio run -e cyd-s3
# Flash (put board in bootloader mode first)
pio run -e cyd-s3 -t upload
# Serial monitor
pio device monitor- Unplug USB
- Hold the BOOT button
- Plug USB back in
- Release BOOT after 1 second
- Run
pio run -e cyd-s3 -t upload
- Flash the firmware
- Connect to "DopaDeck-Setup" WiFi from your phone
- Open http://192.168.4.1
- Enter your WiFi credentials
- Device connects to your network and syncs time via NTP
- Access the web dashboard at the device's IP (shown on home screen)
dopa-deck/
├── platformio.ini # Build config for ESP32-S3 CYD
├── extra_script.py # Pre-build: removes ARM assembly from LVGL
├── CLAUDE.md # AI assistant context
├── include/
│ ├── config.h # Pin definitions, timer defaults
│ ├── lv_conf.h # LVGL 9.x configuration
│ └── splash.h # Generated splash screen bitmap (gitignored)
├── src/
│ ├── main.cpp # Entry point, splash, init sequence
│ ├── hal/ # Hardware abstraction
│ │ ├── display.cpp # TFT_eSPI → LVGL display driver
│ │ ├── touch.cpp # FT6336U I2C touch → LVGL input
│ │ ├── buttons.cpp # Physical + virtual buttons, PCF8574
│ │ ├── pcf8574.cpp # I2C GPIO expander driver
│ │ ├── audio.cpp # ES8311 codec + I2S tone generation
│ │ ├── es8311.cpp # ES8311 register-level driver
│ │ └── es8311_reg.h # ES8311 register definitions
│ ├── app/ # Application logic
│ │ ├── app_state.h # Screen state enum
│ │ ├── screen_manager.cpp # Navigation, transitions, remote commands
│ │ ├── timer_engine.cpp # Shared countdown engine
│ │ └── reminder_scheduler.cpp # Periodic hydration/stretch reminders
│ ├── screens/ # LVGL screen modules
│ │ ├── scr_home.cpp # Home: clock, task, stats, WiFi
│ │ ├── scr_pomodoro.cpp
│ │ ├── scr_focus.cpp
│ │ ├── scr_hydration.cpp
│ │ ├── scr_stretch.cpp
│ │ ├── scr_weather.cpp
│ │ ├── scr_reminder.cpp # Alert overlay
│ │ └── scr_splash.cpp
│ ├── web/ # WiFi + web server
│ │ ├── wifi_manager.cpp # Captive portal + STA mode + NTP
│ │ ├── web_server.cpp # REST API + WebSocket + Preact SPA
│ │ └── weather.cpp # Open-Meteo weather API client
│ └── storage/
│ └── settings.cpp # NVS persistence for all config
└── docs/
├── plans/ # Implementation plans
├── ideas/ # Concept art and feature ideas
└── wiring-diagram.md # PCF8574 + button + encoder wiring
- MCU: ESP32-S3 (Arduino framework)
- Display: LVGL 9.x + TFT_eSPI
- Audio: ESP-IDF I2S + ES8311 codec
- Web: Preact + DaisyUI + Chart.js (CDN) + WebSocket
- Build: PlatformIO
MIT