ESP32 S3 UNO - DIYables Bluetooth App Table
Overview
This ESP32 S3 Uno Bluetooth table tutorial shows you how to send structured data from the ESP32 S3 Uno form board to your phone over BLE. Each row has a name, such as "Temperature" or "Status", and a value that updates in real time in the free DIYables Bluetooth App. It is a simple way to build a wireless sensor dashboard or a key-value status panel.
In this tutorial, you will:
- Install the DIYables Bluetooth library and upload the BLE table example
- Connect the DIYables Bluetooth App to your board on Android or iOS
- Define named rows and update their values in real time
- Build a sensor dashboard and a system status panel with Arduino code
- Combine the table with other Bluetooth apps such as the plotter and monitor
BLE only, no Classic Bluetooth
The ESP32 S3 Uno supports Bluetooth Low Energy (BLE) only. It has no Classic Bluetooth, so the BluetoothSerial library and the Esp32Bluetooth_Table example do not work on this board. This tutorial uses only the BLE example (Esp32BLE_Table). The good part: BLE works with the DIYables Bluetooth App on both Android and iOS, and you do not need to pair the board in your phone settings.

Features
A table is the cleanest way to show many values at once. Instead of a long scrolling log, every value stays in its own row, and only that row changes when new data arrives.
Structured rows
You can define up to 20 rows. Each row has a label, such as "Temperature" or "Status".
Real-time updates
You update one row at a time. The app does not need to reload the whole table.
Any value as text
Each value is a string, so you can send numbers, units, words or even emojis.
Structure sync
When the app connects, it asks the board for the table layout, and the board sends the row names again.
Android and iOS
BLE is supported on both phone platforms, so one sketch works for everyone.
Low power, no pairing
BLE uses less power than Classic Bluetooth, and the app finds the board with a simple scan.
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 diagram of the ESP32 S3 Uno form board. Use it to find the D3 and D13 header pins and their GPIO numbers if you build the video demo.

Wiring Diagram
The main BLE table example needs no wiring. It sends simulated values, so the board and a USB cable are enough. The video demo below reads real temperature and humidity from a DHT11 module on D3 and blinks an external LED on D13, because the ESP32 S3 Uno has no built-in LED for this example.
| Component Pin | ESP32 S3 Uno Pin |
|---|---|
| DHT11 VCC | 3.3V |
| DHT11 GND | GND |
| DHT11 DATA | D3 (GPIO17) |
| LED Anode (+) via 220 ohm resistor | D13 (GPIO12) |
| LED Cathode (-) | GND |
ESP32 S3 Uno Code
The steps below set up the board and the library once. After that, you upload the BLE table sketch and check the result in 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 needed for the video demo).
- 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 Arduino IDE.
- Search the library: type "DIYables Bluetooth" and find the DIYables Bluetooth library by DIYables.
- Install it: click the Install button.
- Search for DIYables Bluetooth created by DIYables and click the Install button.
- Install the dependencies: Arduino IDE asks to install some other libraries. Click Install All.
- Set the partition scheme: go to Tools > Partition Scheme and pick "Huge APP (3MB No OTA/1MB SPIFFS)". The Bluetooth libraries are big and do not fit in the default app space.
- Tip: keep the Serial Monitor at 115200 baud. Another speed shows only strange characters.
ESP32 S3 Uno BLE Code (works with the app on Android and iOS)
This sketch starts a BLE server named ESP32BLE_Table and adds the Table app to it. It defines seven rows, and once a phone connects, it sends simulated temperature, humidity and pressure values together with a counter, the uptime, the free heap and a status text every second.
- Open the example: in Arduino IDE go to File Examples DIYables Bluetooth Esp32BLE_Table, or copy the code below into the editor.
- Upload: click the Upload button in Arduino IDE.
- Open the Serial Monitor and set it to 115200 baud.
- Check the output. It looks like this:
Mobile App
Now you connect your phone. With BLE you do not pair the board in the phone settings. You just scan inside the app and tap the board name.
- Open the DIYables Bluetooth App.
- Allow the permissions the first time you open it:
- Nearby Devices permission (Android 12+) / Bluetooth permission (iOS) - needed to scan for and connect to Bluetooth devices
- Location permission (Android 11 and below only) - older Android versions need it to scan for BLE devices

- Connect: tap "ESP32BLE_Table" in the scan results.
- Open the Table app: after it connects, the app goes back to the home screen. Choose the Table app from the menu.

※ NOTE THAT:
You can tap the settings icon on the home screen to show or hide apps there. For more details, read the DIYables Bluetooth App User Manual.
- Look at the table: the rows appear with their names and current values.

