DIYables Web Apps Multiple Web Apps
Overview
This ESP32 S3 Uno multiple web apps tutorial shows you how to run several DIYables web apps at the same time on the ESP32 S3 Uno form board. You build one IoT dashboard that you open in any web browser on your phone or PC. From it you can watch serial messages, move sliders and a joystick, turn a rotator, read a gauge and see a live data table. It is a strong starting point for bigger IoT control panel projects.
In this tutorial, you will:
- Install the DIYables ESP32 WebApps library in the Arduino IDE
- Upload the MultipleWebApps example to the ESP32 S3 Uno
- Open the home page and switch between the web apps
- Pick and set the GPIO pins you want to control from the web
- Adapt the template for robot, smart home and science projects

Features
One sketch gives you a full set of web pages. They all share the same state, so a change on one page can show up on another page right away.
Home Page
The home page is the starting point. It holds a link to every web app that the sketch adds to the server.
Monitoring Pages
The Web Monitor works like a Serial Monitor inside your browser. The Web Analog Gauge shows a value on a round dial, and the Web Table lists names and values that update live.
Control Pages
The Web Slider gives you two independent sliders (0 to 255). The Web Joystick sends a 2D position (-100 to 100 on each axis). The Web Rotator gives you a turning disc with an angle from 0 to 360°.
Extra Pages You Can Add
The Chat page and the Web Digital Pins page are not in this sketch, but you can add them with one addApp() line each. The examples further down show how they work together with the other pages.
Under the Hood
All pages talk to the board over WebSocket, so updates happen instantly. The library handles the JSON and the protocol for you, so you only write simple callback functions.
Hardware Preparation
| 1 | × | ESP32 S3 Uno-form Board | |
| 1 | × | USB Cable Type-A to Type-C (for USB-A PC) | |
| 1 | × | USB Cable Type-C to Type-C (for USB-C PC) |
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 Uno header pins (D2, D13, A0…) and their GPIO numbers when you choose pins for the web apps.

Detailed Instructions
The base sketch needs no wiring. You only need the board, a USB cable and a WiFi network with 2.4 GHz.
- New to the ESP32 S3 Uno? Follow ESP32 S3 Uno - Getting Started first.
- 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 for "DIYables ESP32 WebApps" and find the DIYables ESP32 WebApps Library by DIYables.
- Install it by clicking the Install button.
- Search for DIYables ESP32 WebApps created by DIYables and click the Install button.
- Install the dependencies. The IDE asks to install some other libraries. Click Install All.
- Open the example. Go to File Examples DIYables ESP32 WebApps MultipleWebApps, or copy the code below and paste it into the Arduino IDE.
- Set your WiFi name and password in these two lines:
- Upload the code. Click the Upload button to send the sketch to the ESP32 S3 Uno.
- Open the Serial Monitor and set it to 9600 baud. You should see something like this:
- Nothing printed? Press the RESET button on the ESP32 S3 Uno and watch the Serial Monitor again.
- Open the dashboard. Write down the IP address and type it into the address bar of a web browser on your phone or PC, for example http://192.168.0.2. The phone or PC must be on the same WiFi network.
- Check the home page. It shows a link to every web app:

