Exemplo Arduino WebSlider - Tutorial de Interface de Controle com Dois Sliders
Visão Geral
O exemplo WebSlider oferece dois controles deslizantes (sliders) independentes, acessíveis por um navegador web. Projetado para a plataforma educacional Arduino Uno R4 WiFi e DIYables STEM V4 IoT com recursos analógicos avançados, recursos de controle preciso e módulos educacionais integrados para aprender PWM e eletrônica analógica. Cada slider oferece valores de 0 a 255, o que os torna perfeitos para controle PWM, ajuste de brilho, controle de velocidade de motor e qualquer aplicação que exija valores de controle semelhantes a analógicos.
Recursos
Dois Sliders: Dois controles deslizantes independentes (faixa de 0-255 cada)
Valores em Tempo Real: Atualizações instantâneas de valores via comunicação WebSocket
Compatível com PWM: Valores de 8 bits (0-255) perfeitos para as funções analogWrite()
Retorno Visual: Exibição do valor em tempo real para cada slider
Botões de Predefinição: Valores predefinidos rápidos para configurações comuns
Suporte a Toque e Mouse: Funciona em computadores, tablets e dispositivos móveis
Design Responsivo: Adapta-se a diferentes tamanhos de tela
Persistência de Valores: Os sliders lembram a última posição quando a página é recarregada
Extensível para Outras Plataformas: Atualmente implementado para o Arduino Uno R4 WiFi, mas pode ser estendido para outras plataformas de hardware. Veja DIYables_WebApps_ESP32
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.
Conecte a placa Arduino Uno R4/DIYables STEM V4 IoT ao seu computador usando um cabo USB.
Abra o Arduino IDE no seu computador.
Selecione a placa Arduino Uno R4 apropriada (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
Vá até o ícone Libraries na barra lateral esquerda do Arduino IDE.
Pesquise por "DIYables WebApps" e encontre a biblioteca DIYables WebApps da DIYables
Clique no botão Install para instalar a biblioteca.
Será solicitado que você instale algumas outras dependências de bibliotecas
Clique no botão Install All para instalar todas as dependências da biblioteca.
No Arduino IDE, vá em File Examples DIYables WebApps WebSlider, ou copie o código acima e cole no editor do Arduino IDE
/* * DIYables WebApp Library - Web Slider Example * * This example demonstrates the Web Slider feature: * - Two independent sliders (0-255) * - Real-time value monitoring * - Template for hardware control * * Hardware: Arduino Uno R4 WiFi or DIYables STEM V4 IoT * * Setup: * 1. Update WiFi credentials below * 2. Upload the sketch to your Arduino * 3. Open Serial Monitor to see the IP address * 4. Navigate to http://[IP_ADDRESS]/webslider */#include <DIYablesWebApps.h>// WiFi credentials - UPDATE THESE WITH YOUR NETWORKconstchar WIFI_SSID[] = "YOUR_WIFI_SSID";constchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";// Create WebApp server and page instancesUnoR4ServerFactory serverFactory;DIYablesWebAppServerwebAppsServer(serverFactory, 80, 81);DIYablesHomePage homePage;DIYablesWebSliderPage webSliderPage;// Current slider valuesint slider1Value = 64; // Default 25%int slider2Value = 128; // Default 50%voidsetup() {Serial.begin(9600);delay(1000);// TODO: Initialize your hardware pins hereSerial.println("DIYables WebApp - Web Slider Example");// Add home and web slider pageswebAppsServer.addApp(&homePage);webAppsServer.addApp(&webSliderPage);// Optional: Add 404 page for better user experiencewebAppsServer.setNotFoundPage(DIYablesNotFoundPage());// Start the WebApp serverif (!webAppsServer.begin(WIFI_SSID, WIFI_PASSWORD)) {while (1) {Serial.println("Failed to start WebApp server!");delay(1000); } }// Set up slider callback for value changes webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {// Store the received values slider1Value = slider1; slider2Value = slider2;// Print slider values (0-255)Serial.println("Slider 1: " + String(slider1) + ", Slider 2: " + String(slider2));// TODO: Add your control logic here based on slider values// Examples:// - Control PWM: analogWrite(LED_PIN, slider1);// - Control servos: servo.write(map(slider1, 0, 255, 0, 180));// - Control motor speed: analogWrite(MOTOR_PIN, slider2);// - Control brightness: strip.setBrightness(slider1);// - Send values via Serial, I2C, SPI, etc. });// Set up callback for config requests (when client requests current values) webSliderPage.onSliderValueToWeb([]() { webSliderPage.sendToWebSlider(slider1Value, slider2Value);Serial.println("Web client requested values - Sent: Slider1=" + String(slider1Value) + ", Slider2=" + String(slider2Value)); });}voidloop() {// Handle WebApp server communicationswebAppsServer.loop();// TODO: Add your main application code heredelay(10);}
Configure as credenciais de WiFi no código atualizando estas linhas:
Clique no botão Upload no Arduino IDE para fazer o upload do código para o Arduino UNO R4/DIYables STEM V4 IoT
Abra o Serial Monitor
Confira o resultado no Serial Monitor. Ele se parece com o abaixo
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
DIYables WebApp - Web Slider Example
INFO: Added app /
INFO: Added app /web-slider
DIYables WebApp Library
Platform: Arduino Uno R4 WiFi
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
==========================================
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2
Se você não vir nada, reinicie a placa Arduino.
Anote o endereço IP exibido e digite esse endereço na barra de endereços de um navegador web no seu smartphone ou PC.
Exemplo: http://192.168.0.2
Você verá a página inicial como na imagem abaixo:
Clique no link Web Slider e você verá a interface do app Web Slider como abaixo:
Ou você também pode acessar a página diretamente pelo endereço IP seguido de /web-slider. Por exemplo: http://192.168.0.2/web-slider
Tente mover os dois sliders para controlar valores analógicos (0-255) e observe o retorno em tempo real no Serial Monitor.
Personalização Criativa - Adapte o Código ao Seu Projeto
Slider 1: Primeiro controle deslizante com exibição de valor (0-255)
Slider 2: Segundo controle deslizante com exibição de valor (0-255)
Exibição de Valor: Valores numéricos em tempo real para os dois sliders
Botões de Predefinição: Acesso rápido a valores comuns (0%, 25%, 50%, 75%, 100%)
Operando os Sliders
Computador (Controle com Mouse)
Clicar e Arrastar: Clique na alça do slider e arraste para ajustar o valor
Clicar na Posição: Clique em qualquer lugar da trilha do slider para saltar para esse valor
Controle Fino: Use pequenos movimentos do mouse para um ajuste preciso
Celular/Tablet (Controle por Toque)
Tocar e Arrastar: Toque na alça do slider e arraste para a nova posição
Tocar na Posição: Toque na trilha do slider para definir o valor
Controle Suave: Arrastar o dedo proporciona mudanças suaves de valor
Faixas de Valores
Cada slider oferece:
Valor Mínimo: 0 (0% - completamente desligado)
Valor Máximo: 255 (100% - intensidade máxima)
Resolução: 256 passos discretos (precisão de 8 bits)
Compatibilidade com PWM: Uso direto com a função analogWrite()
Exemplos de Programação
Tratador Básico de Slider
voidsetup() {// Set up slider callback for value changes webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {// Store the received values slider1Value = slider1; slider2Value = slider2;// Print slider values (0-255)Serial.println("Slider 1: " + String(slider1) + ", Slider 2: " + String(slider2));// Add your control logic here });}
Controle de Brilho de LED
// Pin definitions for PWM LEDsconstint LED1_PIN = 9; // PWM pin for first LEDconstint LED2_PIN = 10; // PWM pin for second LEDvoidsetup() {// Configure LED pins as outputspinMode(LED1_PIN, OUTPUT);pinMode(LED2_PIN, OUTPUT);// Set initial brightnessanalogWrite(LED1_PIN, slider1Value);analogWrite(LED2_PIN, slider2Value); webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {// Store values slider1Value = slider1; slider2Value = slider2;// Control LED brightness directly (0-255 PWM)analogWrite(LED1_PIN, slider1);analogWrite(LED2_PIN, slider2);Serial.println("LED1 Brightness: " + String(slider1) + ", LED2 Brightness: " + String(slider2)); });}
void setupThresholdControl() { webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) { slider1Value = slider1; slider2Value = slider2;// Threshold-based control for discrete outputsconstint LOW_THRESHOLD = 85; // 33%constint MEDIUM_THRESHOLD = 170; // 66%// Control digital outputs based on slider 1 thresholdsif (slider1 < LOW_THRESHOLD) {// Low level: Turn off all outputsdigitalWrite(2, LOW);digitalWrite(3, LOW);digitalWrite(4, LOW); } elseif (slider1 < MEDIUM_THRESHOLD) {// Medium level: Turn on first outputdigitalWrite(2, HIGH);digitalWrite(3, LOW);digitalWrite(4, LOW); } else {// High level: Turn on all outputsdigitalWrite(2, HIGH);digitalWrite(3, HIGH);digitalWrite(4, HIGH); }// Use slider 2 for analog PWM controlanalogWrite(9, slider2); });}
Sistema de Valores Predefinidos
// Predefined preset valuesconstint PRESETS[][2] = { {0, 0}, // Preset 0: Both off {64, 128}, // Preset 1: Low/Medium {128, 128}, // Preset 2: Both medium {255, 128}, // Preset 3: High/Medium {255, 255} // Preset 4: Both maximum};void applyPreset(int presetNumber) {if (presetNumber >= 0 && presetNumber < 5) { slider1Value = PRESETS[presetNumber][0]; slider2Value = PRESETS[presetNumber][1];// Update hardwareanalogWrite(9, slider1Value);analogWrite(10, slider2Value);// Send updated values to web interface webSliderPage.sendToWebSlider(slider1Value, slider2Value);Serial.println("Applied preset " + String(presetNumber) + ": " + String(slider1Value) + ", " + String(slider2Value)); }}void setupPresetSystem() {// You could trigger presets based on other inputs// For example, reading digital pins for preset buttons webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) { slider1Value = slider1; slider2Value = slider2;// Your normal slider handlinganalogWrite(9, slider1);analogWrite(10, slider2); });}voidloop() { server.loop();// Check for preset trigger conditions// Example: Read buttons connected to digital pinsstaticbool lastButton = false;bool currentButton = digitalRead(7); // Preset button on pin 7if (currentButton && !lastButton) { // Button pressedstaticint currentPreset = 0; applyPreset(currentPreset); currentPreset = (currentPreset + 1) % 5; // Cycle through presets } lastButton = currentButton;}
Exemplos de Integração com Hardware
Controle de Fita LED
// For WS2812B or similar addressable LED strips// (requires additional libraries like FastLED or Adafruit NeoPixel)constint LED_STRIP_PIN = 6;constint NUM_LEDS = 30;void setupLEDStrip() {// Initialize LED strip (depends on library used) webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) { slider1Value = slider1; slider2Value = slider2;// Slider 1 controls brightness (0-255)// Slider 2 controls color temperature or hueuint8_t brightness = slider1;uint8_t hue = slider2;// Update LED strip (example with conceptual functions)// strip.setBrightness(brightness);// strip.fill(CHSV(hue, 255, 255));// strip.show();Serial.println("LED Strip - Brightness: " + String(brightness) + ", Hue: " + String(hue)); });}
// For controlling audio amplifier or volume ICconstint VOLUME1_PIN = 9; // PWM output to volume controlconstint VOLUME2_PIN = 10; // Second channel or tone controlvoid setupAudioControl() {pinMode(VOLUME1_PIN, OUTPUT);pinMode(VOLUME2_PIN, OUTPUT); webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) { slider1Value = slider1; slider2Value = slider2;// Use logarithmic scaling for better audio perceptionfloat volume1 = pow(slider1 / 255.0, 2) * 255; // Square lawfloat 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)); });}
Tutorial em Vídeo
O vídeo de demonstração abaixo usa o código abaixo:
/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/diyables-web-apps-web-slider*//* * DIYables WebApp Library - Web Slider Example * * This example demonstrates the Web Slider feature: * - Two independent sliders (0-255) * - Real-time value monitoring * - Template for hardware control * * Hardware: Arduino Uno R4 WiFi or DIYables STEM V4 IoT * * Setup: * 1. Update WiFi credentials below * 2. Upload the sketch to your Arduino * 3. Open Serial Monitor to see the IP address * 4. Navigate to http://[IP_ADDRESS]/webslider */#include <DIYablesWebApps.h>#include <Servo.h>Servo servo1, servo2;// WiFi credentials - UPDATE THESE WITH YOUR NETWORKconstchar WIFI_SSID[] = "YOUR_WIFI_SSID";constchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";// Create WebApp server and page instancesUnoR4ServerFactory serverFactory;DIYablesWebAppServerwebAppsServer(serverFactory, 80, 81);DIYablesHomePage homePage;DIYablesWebSliderPage webSliderPage;// Current slider valuesint slider1Value = 64; // Default 25%int slider2Value = 128; // Default 50%voidsetup() {Serial.begin(9600);delay(1000);// TODO: Initialize your hardware pins here servo1.attach(3); servo2.attach(5);// Set initial positions servo1.write(map(slider1Value, 0, 255, 0, 180)); servo2.write(map(slider2Value, 0, 255, 0, 180));Serial.println("DIYables WebApp - Web Slider Example");// Add home and web slider pageswebAppsServer.addApp(&homePage);webAppsServer.addApp(&webSliderPage);// Optional: Add 404 page for better user experiencewebAppsServer.setNotFoundPage(DIYablesNotFoundPage());// Start the WebApp serverif (!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;// Map slider values (0-255) to servo angles (0-180°)int angle1 = map(slider1, 0, 255, 0, 180);int angle2 = map(slider2, 0, 255, 0, 180);// Move servos to calculated positions servo1.write(angle1); servo2.write(angle2);Serial.println("Servo1: " + String(angle1) + "°, Servo2: " + String(angle2) + "°"); });// Set up callback for config requests (when client requests current values) webSliderPage.onSliderValueToWeb([]() { webSliderPage.sendToWebSlider(slider1Value, slider2Value);Serial.println("Web client requested values - Sent: Slider1=" + String(slider1Value) + ", Slider2=" + String(slider2Value)); });}voidloop() {// Handle WebApp server communicationswebAppsServer.loop();// TODO: Add your main application code heredelay(10);}
Solução de Problemas
Problemas Comuns
1. Os sliders não respondem
Verifique a conexão WebSocket no console do navegador
Verifique a conectividade de rede entre o dispositivo e o Arduino
Atualize a página do navegador para reiniciar a conexão
Verifique erros de conexão no Serial Monitor
2. Os valores não alcançam a faixa completa
Verifique as configurações de faixa do slider na interface web
Verifique problemas de mapeamento de valores na função de callback
Teste com navegadores ou dispositivos diferentes
3. Controle irregular ou inconsistente
Implemente a suavização de valores para mudanças graduais
Verifique problemas de latência de rede
Adicione debouncing para mudanças rápidas de valor
4. A saída PWM não funciona
Verifique se os pinos suportam PWM (consulte a pinagem do Arduino)
Garanta que analogWrite() seja chamado com os números de pino corretos
Verifique as conexões de hardware e os requisitos de carga
Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!