Skip to content

DenBroLiik/Android-For-ESP32S3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


+------------------------------------------------------------------+
| ______          _                 __          __   _       _     |
||___  /         | |                \ \        / /  | |     | |    |
|   / / ___ _ __ | |__  _   _ _ __   \ \  /\  / /_ _| |_ ___| |__  |
|  / / / _ \ '_ \| '_ \| | | | '__|   \ \/  \/ / _` | __/ __| '_ \ |
| / /_|  __/ |_) | | | | |_| | |       \  /\  / (_| | || (__| | | ||
|/_____\___| .__/|_| |_|\__, |_|        \/  \/ \__,_|\__\___|_| |_||
|          | |           __/ |                                     |
|          |_|          |___/                                      |
+------------------------------------------------------------------+

Zephyr Watch

Кастомные смарт-часы на ESP32-S3 в стиле Google Pixel Watch


Rust ESP32-S3 LVGL MicroPython License Status


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-карта)

Прошивка хранится и запускается с 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


🎮 Управление

Энкодер KY-040

Действие Результат
Вращение влево/вправо Навигация по меню
Одиночное нажатие Выбор / подтверждение
Двойное нажатие Назад
Долгое нажатие (1 сек) Главный экран

Тачскрин XPT2046 (только с ST7789)

Жест Результат
Тап Выбор элемента
Свайп влево/вправо Переключение экранов
Свайп вниз Шторка уведомлений


🔋 Энергопотребление

Режим Потребление Описание
Активный (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 для уменьшения тепловыделения.



🚀 Быстрый старт

Требования

Установка toolchain

cargo install espup
espup install
source $HOME/export-esp.sh

Сборка и прошивка

git 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


🗺️ Roadmap

✅ Готово

  • 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


📜 Changelog

[19.02.2026]

Changed

  • Понижение частоты процессора с MAX до 80 MHz для снижения температуры чипа при длительной работе.

Added

  • Видеопамять за счёт SRAM — расширение буфера кадра для рендеринга UI.
  • Драйвер распределения оперативной памяти SRAM + PSRAM — динамическое управление доступными пулами памяти.

[15.02.2026]

Added

  • Базовый модуль RTC для загрузчика — хранение и восстановление системного времени после Deep Sleep и перезагрузки.

[12.02.2026]

Changed

  • Пересоздание проекта: C++ → Rust — полный переход на Rust для улучшения безопасности памяти, производительности и удобства сопровождения кода.


📄 Лицензия

Этот проект распространяется под лицензией GPL-3.0.
Подробнее см. файл LICENSE.



Zephyr Watch — Open Source Project

Made with ❤️ and Rust · ESP32-S3 · LVGL · MicroPython

About

AFE - Android For ESP32S3 (система android (WearOS) для esp32s3 zero) Open Source Project.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors