Skip to content

brewpirate/dopa-deck

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dopa-Deck

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.

What It Does

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

Hardware

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)

Screens

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

Quick Start

Requirements

Build & Flash

# 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

Bootloader Mode (required for flashing)

  1. Unplug USB
  2. Hold the BOOT button
  3. Plug USB back in
  4. Release BOOT after 1 second
  5. Run pio run -e cyd-s3 -t upload

First Boot

  1. Flash the firmware
  2. Connect to "DopaDeck-Setup" WiFi from your phone
  3. Open http://192.168.4.1
  4. Enter your WiFi credentials
  5. Device connects to your network and syncs time via NTP
  6. Access the web dashboard at the device's IP (shown on home screen)

Project Structure

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

Tech Stack

  • 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

License

MIT

About

Your ADHD Desk buddy

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors