An expressive smart companion firmware for ST7789 displays (240x280). Combines lively Dasai/Cozmo-style vector eyes and IMU physics with ChronosESP32 BLE features: live clock, turn-by-turn navigation, weather, and notifications.
OTA-Bot-Mochi turns an ESP32-S3 display into an interactive desktop or car companion inspired by Dasai Mochi and Cozmo.
Instead of a generic smartwatch interface, the core experience is the Living Eyes Base Screen: dynamic vector eyes with realistic saccades, idle floats, blinking, and physical reactivity to acceleration or shaking. When paired to your phone via BLE with the Chronos app, it seamlessly extends into a useful utility companion offering turn-by-turn navigation data, real-time clock syncing, weather forecasts, and phone alerts.
- Living Eyes Companion: 4 eye styles (
MOCHI,BLOUB,NORMAL,TRAPEZ) and 23 expressive facial moods with dirty-rect redrawing. - IMU Motion Reactivity: Integrated QMI8658C accelerometer dynamically shifts pupils with g-force and triggers a 2-second
DIZZYstate on hard shakes. - BLE Turn-by-Turn Navigation: Receives live route directions, distance, ETA, and direction icons directly from your smartphone.
- Chronos BLE Core: Background BLE service managing phone notifications, incoming call rings, time synchronization, and weather forecasts.
- Modular Screen State Machine: Built-in UI screens for
BASE(Eyes),CLOCK,NAVIGATION,WEATHER, andNOTIFICATION.
The runtime loop handles BLE updates alongside a clean screen dispatcher:
┌──────────────────────┐
│ setup() │
│ Chronos + GFX + IMU │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ current_screen │
└──────────┬───────────┘
┌────────────┬───────┼───────────┬────────────┐
▼ ▼ ▼ ▼ ▼
[BASE] [CLOCK] [NAV] [WEATHER] [NOTIFICATION]
Living Eyes Time Route Forecast Alerts
(IMU Physics) Sync & Icons & Temps & Callers
- BASE: Non-blocking rendering loop updating eye saccades, blinks, and IMU-driven pupil offsets.
- CLOCK: Synced digital clock face with battery and BLE indicators.
- NAVIGATION: Turn directions, speed, distance, and turn icon CRC tracking.
- WEATHER: Forecast counts, conditions, temperatures, UV index, and atmospheric pressure.
- NOTIFICATION: Phone notifications and incoming call (ringer) display.
Default target is the Waveshare ESP32-S3-Touch-LCD-1.69 (240x280 ST7789). Pinouts are mapped in pin_config.h:
| Category | Component | Default Pins |
|---|---|---|
| Display | ST7789 SPI LCD (240x280) | DC=4, CS=5, SCK=6, MOSI=7, RST=8, BL=15 |
| Touch | FT6X36 Capacitive I2C | SDA=11, SCL=10, RST=13, INT=14 |
| Motion | QMI8658C 6-Axis IMU | SDA=12, SCL=9 |
| RTC / Time | External I2C RTC | SDA=11, SCL=10, INT=41 |
| Buzzer | Active buzzer GPIO | BUZZER=34 |
| Power | AXP2101 PMIC & Battery | SYS_EN=35, SYS_OUT=36, BAT_ADC=1 |
- Arduino IDE 2.x with the official ESP32 by Espressif board package installed.
- Libraries needed (install via Arduino Library Manager):
Arduino_GFX_LibraryChronosESP32
- Smartphone with the Chronos companion app installed (Android / iOS).
- Clone this repository into your Arduino sketchbook folder:
git clone [https://github.com/camiu01/ota-bot-mochi.git](https://github.com/camiu01/ota-bot-mochi.git)
- Open
OTA-bot-Mochi/OTA-bot-Mochi.inoin Arduino IDE. - Select your board configuration:
- Board:
ESP32S3 Dev Module
- Upload to the device.
- Launch the Chronos app on your phone, search for Bluetooth devices, and pair with "OTA bot".
The eye rendering core supports continuous frame updates, idle blinking, and full palette remapping.
MOCHI: Tall, cute rounded rectangles (Dasai aesthetic).BLOUB: Wide, expressive blob eyes (default).TRAPEZ: Slanted trapezoid geometry with corner-lift tuning (Cozmo look).NORMAL: Classic oval eyes.
eyes_init(gfx); // Bind display and set default state
eyes_set_style(MOCHI); // Change eye geometry
eyes_set_expression(HAPPY); // Set emotional mood
eyes_set_expression_by_name("love"); // Set mood by string identifier
eyes_set_eye_colors(BLACK, CYAN, BLACK, WHITE);// Set bg, eye, pupil, highlight colors
eyes_imu_poll(millis()); // Read IMU tilt & shake
eyes_update(millis()); // Run animations, physics, and draw
Contributions are welcome. Please read the governance docs before opening issues or pull requests.
- LICENSE - Defines GPLv3 reuse, modification, and redistribution terms.
- CONTRIBUTING.md - Workflow and code style guidelines.
- CODE_OF_CONDUCT.md - Community expectations.
- SECURITY.md - Vulnerability reporting guidelines.
Copyright (c) 2026 Camiu. Distributed under the GNU General Public License v3.0 (GPLv3). Built on Arduino GFX and ChronosESP32, inspired by bloub eyes and Dasai Mochi.