+------------------------------------------------------------------+
| ______ _ __ __ _ _ |
||___ / | | \ \ / / | | | | |
| / / ___ _ __ | |__ _ _ _ __ \ \ /\ / /_ _| |_ ___| |__ |
| / / / _ \ '_ \| '_ \| | | | '__| \ \/ \/ / _` | __/ __| '_ \ |
| / /_| __/ |_) | | | | |_| | | \ /\ / (_| | || (__| | | ||
|/_____\___| .__/|_| |_|\__, |_| \/ \/ \__,_|\__\___|_| |_||
| | | __/ | |
| |_| |___/ |
+------------------------------------------------------------------+
DIY смарт-часы с Material You 3 интерфейсом, вдохновлённые дизайном Google Pixel Watch.
Полностью с нуля. Полностью на Rust. Полностью открытый исходный код.
Zephyr Watch — это самодельные смарт-часы на базе ESP32-S3-Zero-N4R2, визуально и концептуально вдохновлённые Google Pixel Watch 3. Проект создан с целью максимально воспроизвести опыт Wear OS на доступном и открытом железе.
Весь системный код написан на Rust с использованием esp-idf-hal. Прошивка загружается и исполняется через встроенную MicroPython VM прямо с SD-карты — без перепрошивки чипа при обновлениях.
Основная идея: запустить полноценный watch-experience — циферблаты, уведомления, приложения, управление питанием — на чипе за несколько долларов.
╔══════════════════════════════════════════════════════════════════════╗
║ КОНЦЕПЦИЯ ЗАГРУЗКИ ПРОШИВКИ ║
╠══════════════════════════════════════════════════════════════════════╣
║ ║
║ [ESP32-S3 Flash] [MicroSD карта] ║
║ ┌─────────────┐ ┌──────────────────────┐ ║
║ │ Bootloader │ ────────► │ firmware/ │ ║
║ │ (на плате) │ монтир. │ ├── main.py │ ║
║ │ │ SD-карты │ ├── system/ │ ║
║ │ Rust core │ │ ├── drivers/ │ ║
║ │ HAL init │ │ └── apps/ │ ║
║ └─────────────┘ └──────────────────────┘ ║
║ │ │ ║
║ ▼ ▼ ║
║ ┌─────────────────────────────────────────────────┐ ║
║ │ MicroPython VM │ ║
║ │ Прошивка интерпретируется и исполняется VM │ ║
║ │ прямо с карты памяти без перепрошивки чипа. │ ║
║ │ Обновление = замена файлов на SD. │ ║
║ └─────────────────────────────────────────────────┘ ║
║ ║
╠══════════════════════════════════════════════════════════════════════╣
║ ЗАЧЕМ VM? ║
║ · Обновление прошивки = просто скопировать файлы на SD ║
║ · Не нужен USB-кабель для обновлений ║
║ · Скрипты изолированы от системного bootloader'а ║
║ · Пользователь может писать свои watchfaces на Python ║
╚══════════════════════════════════════════════════════════════════════╝
╔══════════════════════════════════════════════════════════════════════╗
║ ДИСПЛЕЙ — ВЫБОР КОНФИГУРАЦИИ ║
╠══════════════════════════════════════════════════════════════════════╣
║ ║
║ К устройству подключается ОДИН из двух дисплеев на выбор: ║
║ ║
║ Вариант A Вариант B ║
║ ┌───────────────────┐ ┌───────────────────┐ ║
║ │ ST7789 │ ИЛИ │ SSD1306 │ ║
║ │ 240×240, SPI │ │ 128×64, I2C │ ║
║ │ Цветной IPS │ │ Монохромный OLED │ ║
║ │ + тачскрин │ │ Низкое потребление│ ║
║ │ XPT2046 │ │ ~0.5 мА │ ║
║ └───────────────────┘ └───────────────────┘ ║
║ ║
║ Тип дисплея задаётся в config.py на SD-карте. ║
║ Прошивка автоматически загружает нужный драйвер. ║
╚══════════════════════════════════════════════════════════════════════╝
[ BOOT ] Загрузчик с Flash (на плате, не изменяется)
│
▼
[ MOUNT ] Монтирование SD-карты → поиск /firmware/main.py
│
▼
[ VM ] Запуск MicroPython VM → интерпретация прошивки с SD
│
▼
[ INIT ] Инициализация компонентов (дисплей, энкодер, питание)
│
▼
[ LED ] Световая индикация: мигание → успешный старт
│
▼
[ UI ] Загрузка LVGL, шрифтов, темы Material You 3
│
▼
[ FACE ] Циферблат: время, дата, заряд, статус
│
▼
[ IDLE ] Ожидание ввода → 10 сек → Deep Sleep (~0.01 мАч)
│
▼
[ WAKE ] Пробуждение: кнопка / энкодер / касание экрана
| Компонент | Модель | Описание |
|---|---|---|
| Микроконтроллер | ESP32-S3-Zero-N4R2 | 4MB Flash, 2MB PSRAM, WiFi, BLE 5.0 |
| Дисплей (на выбор) | ST7789 | 240×240, SPI, цветной IPS |
| Дисплей (на выбор) | SSD1306 | 128×64, I2C, монохромный OLED |
| Тачскрин (только со ST7789) | XPT2046 | Резистивный, SPI |
| Управление | KY-040 | Ротационный энкодер с кнопкой |
| Батарея | Li-ion | 400 мАч |
| Зарядка | TP4056 | Магнитные pogo-pin контакты |
| Хранилище | MicroSD | До 32GB, FAT32 |
| Диод | 1N5819 | Защита от обратного тока (Schottky) |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ПИТАНИЕ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[USB] → [Mag+] → TP4056(IN+) → BAT+ → [Li-ion+] → 1N5819 → 5V [ESP32]
↓
[Mag−] → IN− → BAT− → [Li-ion−] → GND [ESP32]
↓
OUT+ → 1N5819 → 5V [ESP32] (load-sharing)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ВАРИАНТ A: ST7789 (SPI) + XPT2046 ЭНКОДЕР KY-040
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO18 → SCLK GPIO4 → CLK
GPIO23 → MOSI GPIO2 → DT
GPIO17 → DC GPIO1 → SW
GPIO16 → CS (ST7789)
GPIO5 → RES
GPIO15 → CS (XPT2046)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ВАРИАНТ B: SSD1306 (I2C) SD-КАРТА (SPI)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO21 → SDA GPIO9 → CS
GPIO22 → SCL GPIO11 → MOSI
GPIO12 → MISO
GPIO10 → SCK
Прошивка хранится и запускается с SD-карты.
Bootloader на Flash неизменен — обновления делаются заменой файлов на карте.
/ ← Корень SD-карты (FAT32)
│
├── firmware/ ← Прошивка (MicroPython)
│ ├── main.py ← Точка входа VM
│ ├── config.py ← Тип дисплея, GPIO, параметры
│ ├── display/ ← Драйверы дисплеев
│ │ ├── st7789.py
│ │ └── ssd1306.py
│ ├── input/ ← Драйверы ввода
│ │ ├── encoder.py
│ │ └── touch.py
│ ├── ui/ ← Интерфейс Material You 3
│ │ ├── watchface.py
│ │ ├── menu.py
│ │ └── theme.py
│ └── power/ ← Управление питанием
│ └── sleep.py
│
├── system/ ← Системные ресурсы
│ ├── fonts/ ← Шрифты для LVGL
│ └── lib/
│
├── watchfaces/ ← Пользовательские циферблаты
├── apps/ ← Сторонние приложения (Python)
├── backup/ ← Резервные копии настроек
└── logs/
└── system.log ← Системный лог (циклический буфер)
Android-For-ESP32S3/
│
├── .github/
│ └── workflows/ ← CI/CD: автосборка
│
├── Bootloader/ ← Загрузчик (Rust, прошивается 1 раз)
│ ├── src/
│ │ ├── main.rs ← HAL init, монтирование SD, запуск VM
│ │ └── rtc.rs ← Модуль RTC
│ └── Cargo.toml
│
├── Firmware/ ← Прошивка (MicroPython, живёт на SD)
│ ├── main.py
│ ├── config.py
│ ├── display/
│ ├── input/
│ ├── ui/
│ └── power/
│
├── LICENSE ← GPL-3.0
└── README.md
| Действие | Результат |
|---|---|
| Вращение влево/вправо | Навигация по меню |
| Одиночное нажатие | Выбор / подтверждение |
| Двойное нажатие | Назад |
| Долгое нажатие (1 сек) | Главный экран |
| Жест | Результат |
|---|---|
| Тап | Выбор элемента |
| Свайп влево/вправо | Переключение экранов |
| Свайп вниз | Шторка уведомлений |
| Режим | Потребление | Описание |
|---|---|---|
| Активный (ST7789) | ~80–120 мА | Полный UI, WiFi активен |
| Активный (SSD1306) | ~20–35 мА | Монохромный UI |
| Режим ожидания | ~15–25 мА | Дисплей выкл., ядра активны |
| Deep Sleep | ~0.01–0.05 мА | Только RTC работает |
| Срок работы (ST7789) | ~2–4 дня | 400 мАч |
| Срок работы (SSD1306) | ~7–10 дней | 400 мАч |
⚡ Частота CPU снижена до 80 MHz для уменьшения тепловыделения.
- Rust (latest stable)
- espup
- cargo-espflash
cargo install espup
espup install
source $HOME/export-esp.shgit clone --recurse-submodules https://github.com/DenBroLiik/Android-For-ESP32S3.git
cd Android-For-ESP32S3/Bootloader
cargo +esp build --release
cargo espflash flash --release --monitor- Bootloader на Rust (HAL init, монтирование SD)
- Модуль RTC (хранение времени после Deep Sleep)
- Понижение частоты CPU до 80 MHz
- Видеопамять за счёт SRAM
- Драйвер распределения памяти SRAM + PSRAM
- Инициализация компонентов — унифицированный init для дисплея, энкодера, SD
- Световая индикация — статусный LED: загрузка, ошибка, зарядка
- Подключение MicroPython VM — запуск прошивки с SD через интерпретатор
- Разметка карты памяти — стандартизированная структура FAT32
- Драйвер ST7789 (цветной дисплей)
- Драйвер SSD1306 (OLED)
- Material You 3 UI через LVGL
- Получение уведомлений через ESP-NOW
- OTA-обновления по WiFi
- SDK для watchfaces на Python
- Bluetooth синхронизация с Android
Changed
- Понижение частоты процессора с MAX до 80 MHz для снижения температуры чипа при длительной работе.
Added
- Видеопамять за счёт SRAM — расширение буфера кадра для рендеринга UI.
- Драйвер распределения оперативной памяти SRAM + PSRAM — динамическое управление доступными пулами памяти.
Added
- Базовый модуль RTC для загрузчика — хранение и восстановление системного времени после Deep Sleep и перезагрузки.
Changed
- Пересоздание проекта: C++ → Rust — полный переход на Rust для улучшения безопасности памяти, производительности и удобства сопровождения кода.
Этот проект распространяется под лицензией GPL-3.0.
Подробнее см. файл LICENSE.
Zephyr Watch — Open Source Project
Made with ❤️ and Rust · ESP32-S3 · LVGL · MicroPython