- Try each app. Click a link to open that app, or type the path after the IP address, such as http://192.168.0.2/web-monitor or http://192.168.0.2/web-slider. Move the sliders, drag the joystick and turn the rotator, then look at the Web Table to see the values change.
- Tip: Bookmark the home page on your phone. If the IP address changes after a router restart, check the Serial Monitor again for the new one.
Creative Customization - Unleash Your Innovation
The example is a template. You keep the parts you need, remove the rest, and connect the callbacks to your own hardware. The snippets below show the main settings you will change.
Digital Pin Configuration
When you add the Web Digital Pins app, you tell it which pins to show and whether each one is an output or an input. The library only accepts numbers 0 to 13, so on the ESP32 S3 Uno you pass the Uno header label (2 means D2). In your own pinMode(), digitalWrite() and digitalRead() code, turn that label into the real GPIO, for example with the UNO_TO_GPIO table from the Web Digital Pins tutorial.
Output Pins (Controllable via Web)
The ESP32 S3 Uno has no built-in LED on D13. Connect an external LED with a 220 ohm resistor to D13 (GPIO12) if you want a light to switch from the web page.
Input Pins (Monitored via Web)
WARNING
D9 (GPIO46) is a boot strapping pin on the ESP32 S3 Uno. The chip reads it at power-up to pick the boot mode. If a switch or sensor pulls it to the wrong level during reset, the board may not boot or accept new code. Release the switch while you power up or upload, or move this input to a free pin such as D8 or D12.
All ESP32 S3 Uno pins use 3.3V logic and are NOT 5V tolerant. Do not connect a 5V sensor output straight to an input pin.
Joystick Configuration
You can change how the joystick behaves when you create it. The first value turns auto-return on or off, and the second value sets how far it must move before it sends a new update.
State Variables
Global variables keep the current value of each control. Every page reads from them when it loads, so all pages stay in sync. The pin state array is indexed by the Uno label (D0 to D13), the same numbers the Web Digital Pins page uses.
Built-in Chat Commands
If you add the Chat page, the chat example answers a few ready-made commands. They are a good model for your own text commands.
Basic Commands
| Command | What the ESP32 S3 Uno replies |
|---|---|
| hello | A friendly greeting |
| time | How many seconds the board has been running |
| status | The board status and the LED state |
| help | The list of commands |
Control Commands
Type led on to switch the LED on, and led off to switch it off. On the ESP32 S3 Uno this is the external LED on D13 (GPIO12), because the board has no built-in LED there.
Example Chat Session
Programming Integration Examples
The real power of this example shows when you link several pages to one piece of hardware. The three examples below are partial sketches. Add them to the MultipleWebApps sketch and change the pins to fit your wiring.
Complete Robot Control System
This example drives a small robot. The joystick steers with tank-style drive, slider 1 sets the top speed, slider 2 tilts a camera, the digital pins switch lights and a horn, and the chat page takes stop commands. Note that Servo.h becomes ESP32Servo.h on the ESP32 S3 Uno (install the "ESP32Servo" library by Kevin Harrington).
WARNING
This robot example uses D9 (GPIO46) for the left motor and D6 (GPIO3) for the LED strip. Both are boot strapping pins on the ESP32 S3 Uno. A motor driver or LED strip that pulls these pins high or low at power-up can stop the board from booting or uploading. If that happens, disconnect them while you upload, or move them to free pins.
Smart Home Control System
Here the digital pins switch the lights in three rooms, the two sliders set fan and air conditioner power with PWM, and the chat page reports the motion and door sensors. Any change also shows up in the chat and the Web Monitor.
※ NOTE THAT:
In this template FAN_CONTROL and DOOR_SENSOR both point to D9 (GPIO46), the same as in the original example. One pin cannot be a PWM output and an input at the same time, so give one of them another free pin before you build the real project. D9 (GPIO46) is also a boot strapping pin.
Educational Science Project
This example runs a small lab experiment. Slider 1 sets the target temperature, slider 2 sets the stirrer speed, the chat page reads the data, and the Web Monitor logs a CSV line when you type log. The sensors are read on A0 (GPIO2) and A1 (GPIO1).
The ESP32 S3 Uno ADC is 12-bit, so analogRead() returns 0 to 4095 instead of 0 to 1023. That is why the map() calls use 4095. The analogSetAttenuation(ADC_11db) line matters too: by default the ADC can only measure a small voltage, and 11 dB attenuation lets the analog pins read the full range from 0V up to about 3.3V. Without it, the readings hit 4095 too early and the sensor values look wrong. Call setupScienceExperiment() from setup() so this line runs once at start-up.
Advanced Integration Techniques
As your project grows, two things become important: keeping every page showing the same values, and letting one page change what another page does.
State Synchronization
This function pushes the current values to every page. Call it after a big change, or when a page reconnects. The loop goes through all GPIO numbers, because ESP32 S3 Uno pins are numbered by GPIO, not by Uno header.
Cross-Interface Communication
Here the joystick distance can limit the slider range, and the pin on D2 (GPIO18) works as an "arm" switch that sends a message to the chat page.
Common Issues and Debugging
Running many pages at once can bring a few special problems. Most of them are easy to fix once you know where to look.
Some pages do not load
Check that every app is added to the server with addApp() in setup(). Open the browser console and look for WebSocket errors. Make sure the board still has enough free memory.
Pages show different values
Use shared global variables for every value, and send them back in the "value request" callbacks. Call a sync function such as synchronizeAllStates() after big changes.
The dashboard feels slow
Send updates less often for values that are not critical. Remove apps you do not use in this project.
Memory runs low
Print the free heap with Serial.println(ESP.getFreeHeap()). The freeMemory() function from AVR boards does not exist on the ESP32 S3 Uno. Remove unused apps and keep callback functions short.
Debug Strategies
This helper prints the full state to the Serial Monitor in one go.
Project Templates
The same set of pages fits many kinds of projects. Pick the template that is closest to your idea and start from there.
Industrial Control Template
Use digital pins to switch machines, sliders for speed or temperature, and the joystick for positioning. The chat page reports status and takes commands, and the Web Monitor logs data.
Educational Laboratory Template
Sliders set the experiment values and digital pins switch the equipment. Students talk to the board through the chat page, while the Web Monitor collects the data and sensors are read in real time.
Home Automation Template
Digital pins switch lights and appliances, sliders handle dimming and climate, and input pins watch for security events. The chat page acts like a simple voice assistant, and the Web Monitor keeps a status log.
Robotics Development Template
The joystick drives the robot and the sliders set speed and servo angles. Digital pins read sensors, the chat page takes commands, and the Web Monitor shows debug and telemetry data.
Performance Optimization
The ESP32 S3 Uno has much more memory than small AVR boards, but a lean sketch still loads faster and reacts better.
Memory Management
Comment out the apps you do not need. Keep the home page, and keep the Web Monitor while you are still debugging.
Update Frequency Control
Fast controls such as the joystick need quick updates, while sensor values can wait. Use two timers so each kind of task runs at its own speed.
Next Steps
Once the MultipleWebApps example runs on your ESP32 S3 Uno, turn it into your own project step by step:
- Customize it. Remove the pages you do not need and add your own logic.
- Add sensors. Feed real sensor readings into the gauge and the table.
- Add safety. Build in emergency stops and safety checks.
- Create your own commands. Extend the chat page with words for your project.
- Log data. Use the Web Monitor to collect and save values.
- Test on mobile. Make sure the pages are easy to use on a phone.
Support
If you get stuck, these pages help:
- Each single-app tutorial, such as ESP32 S3 Uno - Chat and ESP32 S3 Uno - Web Monitor
- The ESP32 S3 Uno - DIYables WebApps overview page
- The Arduino community forum
With this template you can build almost any web-controlled ESP32 S3 Uno project. Start small, then add the pages and hardware you need.
FAQ
Do I need to wire anything to run the MultipleWebApps example on the ESP32 S3 Uno?
No. The base sketch only uses WiFi and simulated data, so the board and a USB cable are enough. You add wiring later when you connect real LEDs, motors or sensors to the callbacks.
Should I use the "DIYables WebApps" or the "DIYables ESP32 WebApps" library?
Use the "DIYables ESP32 WebApps" library. The plain "DIYables WebApps" library is made for the UNO R4 WiFi and uses its WiFiS3 code. The DIYables ESP32 WebApps library uses DIYables_ESP32_Platform.h and ESP32ServerFactory, but the page classes and callbacks work the same way.
Which pin numbers do I use with enablePin() on the ESP32 S3 Uno?
Use the Uno header label from 0 to 13, because the library ignores larger numbers. Then map each label to its GPIO in your own pin code, for example D2 is GPIO18, D8 is GPIO21 and D13 is GPIO12. The Web Digital Pins tutorial shows a ready-made UNO_TO_GPIO table.
Can I connect 5V sensors or modules to the web-controlled pins?
Not directly. ESP32 S3 Uno pins use 3.3V logic and are not 5V tolerant. Use a level shifter or a voltage divider for any 5V signal that goes into a pin. A 3.3V output from the board can usually still drive a 5V relay module or motor driver input.
Why does the science example call analogSetAttenuation(ADC_11db)?
It 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 the readings saturate early. The UNO R4 does not need this line. Only the ESP32 S3 Uno needs it. Keep the sensor output at 3.3V or less.
What if my dashboard 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 your own pinMode()/digitalWrite() code (the Web Digital Pins page itself only shows D0 to D13). For extra web-controlled outputs or inputs, GPIO35 to GPIO42 are a good choice, and GPIO15/16 suit extra analog sensors. Be careful with two groups. GPIO47/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, and they cannot be inputs. 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 | Missing USB driver or board not in download mode | Install the CP210x or CH340 driver, try another USB cable, or hold BOOT while you press RESET |
| Serial Monitor stays empty | Wrong baud rate or the board printed before the monitor opened | Set the monitor to 9600 baud and press RESET on the board |
| "Failed to start WebApp server!" repeats | Wrong WiFi name or password, or a 5 GHz-only network | Check WIFI_SSID and WIFI_PASSWORD and use a 2.4 GHz network |
| Browser cannot open the IP address | Phone or PC is on another network or the IP changed | Join the same WiFi network and read the new IP in the Serial Monitor |
| Compile error about missing header files | Library or its dependencies not installed | Install DIYables ESP32 WebApps and click Install All for the dependencies |
| Board does not boot or upload with hardware attached | A device holds D9 (GPIO46) or D6 (GPIO3) at the wrong level at power-up | Disconnect that device during upload or move it to a free pin |
| Web Digital Pins page does not switch the pin | A GPIO number above 13 was passed, or the label was not mapped to its GPIO | Pass the label (0 to 13) to enablePin() and map it to the GPIO in your code |
| Analog readings stuck near 4095 | No ADC attenuation or sensor output above 3.3V | Call analogSetAttenuation(ADC_11db) and keep the sensor voltage at 3.3V or less |