Arduino Physical AI Challenge India 2026 — Project Report & Repository
Organised by Robu.in × Arduino
Team Name: VAHA | Team ID: APC-2026-AP-13507 | Track: Smart Homes / Consumer AI
Institution: Dharanova Pvt Ltd, Visakhapatnam, Andhra Pradesh, India
Developer: Ritesh Bonthalakoti (ritesh@dharanova.com) — Solo Developer
📺 Click above or visit https://youtu.be/_Y_hMeHslhI to watch the full physical demonstration.
![]() 1. VAHA Hardware Product — by Dharanova Pvt Ltd |
![]() 2. Companion App — Home Dashboard |
Creative minds don't switch off. Ideas show up at the office, school, the park, a beach, in transit — anywhere you'd normally have a phone or notebook close by. There's one place that isn't true: the bathroom, where the mind keeps wandering with no way to write anything down. VAHA closes that gap — built for the one place your other devices can't follow you, so an idea never has to wait.
- Hands-free Voice Capture: Say "Marvin" to start recording thoughts without touching a phone or unlocking a device.
- Environmental Context Enrichment: Stamps every voice note with temperature, humidity, TVOC air quality, and water flow rate at that exact moment.
- 100% On-Device & Offline Privacy: All wake-word detection, speech-to-text, sensor processing, and storage run locally on the Arduino UNO Q. No audio or text ever touches the cloud.
The Arduino UNO Q serves as the central bridge, running an on-device Linux OS environment alongside an MCU microcontroller core to merge local voice AI processing with physical sensing.
graph TD
subgraph UNO_Q ["Arduino UNO Q Board"]
Sensors["DHT22 / AGS02MA / Flow"] -->|Raw Readings| MCU["microcontroller Core"]
MCU -->|sensors_get Bridge API| LinuxOS["Linux OS Runtime"]
Mic["CS202 USB Microphone"] -->|48 kHz Mono PCM| LinuxOS
end
subgraph Linux_Backend ["Linux OS Runtime (Python Backend)"]
LinuxOS -->|Edge Impulse Model| VAD["Marvin Wake Detect"]
VAD -->|Active Recording| AudioLoop["Audio Capture State Machine"]
AudioLoop -->|Stop Keyword / Silence| StopDetect["im_done detection"]
StopDetect -->|faster-whisper base.en int8| STT["On-Device Transcription"]
STT -->|Assemble Capture| Storage["Local storage: audio + JSON + checksum"]
Storage -->|FastAPI Edge Server| Webserver["FastAPI endpoint: 8080"]
Storage -->|Optional Sync| Notion["Notion Client API"]
AudioLoop -->|Piper TTS| Speaker["PAM8403 Audio Out"]
end
subgraph Mobile_App ["Mobile Companion (Expo / React Native)"]
Webserver -->|Wi-Fi HTTP Sync| SyncService["Sync Service"]
SyncService -->|Verify Checksum| SQLite[("Drizzle SQLite DB")]
SQLite -->|Dynamic Card List| AppUI["React Native Viewports"]
AppUI -->|Interactive SVG charts| GraphPanel["Telemetry Panel"]
end
- Wake Word Detection: The user says "Marvin". The on-device Edge Impulse model (
new-marvin.eim) detects it and triggers acapture_startedevent over WebSockets. - Audio Capture: Raw audio is recorded at 48 kHz (16-bit PCM) with noise reduction.
- Stop Trigger: Recording ends when the stop phrase "im_done" is detected (threshold 0.80) or after 10 seconds of silence.
- On-Device STT: Audio is downsampled to 16 kHz and transcribed locally using
faster-whisper(base.en, int8 quantized, running on CPU). - Sensor Sync: Environmental readings are pulled via the sketch's
sensors_get()bridge call and packaged into a JSON metadata payload. - Local Storage: The capture package (
audio.wav,transcript.json,metadata.json,checksum.md5) is written locally tocaptures/YYYY/MM/DD/uuid/and optionally synced to Notion. - Mobile Sync: The companion React Native app pulls the captures over local Wi-Fi, verifies the MD5 checksums, inserts records into Drizzle SQLite, and issues a purge command to clear the physical device storage.
![]() Home View — Synced Notes |
![]() Device View — Live Telemetry |
![]() Insights View — Trends |
![]() Notes View — Searchable Logs |
- Microcontroller: Arduino UNO Q (ABX00087) — 4GB RAM / 32GB storage
- Climate Sensor: DHT22 Temperature & Humidity Sensor
- Air Quality Sensor: AGS02MA TVOC Air Quality Sensor (I2C)
- Water Sensor: Hall-effect Pulse Water Flow Sensor (7.5 pulses/L/min)
- Audio Input: USB Lavalier Microphone (auto-detected via CS202 adapter)
- Audio Output: PAM8403 Audio Amplifier + 4Ω 3W Speaker (chime + Piper TTS output)
- Peripherals: Portronics USB-C multiport hub, 2x Mini Breadboards, 10000 mAh Power Bank
| Sensor/Module | Module Pin | Arduino UNO Q Pin | Connection Type | Description |
|---|---|---|---|---|
| DHT22 | VCC | 5V | Power | Temperature & Humidity Sensor |
| DHT22 | DATA | Pin D2 | Digital Input | Climate telemetry signal line |
| DHT22 | GND | GND | Ground | Common ground |
| Water Flow | VCC | 5V | Power | Hall-effect pulse sensor |
| Water Flow | SIG | Pin D3 | Digital Interrupt | RISING edge interrupt pulse counter |
| Water Flow | GND | GND | Ground | Common ground |
| AGS02MA | VCC | 3.3V | Power | TVOC air quality sensor |
| AGS02MA | SDA | Pin A4 (SDA) | I2C Data | Communicates at 20kHz clock |
| AGS02MA | SCL | Pin A5 (SCL) | I2C Clock | - |
| AGS02MA | GND | GND | Ground | Common ground |
| PAM8403 | 5V / GND | 5V / GND | Power | Speaker amplifier module |
| PAM8403 | Audio In | Audio Out (Analog) | Analog Input | Voice prompt TTS output from Uno Q |
| Speaker | L+ / L- | Speaker Outputs | Analog Output | 4Ω 3W audio transducer output |
| Layer / Task | Model Used | Platform / Runtime | Training & Dataset |
|---|---|---|---|
| A: Wake-word Spotting | "Marvin" (new-marvin.eim) |
Edge Impulse Runner | Trained on 48 custom voice logs augmented into 1,800 sample iterations (98.7% accuracy). |
| B: Stop-phrase Spotting | "im_done" (new-marvin.eim) |
Edge Impulse Runner | Trained on custom-recorded voice command datasets. |
| C: Speech-to-Text (STT) | faster-whisper small (277M) |
CTranslate2 (int8, CPU) | Fine-tuned English speech model running 100% offline on-device. |
- Verified under real bathroom noise — 34 capture trials: Wake word and stop phrase were exercised across 34 capture attempts in an actual bathroom environment with the exhaust fan running and the tap open. Detection held reliably throughout at
0.75 / 0.80thresholds. - End-to-end flow verified: Wake word ➔ Recording ➔ Stop phrase / VAD cutoff ➔ On-device transcription ➔ Local SQLite save ➔ Mobile sync.
- Checksum Verification: Confirmed on every capture package synced to the companion app with zero corrupted transfers.
- Sync-Initiation Latency: ~250 ms average per capture package.
- Transfer Throughput: ~1.5 MB/s over local Wi-Fi.
- CPU Utilization: ~30% peak CPU usage on the Arduino UNO Q during local Whisper inference.
- WebSocket Telemetry Latency: <10 ms latency for real-time sensor updates.
- Database Write Latency: ~5 ms per SQLite transaction in the mobile app.
The compiled Android companion application is available in the repository:
- 📥 Download ARM64 App Build (v1.1.0) (Optimized for arm64-v8a)
- 📥 Download ARMv7 App Build (v1.1.0) (Optimized for armeabi-v7a)
- Install Arduino CLI or Arduino IDE.
- Open
sketch/sketch.ino. - Install dependencies:
DHTlibrary andArduino_RouterBridgelibrary. - Upload the sketch to the Arduino UNO Q board.
- Install Python 3.12 on the Uno Q Linux workspace.
- Navigate to
python/:cd python python -m venv venv # Activate: .\venv\Scripts\activate # Windows source venv/bin/activate # Linux/macOS
- Install dependencies:
pip install -r requirements.txt
- Copy
.env.exampleto.envand fill in API keys (Notion database IDs, Groq token for fallback). - Start the edge server:
python main.py
You can directly download and install the standalone release APK binary from GitHub Releases:
- GitHub Release v1.1.0: https://github.com/dharanova-code/vaha/releases/tag/v1.1.0
- Direct APK Download: Download vaha-v1.1.0.apk (88.7 MB)
- Install Node.js (LTS version).
- Navigate to
mobile/:cd mobile npm install - Run the development server:
npx expo start
Proprietary. All rights reserved. Code licensed under custom terms for Dharanova Private Limited.