- Check the Serial Monitor in Arduino IDE again. You see something like this:
- Watch the values change: every second, the counter, the uptime and the simulated sensor values update in the app.
Creative Customization - Adapt the Code to Your Project
The example only shows fake data. With a few functions, addRow(), sendValueUpdate() and sendTableStructure(), you can show any data from your own project.
Define Table Rows
Add the rows in setup(). You can have up to 20 rows. You can also read the number of rows and the name of each row back.
Update Row Values
You can update a row by its name or by its index. The index starts at 0, so the first row is row 0.
Handle Data Requests from App
The app asks for the table when it connects or when you refresh it. In this callback, send the row names first, and then the current values.
Clear and Rebuild Table
If your project changes mode, you can delete all rows and build a new table. Always send the new structure to the app after that.
Handle Connection Events
These two callbacks tell you when the phone connects or leaves. They are a good place to print a message or to stop sending data when nobody is listening.
How to Use the Table
The Table screen in the app is simple on purpose. It has two columns and refreshes by itself.
App Interface
Attribute column
The left column shows the row labels that you define with addRow().
Value column
The right column shows the current values that you send with sendValueUpdate().
Auto-refresh
Values change in the app as soon as they arrive. You do not need to press anything.
Table Limits
A table can hold up to 20 rows (MAX_TABLE_ROWS = 20). Keep the row names short but clear, so they fit on a phone screen. Every value is shown as text.
Programming Examples
These short examples show common ways to use the table. Each one only shows the parts that change, so keep the BLE setup from the full sketch above. All pins use Uno header positions, with the GPIO number in code.
Sensor Dashboard
This dashboard shows five sensor rows and updates them every 2 seconds. The light sensor is on A0 (GPIO2) and the air quality sensor is on A1 (GPIO1). The ESP32 S3 Uno ADC is 12-bit, so raw values go from 0 to 4095. The functions readTemperature(), readHumidity() and readPressure() are your own sensor code.
The line analogSetAttenuation(ADC_11db) matters. By default, the ESP32 S3 Uno ADC can only measure a small voltage. With 11 dB attenuation, the analog pin reads the full range from 0V up to about 3.3V. Without it, readings hit 4095 too early and your sensor values look wrong.
System Status Monitor
This panel shows how the board itself is doing: uptime, free heap memory and the chip temperature. The ESP32 S3 Uno can read its own chip temperature with temperatureRead().
GPIO Pin Status Table
This example creates one row per input pin and shows HIGH or LOW for each one. It watches six Uno header pins: D2, D3, D4, D5, D7 and D8.
If a pin has nothing connected, it floats and its state jumps between HIGH and LOW. Use INPUT_PULLUP or an external resistor when you connect buttons or switches.
Analog Sensor Array
Here a small struct holds the name, pin, unit and scale for each sensor, so you can add a new sensor with one line. The four sensors sit on A0 to A3 (GPIO2, GPIO1, GPIO7, GPIO6). The scale values are examples; set them for your own sensors and the 0 to 4095 range.
WARNING
The ESP32 S3 Uno analog pins accept 3.3V at most. Do not connect a sensor output that can go up to 5V directly to A0 to A3. Power the sensor from 3.3V, or use a voltage divider.
Advanced Programming Techniques
When your table grows, a plain number is not always easy to read. These two patterns make the values clearer and save BLE traffic.
Conditional Formatting with Emojis
The app shows any text, including emojis. Here the temperature row gets a symbol and a word that tells you at a glance if it is cold, normal or hot.
Event-Driven Updates
Instead of sending on a timer, this code sends a new value only when the temperature changes by 0.5 °C or more. The getTimestamp() function is your own.
Hardware Integration Ideas
The table becomes really useful when you connect real sensors. Here are three ideas for the ESP32 S3 Uno.
BME280 Weather Station Table
Connect a BME280 sensor to the SDA (GPIO8) and SCL (GPIO9) header pins, and show temperature, humidity and pressure in three rows.
Multi-Sensor Dashboard
Connect several sensors, such as a DHT22, a BMP280, an LDR and an MQ-135, and give each reading its own row. Keep every signal that goes into a pin at 3.3V or less.
Device Info Panel
Show information about the ESP32 S3 Uno itself: chip model, flash size, free heap, uptime and MAC address.
Why BLE Only on the ESP32 S3 Uno?
Other ESP32 tutorials show two versions of this example: a BLE one and a Classic Bluetooth one. The ESP32 S3 Uno chip has a BLE radio only, so the Classic version cannot run on it. The table below shows what BLE gives you on this board.
| Feature | BLE (Esp32BLE_Table) on the ESP32 S3 Uno |
|---|---|
| iOS support | Yes |
| Android support | Yes |
| Power use | Low |
| Range | About 10 to 30 m indoors |
| Data rate | Lower than Classic, but fine for table values |
| Pairing | Not needed, scan and connect in the app |
| Classic Bluetooth (BluetoothSerial) | Not supported on this board |
Video Tutorial
Watch the video below to see this ESP32 S3 Uno project step by step. The demo code reads a DHT11 module on D3 (GPIO17) and blinks an external LED on D13 (GPIO12), and it shows both values in the table next to the other rows. Install the "DHT sensor library" by Adafruit before you upload it.
Debug Tips
If the table looks wrong, print what the board knows about it to the USB Serial Monitor. Then you can see if the problem is in your code or on the phone side.
Project Ideas
A Bluetooth table fits any project that has several values to show at once. Here are some ideas to start with.
Monitoring dashboards
A weather station (temperature, humidity, pressure, wind), a plant care panel (soil moisture, light, temperature) or an aquarium monitor (temperature, pH, TDS).
System information
A diagnostics table for the ESP32 S3 Uno, WiFi connection details, a memory usage tracker or a battery status display.
Data logging
A min, max and average tracker for a sensor, an event counter, timing statistics, or a summary of all input pin states.
Home automation
Temperature per room, an overview of device states, energy use, or the status of security sensors.
Integration with Other Bluetooth Apps
You can add more than one app to the same BLE server. The table then works next to other screens in the DIYables Bluetooth App.
Combine with Bluetooth Plotter
Show the current value in the table, and draw its trend in the plotter at the same time.
Combine with Bluetooth Monitor
Use the table for structured values and the monitor for log messages and alerts.
Next Steps
When the Table example works, try these apps next:
- Bluetooth Monitor - for free-form text logging
- Bluetooth Plotter - for live graphs of your data
- Bluetooth Temperature - for a dedicated temperature display
- Multiple Bluetooth Apps - to combine the table with other screens
Support
If you need more help, you can:
- Read the API Reference of the DIYables Bluetooth library
- Visit DIYables tutorials
- Ask in the Arduino community forums
FAQ
Can I use the ESP32 Classic Bluetooth table example on the ESP32 S3 Uno?
No. The ESP32 S3 Uno has BLE only, without Classic Bluetooth. The Esp32Bluetooth_Table example and the BluetoothSerial library will not work. Use the Esp32BLE_Table example, which works with the app on Android and iOS.
How many rows can the Bluetooth table show?
Up to 20 rows. If you need more data, use shorter labels and combine values in one row, such as "25.3 °C / 62%", or split the data over two tables that you rebuild with clearTable().
What is different from the UNO R4 WiFi version?
The UNO R4 WiFi uses the ArduinoBLE_Table example with the ArduinoBLE library. The ESP32 S3 Uno uses Esp32BLE_Table with the BLE stack of the esp32 core, runs the Serial Monitor at 115200 baud, needs the "Huge APP" partition scheme, and shows real free heap with ESP.getFreeHeap(). Its pins work at 3.3V, not 5V.
Why do I need the Huge APP partition scheme?
The Bluetooth libraries make the sketch large. The default partition gives only about 1.2MB for your code, so the upload fails with a "sketch too big" error. "Huge APP (3MB No OTA/1MB SPIFFS)" gives about 3MB for code.
Why does the code call analogSetAttenuation(ADC_11db)?
The sensor dashboard and analog array examples read sensors with analogRead(). This line sets the ESP32 S3 Uno ADC input range to about 0 to 3.3V, so the full sensor signal maps to 0 to 4095. Without it, the range is smaller and readings saturate early. The UNO R4 does not need this line; it is for ESP32 boards only. Keep the sensor output at 3.3V or less.
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 (I/O, PWM, analog), GPIO45 and GPIO35 to GPIO42 (I/O, PWM), and GPIO47/GPIO48 (output only, PWM). Solder pin headers to them and write the GPIO number in code. For more analog sensors in your table, use GPIO15 or GPIO16; for more digital inputs, GPIO35 to GPIO42 are good choices. Do not use GPIO47/GPIO48 for inputs, because they are output only. Two warnings: 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. Also, 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 in Arduino IDE | USB driver missing or board not in upload mode | Install the CP210x or CH340 driver, try another USB cable, or hold BOOT while you press RESET |
| Upload fails with sketch too big | Default partition scheme is too small for Bluetooth | Choose Tools > Partition Scheme > Huge APP (3MB No OTA/1MB SPIFFS) |
| ESP32BLE_Table not found in the app | Sketch not running, phone Bluetooth off, or missing permissions | Check the Serial Monitor says Waiting for Bluetooth connection, turn on Bluetooth, allow Nearby Devices (or Location on Android 11 and below) |
| Classic Bluetooth example does not compile or connect | The ESP32 S3 Uno has no Classic Bluetooth | Use the Esp32BLE_Table example only |
| Table is empty | Rows not added, or structure not sent | Call addRow() in setup() and call sendTableStructure() in onDataRequest() |
| A row value never changes | Row name in sendValueUpdate() does not match addRow() | Row names are case-sensitive, so use the exact same text or use the row index |
| Temperature shows nan in the demo | DHT11 wiring or library problem | Check DATA on D3 (GPIO17), VCC on 3.3V and GND, and install the DHT sensor library by Adafruit |
| Connection drops often | Phone too far away or weak USB power | Move closer to the board and use a good USB cable or power supply |
| Garbage text in the Serial Monitor | Wrong baud rate | Set the Serial Monitor to 115200 baud |