Ejemplo de ESP32 WebSlider - Tutorial de la Interfaz de Control de Dos Deslizadores
El ejemplo WebSlider proporciona dos controles deslizantes independientes accesibles a través de un navegador web. Plataforma educativa diseñada para ESP32 con capacidades analógicas mejoradas, características de control de precisión y módulos educativos integrados para aprender PWM y electrónica analógica. Cada control deslizante ofrece valores de 0-255, lo que los hace perfectos para el control PWM, el ajuste de brillo, el control de velocidad del motor y cualquier aplicación que requiera valores de control analógicos.
Deslizadores Dobles: Dos controles deslizantes independientes (rango 0-255 cada uno)
Valores en Tiempo Real: Actualizaciones de valores en tiempo real a través de WebSocket
Compatibles con PWM: Valores de 8 bits (0-255), perfectos para las funciones analogWrite()
Retroalimentación Visual: Visualización de valores en tiempo real para cada control deslizante
Botones Predefinidos: Valores rápidos para configuraciones comunes
Soporte Táctil y con Ratón: Funciona en computadoras de escritorio, tabletas y dispositivos móviles
Diseño Adaptable: Se adapta a diferentes tamaños de pantalla
Persistencia de Valores: Los deslizadores recuerdan la última posición cuando se recarga la página
Or you can buy the following kits:
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.
Sigue estas instrucciones paso a paso:
Conecta la placa ESP32 a tu computadora usando un cable USB.
Inicia el IDE de Arduino en tu computadora.
Selecciona la placa ESP32 adecuada (p. ej. ESP32 Dev Module) y el puerto COM.
Navega hasta el icono Bibliotecas en la barra izquierda del IDE de Arduino.
Busca "DIYables ESP32 WebApps", luego encuentra la DIYables ESP32 WebApps Library de DIYables.
Haz clic en el botón Instalar para instalar la biblioteca.


