ESP32 S3 UNO - DIYables Bluetooth App Multiple Apps
Overview
This ESP32 S3 Uno Bluetooth multiple apps tutorial shows you how to run nine BLE app screens at the same time from one sketch on the ESP32 S3 Uno form board. With the free DIYables Bluetooth STEM app, your phone gets a Monitor, Chat, Slider, Joystick, Temperature view, Plotter, Table, Analog Gauge and Rotator, all over one Bluetooth Low Energy connection. It is a good base for an all-in-one dashboard or a remote control panel.
In this tutorial, you will:
- Install the DIYables Bluetooth library and upload the multi-app BLE example
- Pick the right partition scheme so a large sketch fits in flash
- Connect the DIYables Bluetooth App on Android or iPhone and switch between apps
- Link apps together, for example a slider that moves a gauge and updates a table
- Build your own combined dashboard with only the apps you need
BLE only on this board
The ESP32 S3 Uno supports Bluetooth Low Energy (BLE) only. It has no Classic Bluetooth radio, so the BluetoothSerial library and the Esp32Bluetooth_MultipleApps (Classic) example do not work on it. This page uses only the BLE example, Esp32BLE_MultipleApps. The good news: BLE works with the app on both Android and iOS, and you do not need to pair the board first.

Features
One BLE link can carry many app screens. The library keeps them apart for you, so each app works as if it were alone, and you only write the parts that matter for your project.
Nine apps in one sketch
Monitor, Chat, Slider, Joystick, Temperature, Plotter, Table, Analog Gauge and Rotator all run at the same time.
Own callbacks for each app
Every app has its own event handlers, so a slider change and a chat message never get mixed up.
Own timing for each app
Each app sends data at its own speed. The plotter can update 10 times a second while the table updates every 5 seconds.
Free app switching
In the phone app you can jump from one screen to another at any time. The board keeps running all apps in the background.
Android and iOS
BLE is supported on both platforms, so the same sketch works for every phone.
Low power, no pairing
BLE uses little power, and the phone finds the board in a scan. There is no pairing step in the phone settings.
Hardware Preparation
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Additionally, some of these links are for products from our own brand, DIYables .
ESP32 S3 Uno Pinout
The image below shows the pinout of the ESP32 S3 Uno form board. Use it to find the D13 header pin and its GPIO number when you add the status LED.

Wiring Diagram
The multi-app sketch needs no wiring to work, because the BLE radio is inside the board. The code also drives a status LED that turns on when the phone connects and that you can switch with the LED_ON and LED_OFF commands. The ESP32 S3 Uno has no built-in LED on the Uno headers, so if you want to see this, add an external LED on D13 (GPIO12).
| LED Pin | ESP32 S3 Uno Pin |
|---|---|
| Anode (long leg), through a 220 ohm resistor | D13 (GPIO12) |
| Cathode (short leg) | GND |
ESP32 S3 Uno Code
This example puts a lot of app libraries into one sketch, so the compiled program is bigger than usual. You set up the Arduino IDE once, then upload the BLE example and watch the Serial Monitor.
Detailed Instructions
Follow these steps in order:
- New to the ESP32 S3 Uno? Follow ESP32 S3 Uno - Getting Started first.
- Wire it up as shown in the wiring table above (only if you want the status LED).
- Connect the board to your computer with a USB Type-C cable.
- Open Arduino IDE, choose the ESP32S3 Dev Module board and the correct COM port.
- Open the library manager by clicking the Libraries icon on the left bar of the Arduino IDE.
- Search "DIYables Bluetooth" and find the DIYables Bluetooth library by DIYables.
- Install it by clicking the Install button.
- Search for DIYables Bluetooth created by DIYables and click the Install button.
- Install the dependencies by clicking Install All when the IDE asks for other libraries.
- Tip: keep the Arduino IDE and the esp32 by Espressif Systems core up to date. Old cores can fail to build the BLE part of the library.
※ NOTE THAT:
This sketch is large. You must change the partition scheme before you upload, or the IDE will say the sketch is too big. The steps are in the next section.
ESP32 S3 Uno BLE Code (works with the app on Android and iOS)
The sketch creates one BLE server and registers nine apps on it. It sends a heartbeat to the Monitor, a changing temperature, sine and cosine waves to the Plotter, and live values to the Table and Gauge. Input from the Slider, Joystick and Rotator is printed to the Serial Monitor and copied into the Table, and the slider also moves the gauge.
- Open the example in Arduino IDE with File Examples DIYables Bluetooth Esp32BLE_MultipleApps, or copy the code below and paste it into the editor.
- Set the partition scheme. Go to Tools > Partition Scheme and choose "Huge APP (3MB No OTA/1MB SPIFFS)". The default scheme leaves too little room for this example.
- Upload the code to the ESP32 S3 Uno by clicking the Upload button.
- Open the Serial Monitor and set it to 115200 baud.
- Check the output. It should look like this:
- Tip: if you see nothing, press the RESET button on the board once. The first lines are printed only at startup.
In this version of the code, the BLE device name is "ESP32 S3 Uno Multi-App", and the status LED uses LED_PIN 12, which is D13 (GPIO12) on the Uno header.
Mobile App
Now you connect your phone. With BLE there is no pairing step, so this part takes less than a minute.
- Open the DIYables Bluetooth App. The first time, it asks for permissions. Allow them:
- Nearby Devices (Android 12 and newer) or Bluetooth (iOS), so the app can scan and connect
- Location (Android 11 and older only), because old Android versions need it to scan for BLE devices
- Turn on Bluetooth on your phone.
- Tap Connect on the home screen. The app starts to scan for devices.

