Arduino Remote Studio
Build custom Bluetooth & WiFi remote controls for Arduino, ESP32, ESP8266, Raspberry Pi, robots, drones and smart-home boards — by dragging widgets onto a canvas and typing the command each one should send. This manual walks you through every screen and feature.
1 · What Arduino Remote Studio is
Arduino Remote Studio turns your phone into a programmable remote for any device that speaks plain serial over Bluetooth Classic (HC-05, HC-06, ESP32 BT) or WiFi/TCP (ESP8266, NodeMCU, or any TCP socket). You place controls — buttons, joysticks, a D-pad, sliders, gauges — on a canvas, type the text command each one sends, then connect and drive.
There is nothing to flash on the phone side and no XML to write.
Your firmware just reads commands like FWD:80 or LIGHT_ON
and, optionally, prints back KEY:VALUE lines that the app shows live.
2 · 60-second quick start
- Install & open. On first launch you'll see a short onboarding, then the Home screen with categories and your remotes.
- Open a template. Tap Robot Driver (or any starter template) to load a ready-made layout.
- Connect. Tap Connection → pick your HC-05 from the paired Bluetooth list, or enter the IP & port of your ESP32/ESP8266.
- Drive. Push the joystick or hold the D-pad — commands stream to your device. Watch the battery gauge update if your firmware reports it.
- Make it yours. Open the designer, drop a new widget on the canvas, type its command, and you have a custom remote.
3 · App tour
Home
Category shortcuts (Robot, Smart Home, RC Car, Drone, CNC, LED) and your recent remotes. The launch pad for everything.
Templates
Your remote library — open, duplicate, rename, delete, import or export. Includes the 6 starter templates.
Designer
The drag-and-drop canvas where you add, move, resize and configure controls. Undo/redo every change.
Runner
The live remote. Sends commands as you tap, shows incoming sensor data, and hosts the Emergency Stop.
Connection
Choose Bluetooth or WiFi, scan for devices, pair from a QR code, and manage saved connection profiles.
Logs
A scrollable history of commands sent and lines received — handy for debugging your firmware.
4 · Connecting over Bluetooth
Arduino Remote Studio uses Bluetooth Classic (SPP) — the same serial profile HC-05, HC-06 and ESP32 BT-Classic modules expose.
- Pair in Android Settings first. Bluetooth Classic modules
must be paired in your phone's system Bluetooth settings (PIN is usually
1234or0000) before they appear in the app. - Grant permissions. On Android 12+ the app asks for Nearby devices (BLUETOOTH_CONNECT / SCAN). Allow it so it can list and connect to your module.
- Pick the device. Connection → Bluetooth tab → tap your module (e.g. HC-05). Connected status turns green.
5 · Connecting over WiFi (TCP)
For ESP8266, NodeMCU, ESP32-WiFi or a Raspberry Pi, the app opens a raw TCP socket to your device. Your firmware runs a TCP server and reads the commands the app sends, line by line.
- Put your phone and the device on the same WiFi network.
- Connection → WiFi tab → enter the device IP address and
port (e.g.
192.168.1.50 : 8080). - Tap Connect. Or skip the typing and use auto-discovery below.
6 · Auto-discovery & QR pairing
Find devices automatically Premium
Tap Scan for devices and the app finds boards on your WiFi two ways at once:
- mDNS / DNS-SD — devices advertising the
_arduinoremote._tcpservice appear by name, no IP needed. - UDP broadcast — the app broadcasts a probe; firmware that replies with its details shows up in the list.
You can attach a device-type filter to a template (e.g.
car, drone) so a scan only surfaces matching boards.
Pair from a QR code Premium
Have your sketch print a QR encoding the connection details; point your phone at it and the IP/port (or Bluetooth target) auto-fills. The app reads pairing URIs of the form it generates internally, so a QR your firmware prints from the same scheme will connect in one tap.
7 · Saved connections
Save a connection as a profile for one-tap reconnects. Free users can keep 1 saved connection; Premium removes the limit, so you can store your robot, your LED controller and your drone separately.
8 · Starter templates
Six ready-to-drive remotes ship with the app (Premium). Each is laid out on a reference canvas and rescales to your screen automatically.
| Template | What's on it | Emergency cmd |
|---|---|---|
| Robot Driver | Tank-drive D-pad (ramped speed), speed slider, light toggle, gripper cycle button, horn, battery gauge, temperature display and a serial monitor. | STOP |
| Smart Home Hub | Living/Bedroom/Fan/AC toggles, brightness & fan-speed sliders, 4-scene selector, indoor temp, humidity and a power-draw gauge. | ALL_OFF |
| RC Car | Joystick steering, throttle slider, drive-mode selector, headlights, horn and a live speed gauge with battery and lap readouts. | STOP |
| Drone Pilot | Twin sticks, arm toggle, takeoff/land cycle, return-to-home, camera-gimbal slider, altitude & battery gauges, signal and ground-speed. | EMERGENCY |
| CNC Pendant | XYZ jog cross, live X/Y/Z position, step-size selector, feed-rate slider, spindle toggle, RPM gauge and a big red E-Stop. | ESTOP |
| LED Strip | Power, 4 animation modes, brightness & speed, full RGB mixer and one-tap colour presets. | POWER_OFF |
Open any template to drive it as-is, or duplicate it and edit in the designer to match your wiring.
9 · The designer
Placing & arranging
- Add a widget from the palette — it drops onto the canvas.
- Drag to move; drag a corner to resize.
- Undo / redo every change.
- Group controls so they move together as one unit.
- Rotate the canvas between portrait and landscape; layouts scale live to any screen size.
Per-control properties
- Label, colour, and the command(s) it sends.
- Haptic strength — off / light / medium / strong.
- Destructive flag — adds a confirm dialog before sending.
- Conditional visibility — show only when the device reports a value.
- Widget-specific options (ranges, formats, gauge thresholds, D-pad ramp).
10 · Widget reference
| Widget | What it does | Tier |
|---|---|---|
| Button | Sends a command on tap. Supports a separate long-press command and multi-state cycling (each tap advances to the next label/colour/command). | Free |
| Toggle | Two-state switch; sends an
on command and an off command. | Free |
| Slider | Sends a live value via a
format string, e.g. SPEED:{value}. | Free |
| Label | Static text for grouping or captions. | Free |
| Joystick | 2-axis pad; streams
{x}/{y} via a format like
X:{x},Y:{y}. | Premium |
| D-Pad | 4-button directional pad.
Hold to ramp a value up; release to ease it down. Each direction can
send its own ramping command (FWD:{value}) or act as an X/Y axis.
Optional diagonals. | Premium |
| Gauge | Arc gauge driven by an
incoming KEY:VALUE. Turns amber at the warn threshold and red at the
danger threshold. | Premium |
| Display | Shows the latest value for
a key, with an optional unit (°C, %,
V). | Premium |
| Serial Monitor | A resizable panel showing live sent/received traffic on the canvas. | Premium |
11 · Commands & live data
Outgoing: command formats
Most widgets send a plain text command. Sliders, joysticks and D-pads build the command from a format string with live placeholders:
| Widget | Format | Sends |
|---|---|---|
| Slider | SPEED:{value} | SPEED:75 |
| Joystick | X:{x},Y:{y} | X:50,Y:-30 |
| D-pad (axis) | DRIVE:{x},{y} | DRIVE:0,80 |
| D-pad (per-dir) | FWD:{value} | FWD:80 |
You can send plain text, JSON, hex or any templated string your sketch expects.
Incoming: two-way data
If your firmware prints lines in the form KEY:VALUE (newline
terminated), the app routes each value to any Gauge, Display, or conditional control
listening for that key.
// Arduino — report telemetry the app can show Serial.println("BATTERY:82"); // → battery gauge / display Serial.println("TEMP:28"); // → "Temp" display, shows 28°C Serial.println("RPM:18500"); // → RPM gauge (amber/red on thresholds)
12 · Safety: Emergency Stop & failsafe
🛑 Emergency Stop
Every template has a tappable
E-Stop that fires its emergency command (e.g. STOP,
ESTOP) immediately.
🔌 Failsafe on disconnect
If Bluetooth or WiFi drops mid-drive, the app auto-fires the failsafe command so your robot or car doesn't run away.
⚠️ Destructive confirm
Mark any control destructive to require a confirmation dialog before it sends — good for "launch", "reset" or "estop".
📳 Haptics
Per-control tactile feedback (light, medium, strong) so you feel each press without looking.
13 · Macros Premium
Record a sequence of commands as you operate the remote, then save it as a one-tap macro — "park the car", "scene: movie night", a robot demo routine. Replay the whole sequence with a single press.
14 · Usage heatmap Premium
The app counts how often each control is used and visualises it, so you can see at a glance which buttons you actually reach for and redesign the layout around them.
15 · Conditional controls Premium
Hide a control until your device reports a specific value. Set a
visible-when key (and optional value) on the control; it only appears in the
runner once the device sends a matching KEY:VALUE. Use it to build
progressive UIs that reveal options only when they're relevant — e.g. show "ABORT
LANDING" only while STATE:LANDING is active.
18 · Firmware example
A minimal Arduino sketch that reads commands from the app and reports battery back.
Wire an HC-05's TX/RX to a SoftwareSerial pair (or use Serial directly).
void setup() { Serial.begin(9600); // match your HC-05 baud (often 9600 or 38400) } void loop() { if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd == "STOP") stopMotors(); else if (cmd == "LIGHT_ON") digitalWrite(LED, HIGH); else if (cmd == "LIGHT_OFF") digitalWrite(LED, LOW); else if (cmd.startsWith("SPEED:")) setSpeed(cmd.substring(6).toInt()); // "SPEED:75" → 75 else if (cmd.startsWith("X:")) drive(cmd); // "X:50,Y:-30" } // Report telemetry every second → gauges/displays update live static unsigned long t = 0; if (millis() - t > 1000) { t = millis(); Serial.print("BATTERY:"); Serial.println(readBatteryPct()); } }
readStringUntil('\n') and trim() to strip the
terminator before comparing.19 · Troubleshooting
| Symptom | Fix |
|---|---|
| My HC-05 isn't in the list | Pair it in Android Settings →
Bluetooth first (PIN 1234/0000), then return to
the app. Grant the Nearby devices permission on Android 12+. |
| Connects then immediately drops | Baud mismatch is the usual cause —
make sure your Serial.begin() rate matches the module's configured
baud. |
| WiFi device won't connect | Confirm phone and board are on the same network, the IP is current (DHCP can change it), and your firmware's TCP server is listening on that port. |
| Gauges/displays never update | Print exact KEY:VALUE\n
lines and make sure the widget's data key matches the KEY
exactly (case-sensitive). |
| Commands arrive glued together | Read with
readStringUntil('\n') rather than reading byte-by-byte without a
delimiter. |
| A control is invisible in the runner | It likely has a conditional visibility rule — it only shows once the device sends the matching value. Clear the rule in its properties to always show it. |
| Can't add more widgets / remotes | You've hit a free-tier limit (2 remotes, 6 controls, 1 connection). Unlock Premium to remove them. |
20 · Privacy
No login. No ads. No analytics or advertising SDKs. Your templates, connection profiles and command logs stay on your phone unless you choose to export them. Connecting to your own devices is entirely local. The only network call the app makes itself is a version check on launch (to tell you when an update is required), which sends basic app/device info. Premium is a one-time in-app purchase processed by Google Play. See the full Privacy Policy for the exact details.