#include <DIYables_ESP32_Platform.h>
#include <DIYablesWebApps.h>
const char WIFI_SSID[] = "YOUR_WIFI_SSID";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
ESP32ServerFactory serverFactory;
DIYablesWebAppServer webAppsServer(serverFactory, 80, 81);
DIYablesHomePage homePage;
DIYablesWebSliderPage webSliderPage;
int slider1Value = 64;
int slider2Value = 128;
void setup() {
Serial.begin(9600);
delay(1000);
Serial.println("DIYables ESP32 WebApp - Web Slider Example");
webAppsServer.addApp(&homePage);
webAppsServer.addApp(&webSliderPage);
webAppsServer.setNotFoundPage(DIYablesNotFoundPage());
if (!webAppsServer.begin(WIFI_SSID, WIFI_PASSWORD)) {
while (1) {
Serial.println("Failed to start WebApp server!");
delay(1000);
}
}
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
Serial.println("Slider 1: " + String(slider1) + ", Slider 2: " + String(slider2));
});
webSliderPage.onSliderValueToWeb([]() {
webSliderPage.sendToWebSlider(slider1Value, slider2Value);
Serial.println("Web client requested values - Sent: Slider1=" + String(slider1Value) + ", Slider2=" + String(slider2Value));
});
}
void loop() {
webAppsServer.loop();
delay(10);
}
const char WIFI_SSID[] = "YOUR_WIFI_NETWORK";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
DIYables WebApp - Web Slider Example
INFO: Added app /
INFO: Added app /web-slider
DIYables WebApp Library
Platform: ESP32
Network connected!
IP address: 192.168.0.2
HTTP server started on port 80
Configuring WebSocket server callbacks...
WebSocket server started on port 81
WebSocket URL: ws://192.168.0.2:81
WebSocket server started on port 81
==========================================
DIYables WebApp Ready!
==========================================
📱 Web Interface: http://192.168.0.2
🔗 WebSocket: ws://192.168.0.2:81
📋 Available Applications:
🏠 Home Page: http://192.168.0.2/
🎚️ Web Slider: http://192.168.0.2/web-slider
==========================================
Si no ves nada, reinicia la placa ESP32.
Toma nota de la dirección IP mostrada y escribe esta dirección en la barra de direcciones de un navegador web en tu teléfono inteligente o PC.
Ejemplo: http://192.168.0.2
Verás la página de inicio como en la imagen de abajo.
O también puedes acceder a la página directamente mediante la dirección IP seguida de /web-slider. Por ejemplo: http://192.168.0.2/web-slider
Intenta mover los dos deslizadores para controlar valores analógicos (0-255) y observa la retroalimentación en tiempo real en el Monitor Serial.
Configurar las posiciones iniciales de los deslizadores:
int slider1Value = 64;
int slider2Value = 128;
La interfaz deslizante proporciona:
Deslizador 1: Primer deslizador de control con visualización del valor (0-255)
Deslizador 2: Segundo deslizador de control con visualización del valor (0-255)
Visualización del valor: Valores numéricos en tiempo real para ambos deslizadores
Botones de preajuste: Acceso rápido a valores comunes (0%, 25%, 50%, 75%, 100%)
Haga clic y arrastre: Haga clic en el manejador del deslizante y arrástrelo para ajustar el valor
Posición de clic: Haga clic en cualquier lugar de la pista deslizante para ir a ese valor
Ajuste fino: Utilice movimientos pequeños del ratón para un ajuste preciso
Tocar y Arrastrar: Toca la manija del control deslizante y arrástrala a una nueva posición
Tocar la pista: Toca en la pista del control deslizante para establecer el valor
Control Suave: El arrastre con el dedo proporciona cambios de valor suaves
Cada control deslizante ofrece:
Valor mínimo: 0 (0% - completamente apagado)
Valor máximo: 255 (100% - intensidad máxima)
Resolución: 256 pasos discretos (precisión de 8 bits)
Compatibilidad PWM: Uso directo con la función analogWrite()
void setup() {
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
Serial.println("Slider 1: " + String(slider1) + ", Slider 2: " + String(slider2));
});
}
const int LED1_PIN = 9;
const int LED2_PIN = 10;
void setup() {
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
analogWrite(LED1_PIN, slider1Value);
analogWrite(LED2_PIN, slider2Value);
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
analogWrite(LED1_PIN, slider1);
analogWrite(LED2_PIN, slider2);
Serial.println("LED1 Brightness: " + String(slider1) +
", LED2 Brightness: " + String(slider2));
});
}
#include <Servo.h>
Servo servo1, servo2;
void setup() {
servo1.attach(9);
servo2.attach(10);
servo1.write(map(slider1Value, 0, 255, 0, 180));
servo2.write(map(slider2Value, 0, 255, 0, 180));
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
int angle1 = map(slider1, 0, 255, 0, 180);
int angle2 = map(slider2, 0, 255, 0, 180);
servo1.write(angle1);
servo2.write(angle2);
Serial.println("Servo1: " + String(angle1) + "°, Servo2: " + String(angle2) + "°");
});
}
const int MOTOR1_PWM = 9;
const int MOTOR1_DIR1 = 2;
const int MOTOR1_DIR2 = 3;
const int MOTOR2_PWM = 10;
const int MOTOR2_DIR1 = 4;
const int MOTOR2_DIR2 = 5;
void setup() {
pinMode(MOTOR1_PWM, OUTPUT);
pinMode(MOTOR1_DIR1, OUTPUT);
pinMode(MOTOR1_DIR2, OUTPUT);
pinMode(MOTOR2_PWM, OUTPUT);
pinMode(MOTOR2_DIR1, OUTPUT);
pinMode(MOTOR2_DIR2, OUTPUT);
digitalWrite(MOTOR1_DIR1, HIGH);
digitalWrite(MOTOR1_DIR2, LOW);
digitalWrite(MOTOR2_DIR1, HIGH);
digitalWrite(MOTOR2_DIR2, LOW);
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
analogWrite(MOTOR1_PWM, slider1);
analogWrite(MOTOR2_PWM, slider2);
int speed1Percent = map(slider1, 0, 255, 0, 100);
int speed2Percent = map(slider2, 0, 255, 0, 100);
Serial.println("Motor1: " + String(speed1Percent) + "%, " +
"Motor2: " + String(speed2Percent) + "%");
});
}
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
int redValue = slider1;
int blueValue = slider2;
int greenValue = (slider1 + slider2) / 2;
analogWrite(RED_PIN, redValue);
analogWrite(GREEN_PIN, greenValue);
analogWrite(BLUE_PIN, blueValue);
Serial.println("RGB - R:" + String(redValue) +
" G:" + String(greenValue) +
" B:" + String(blueValue));
});
}
class SliderSmoother {
private:
int currentValue = 0;
int targetValue = 0;
unsigned long lastUpdate = 0;
const int SMOOTH_RATE = 5;
public:
void setTarget(int target) {
targetValue = target;
}
int getCurrentValue() {
return currentValue;
}
bool update() {
if (millis() - lastUpdate > 10) {
bool changed = false;
if (currentValue < targetValue) {
currentValue = min(currentValue + SMOOTH_RATE, targetValue);
changed = true;
} else if (currentValue > targetValue) {
currentValue = max(currentValue - SMOOTH_RATE, targetValue);
changed = true;
}
lastUpdate = millis();
return changed;
}
return false;
}
};
SliderSmoother smoother1, smoother2;
void setup() {
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
smoother1.setTarget(slider1);
smoother2.setTarget(slider2);
});
}
void loop() {
server.loop();
bool changed1 = smoother1.update();
bool changed2 = smoother2.update();
if (changed1 || changed2) {
analogWrite(9, smoother1.getCurrentValue());
analogWrite(10, smoother2.getCurrentValue());
}
}
void setupThresholdControl() {
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
const int LOW_THRESHOLD = 85;
const int MEDIUM_THRESHOLD = 170;
if (slider1 < LOW_THRESHOLD) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
} else if (slider1 < MEDIUM_THRESHOLD) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
} else {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
analogWrite(9, slider2);
});
}
const int PRESETS[][2] = {
{0, 0},
{64, 128},
{128, 128},
{255, 128},
{255, 255}
};
void applyPreset(int presetNumber) {
if (presetNumber >= 0 && presetNumber < 5) {
slider1Value = PRESETS[presetNumber][0];
slider2Value = PRESETS[presetNumber][1];
analogWrite(9, slider1Value);
analogWrite(10, slider2Value);
webSliderPage.sendToWebSlider(slider1Value, slider2Value);
Serial.println("Applied preset " + String(presetNumber) +
": " + String(slider1Value) + ", " + String(slider2Value));
}
}
void setupPresetSystem() {
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
analogWrite(9, slider1);
analogWrite(10, slider2);
});
}
void loop() {
server.loop();
static bool lastButton = false;
bool currentButton = digitalRead(7);
if (currentButton && !lastButton) {
static int currentPreset = 0;
applyPreset(currentPreset);
currentPreset = (currentPreset + 1) % 5;
}
lastButton = currentButton;
}
const int LED_STRIP_PIN = 6;
const int NUM_LEDS = 30;
void setupLEDStrip() {
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
uint8_t brightness = slider1;
uint8_t hue = slider2;
Serial.println("LED Strip - Brightness: " + String(brightness) +
", Hue: " + String(hue));
});
}
const int FAN1_PIN = 9;
const int FAN2_PIN = 10;
void setupFanControl() {
pinMode(FAN1_PIN, OUTPUT);
pinMode(FAN2_PIN, OUTPUT);
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
int fan1Speed = (slider1 > 50) ? map(slider1, 50, 255, 100, 255) : 0;
int fan2Speed = (slider2 > 50) ? map(slider2, 50, 255, 100, 255) : 0;
analogWrite(FAN1_PIN, fan1Speed);
analogWrite(FAN2_PIN, fan2Speed);
Serial.println("Fan1: " + String(map(fan1Speed, 0, 255, 0, 100)) + "%, " +
"Fan2: " + String(map(fan2Speed, 0, 255, 0, 100)) + "%");
});
}
const int VOLUME1_PIN = 9;
const int VOLUME2_PIN = 10;
void setupAudioControl() {
pinMode(VOLUME1_PIN, OUTPUT);
pinMode(VOLUME2_PIN, OUTPUT);
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
slider1Value = slider1;
slider2Value = slider2;
float volume1 = pow(slider1 / 255.0, 2) * 255;
float volume2 = pow(slider2 / 255.0, 2) * 255;
analogWrite(VOLUME1_PIN, (int)volume1);
analogWrite(VOLUME2_PIN, (int)volume2);
Serial.println("Volume1: " + String((int)volume1) +
", Volume2: " + String((int)volume2));
});
}
1. Deslizadores no responden
Verificar la conexión WebSocket en la consola del navegador
Verificar la conectividad de red entre el dispositivo y Arduino
Recargar la página del navegador para restablecer la conexión
Verificar el Monitor Serial para errores de conexión
Valores que no alcanzan el rango completo
Verificar la configuración del rango del control deslizante en la interfaz web
Comprobar problemas de mapeo de valores en la función de callback
Probar con diferentes navegadores o dispositivos
Control entrecortado o inconsistente
Implementar suavizado de valores para cambios graduales
Verificar problemas de latencia de la red
Añadir anti-rebote para cambios rápidos de valor
4. La salida PWM no funciona
Verificar que los pines soporten PWM (consultar el pinout del ESP32)
Asegúrate de llamar a analogWrite() con los números de pin correctos
Verifica las conexiones de hardware y los requisitos de carga
Añadir depuración exhaustiva:
void debugSliderValues(int slider1, int slider2) {
Serial.println("=== Slider Debug ===");
Serial.println("Slider 1: " + String(slider1) + " (" + String(map(slider1, 0, 255, 0, 100)) + "%)");
Serial.println("Slider 2: " + String(slider2) + " (" + String(map(slider2, 0, 255, 0, 100)) + "%)");
Serial.println("PWM Pin 9: " + String(slider1));
Serial.println("PWM Pin 10: " + String(slider2));
Serial.println("===================");
}
Control de brillo de la iluminación de la habitación
Interfaz de mezcla de colores RGB
Control de la velocidad de animación de la tira de LEDs
Control de la intensidad de la iluminación del escenario
Control de la velocidad del robot
Regulación de la velocidad del ventilador
Control del caudal de la bomba
Velocidad de la cinta transportadora
Interfaz de control de volumen
Control de tono y ecualizador
Intensidad de efectos de sonido
Control de visualización de música
Control de climatización (intensidad de calefacción/refrigeración)
Control de la posición de la persiana
Control del caudal del sistema de riego
Brillo/volumen del dispositivo inteligente
Utiliza deslizadores para los límites de velocidad y un joystick para la dirección:
int maxSpeed = 255;
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
maxSpeed = slider1;
});
webJoystickPage.onJoystickValueFromWeb([](int x, int y) {
int scaledX = map(x, -100, 100, -maxSpeed, maxSpeed);
int scaledY = map(y, -100, 100, -maxSpeed, maxSpeed);
controlRobot(scaledX, scaledY);
});
Usa deslizadores para controlar la modulación por ancho de pulso (PWM) y pines digitales para encender/apagar:
webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {
if (webDigitalPinsPage.getPinState(2)) {
analogWrite(9, slider1);
} else {
analogWrite(9, 0);
}
if (webDigitalPinsPage.getPinState(3)) {
analogWrite(10, slider2);
} else {
analogWrite(10, 0);
}
});
Después de dominar el ejemplo WebSlider, prueba:
WebJoystick - Para control direccional en 2D
WebDigitalPins - Para control discreto de encendido/apagado
WebMonitor - Para depurar valores de deslizadores
MultipleWebApps - Combinando deslizadores con otros controles
Para obtener ayuda adicional:
Consulta la documentación de la API
Visita los tutoriales de DIYables: https://esp32io.com/tutorials/diyables-esp32-webapps
Foros de la comunidad ESP32
※ NUESTROS MENSAJES
No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!