- Tap "ESP32 S3 Uno Multi-App" in the scan results.
- Look at the home screen. After the connection, the app goes back to it by itself. You see all app buttons. The 9 apps set up in the sketch respond; the other buttons are shown but do nothing with this sketch.

※ NOTE THAT:
Tap the settings icon on the home screen to hide or show app buttons. You can find more in the DIYables Bluetooth App User Manual.
- Try the apps. Open Monitor, Chat, Slider, Joystick, Temperature, Plotter, Table, Analog Gauge and Rotator one by one. Switch between them freely; they all use the same BLE connection.
Go back to the Serial Monitor in the Arduino IDE. You will see lines like these:
In the Monitor app, type HELP to see the commands. STATUS shows all current values, LED_ON and LED_OFF switch the LED on D13 (GPIO12), and HEAP shows the free memory.
Creative Customization - Adapt the Code to Your Project
The example is a demo with fake sensor data. In a real project you keep the structure and change what each app sends or does. The parts below show the building blocks.
How Multiple Apps Work
You create each app as its own object and register it with the same Bluetooth server. All apps share one BLE connection, but each one works on its own.
Set Up Callbacks for Each App
Each app gets its own handler. The handler runs only when that app sends something from the phone.
Independent Update Intervals
Each output app can have its own timer. Use millis() instead of delay(), so the BLE server keeps running between updates.
Choose Which Apps to Include
You do not need all nine apps. Include only the ones your project uses. A smaller sketch also builds faster and uses less memory.
Handle Connection Events
When the phone connects, it is a good moment to send the first values, so every app screen shows real data right away.
How to Use Multiple Apps
The phone shows one app screen at a time, but the board runs all of them all the time. Knowing which way the data flows helps you plan your own project.
App Switching
The home screen of the DIYables Bluetooth App shows every registered app as a button. Tap a button to open that app, and use the back or home button to return and pick another one. The ESP32 S3 Uno keeps all apps running, no matter which screen is open.
Data Flow
Input apps (Slider, Joystick, Rotator and Chat) send data from the phone to the ESP32 S3 Uno. Output apps (Monitor, Temperature, Plotter, Table and Gauge) send data from the board to the phone. Chat and Monitor work both ways: they can send and receive text.
Programming Examples
These three sketches show how to mix apps for a real use. The sensor and motor functions such as readTemperature() or setMotors() are placeholders; replace them with your own code.
Weather Station Dashboard
Robot Controller
Home Automation Hub
Advanced Programming Techniques
When several apps show the same data, it pays to connect them and to keep the data in one place. These two patterns help with that.
Cross-App Communication
The value from one app can update other apps. Here the joystick moves a point, and the plotter, table and monitor all show where it is.
Memory-Efficient Multi-App
Read the sensors once, store the results in one struct, and send the same values to every app. This saves memory and time.
BLE vs Classic Bluetooth on the ESP32 S3 Uno
The DIYables Bluetooth library has two multi-app examples for Espressif boards: a BLE one and a Classic Bluetooth one. On the ESP32 S3 Uno you can only use the BLE one, because the chip has no Classic Bluetooth hardware. The table shows what this means for you.
| Feature | BLE (Esp32BLE_MultipleApps) | Classic Bluetooth (Esp32Bluetooth_MultipleApps) |
|---|---|---|
| Works on ESP32 S3 Uno | Yes | No |
| iOS support | Yes | No |
| Android support | Yes | Yes |
| Power use | Low | Higher |
| Data rate | Lower | Higher |
| Pairing needed | No (scan and connect) | Yes (in phone settings) |
※ NOTE THAT:
With many apps sending data, BLE bandwidth is the main limit. If the plotter updates every 100 ms and other apps also send often, spread the updates over time and send only what changed.
Common Issues and Debug Tips
Most problems with this example come from the large sketch size, memory use or too much data at once. Check these points before you change the code.
Cannot find the device in the app
Make sure the sketch is uploaded and the board is powered. Turn on Bluetooth on your phone, and on Android 11 or older also turn on Location. Look for "ESP32 S3 Uno Multi-App" in the scan list.
Sketch too large or not enough space
Go to Tools > Partition Scheme and choose "Huge APP (3MB No OTA/1MB SPIFFS)" or "No OTA (Large APP)". The default scheme gives only about 1.2 MB for code, which is not enough. The Huge APP scheme gives about 3 MB, but you lose over-the-air (OTA) updates. If it is still too large, remove the apps you do not need.
Some apps do not appear in the mobile app
Each app must be registered with bluetoothServer.addApp(). Check that every header you include matches an app object you create, and register all apps in setup().
Data updates are slow or late
Fewer apps sending at once, or longer intervals for less important apps, will help. BLE has limited bandwidth, so do not let all timers fire at the same moment.
The board crashes or resets
Check the free memory with ESP.getFreeHeap() (type HEAP in the Monitor app). Use fewer table rows or plotter samples, and power the board from a good USB port.
The connection drops often
Move the phone closer to the board, send less data, and spread out the update intervals.
Debug Tips
Print memory and uptime to the Serial Monitor now and then. A free heap that keeps going down means something in your code uses more memory over time.
Project Ideas
A multi-app sketch turns your phone into a full control panel. Pick the apps that match the job.
Dashboards
A weather station (Temperature, Table, Plotter, Monitor), a vehicle dashboard (Gauge, Rotator, Plotter, Monitor), a home automation hub (Chat, Slider, Table, Monitor) or a lab panel (Temperature, Gauge, Plotter, Table).
Remote control
A robot controller (Joystick, Slider, Rotator, Monitor, Gauge), a drone ground station (Joystick, Table, Plotter, Gauge), a small CNC interface (Slider, Rotator, Monitor, Table) or a camera gimbal (Joystick, Rotator, Monitor).
Education
A physics lab (Plotter, Table, Temperature, Gauge, Monitor), an electronics workbench (Gauge, Plotter, Table, Monitor), an environment project (Temperature, Plotter, Table, Monitor) or a robotics club kit (Joystick, Slider, Rotator, Monitor, Chat).
IoT
A smart greenhouse (Temperature, Slider, Table, Plotter, Monitor), an aquarium controller (Temperature, Slider, Table, Monitor), a solar tracker (Rotator, Gauge, Plotter, Table) or an energy monitor (Gauge, Plotter, Table, Monitor).
Next Steps
You now know how to combine many Bluetooth apps in one ESP32 S3 Uno project. To learn the full API of each app, look at the single-app tutorials:
- Bluetooth Monitor - text-based serial monitor
- Bluetooth Chat - two-way messaging
- Bluetooth Slider - value control with sliders
- Bluetooth Joystick - 2D direction input
- Bluetooth Temperature - temperature gauge display
- Bluetooth Plotter - real-time data plotting
- Bluetooth Table - structured data display
- Bluetooth Analog Gauge - analog meter display
- Bluetooth Rotator - rotatable knob control
Support
If you need more help:
- Read the API reference that comes with the library
- Visit the DIYables Bluetooth App tutorials
- Ask in the Arduino community forums
FAQ
Can the ESP32 S3 Uno use Classic Bluetooth or BluetoothSerial?
No. The ESP32 S3 Uno has a BLE radio only, so BluetoothSerial and the Esp32Bluetooth_MultipleApps example do not compile or do not work on it. Use the Esp32BLE_MultipleApps example from this page. It works with the DIYables Bluetooth App on both Android and iOS.
Why do I need the Huge APP partition scheme?
Nine app libraries plus the BLE stack make a big program. The default partition scheme only gives about 1.2 MB for code, so the upload fails with a "sketch too big" error. Huge APP gives about 3 MB for code, but you cannot use OTA updates with it.
Where is the LED that the code turns on?
The ESP32 S3 Uno has no built-in LED on the Uno headers, so this code uses D13 (GPIO12) for an external LED. Connect the LED through a 220 ohm resistor to D13 and GND. The LED turns on when the phone connects, and the LED_ON and LED_OFF commands in the Monitor app switch it.
How many apps can I run at the same time?
This example runs nine apps, and that works well. More apps use more memory and more BLE bandwidth. If the board resets or updates get slow, remove apps you do not use and make the update intervals longer.
Can I use the UNO R4 multi-app sketch on the ESP32 S3 Uno?
Not directly. The UNO R4 sketch uses the ArduinoBLE platform (DIYables_ArduinoBLE), while the ESP32 S3 Uno uses DIYables_Esp32BLE. The app code is almost the same, but the BLE setup lines and the LED pin are different, so start from the Esp32BLE_MultipleApps example.
What if my project needs more pins than the Uno headers give?
The ESP32 S3 Uno has two extra rows of holes with more GPIOs. GPIO15 and GPIO16 work as I/O, PWM and analog. GPIO45 and GPIO35 to GPIO42 work as I/O and PWM. GPIO47 and GPIO48 are output only, with PWM. Solder pin headers to use them and write the GPIO number in code. For a multi-app dashboard, use GPIO15/GPIO16 for analog sensors that feed the Gauge or Plotter, and GPIO35 to GPIO42 for buttons, LEDs or relays you control from the Slider or Chat. Use GPIO47/GPIO48 only for outputs. Be careful with two things. First, GPIO47 and GPIO48 may run at 1.8V instead of 3.3V on some modules (especially ones with "V" in the name, like R8V or R16V), so 3.3V devices can be damaged or act strangely. Second, GPIO0, GPIO3 (D6), GPIO45 and GPIO46 (D9) are boot strapping pins, and a wrong connection can stop the board from booting or uploading code. Use the other extra pins first.
Troubleshooting
| Problem | Possible Cause | Solution |
|---|---|---|
| No COM port or upload fails | USB driver missing or board not in download mode | Install the CP210x or CH340 driver, try another USB cable, or hold BOOT while you press RESET and upload again |
| Sketch too big error | Default partition scheme is too small | Choose Huge APP (3MB No OTA/1MB SPIFFS) in Tools > Partition Scheme |
| Board not found in the app scan | Bluetooth or Location is off on the phone, or the sketch is not running | Turn on Bluetooth (and Location on Android 11 or older), press RESET on the board, and scan again |
| Compile error about BluetoothSerial | Classic Bluetooth example was used | Use the Esp32BLE_MultipleApps example, because the ESP32 S3 Uno supports BLE only |
| Missing DIYables header when compiling | Library or its dependencies not installed | Install the DIYables Bluetooth library and click Install All for the dependencies |
| Status LED never turns on | LED not wired, wrong pin, or LED reversed | Wire the LED long leg through a 220 ohm resistor to D13 (GPIO12) and the short leg to GND |
| Board resets or connection drops | Low memory or too much data at once | Remove unused apps, make update intervals longer, and check free heap with the HEAP command |
| Garbage text in the Serial Monitor | Wrong baud rate | Set the Serial Monitor to 115200 baud |