Dit voorbeeld laat zien hoe u meerdere webapplicaties gelijktijdig gebruikt met de DIYables ESP32 WebApps Library. Het demonstreert de integratie van diverse interactieve webinterfaces — zoals monitoring, bediening en communicatie — binnen één project. Ontworpen voor het ESP32-platform, is dit voorbeeld ideaal om te leren hoe u meerdere webgebaseerde functies combineert en beheert, wat een solide basis biedt voor geavanceerde IoT-projecten.
Kenmerken
Homepagina: Centrale navigatiehub met links naar alle webapplicaties
Web Monitor: Real-time seriële communicatie- en debuginterface
Chat Interface: Interactief chatsysteem met ESP32-reactiemogelijkheden
Digitale Pin Bediening: Webgebaseerde aansturing en monitoring van alle digitale pinnen
Dubbele Slider Bediening: Twee onafhankelijke schuifregelaars voor analoge waardebediening
Virtuele Joystick: 2D-positiebediening voor richtingsgerichte toepassingen
Geünificeerde Statusbeheer: Alle interfaces delen gesynchroniseerde statusinformatie
Real-time Updates: WebSocket-communicatie voor directe respons
Template Structuur: Klaar om te personaliseren als basis voor complexe projecten
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.
Verbind het ESP32-board met uw computer via een USB-kabel.
Start de Arduino IDE op uw computer.
Selecteer het juiste ESP32-board (bijvoorbeeld ESP32 Dev Module) en de juiste COM-poort.
Ga naar het Libraries-icoon in de linkerzijbalk van de Arduino IDE.
Zoek op "DIYables ESP32 WebApps" en zoek vervolgens de DIYables ESP32 WebApps Library van DIYables.
Klik op de Installeren-knop om de bibliotheek te installeren.
Er wordt gevraagd om enkele andere bibliotheekafhankelijkheden te installeren.
Klik op de Alles installeren-knop om alle afhankelijkheden te installeren.
Open in de Arduino IDE Bestand Voorbeelden DIYables ESP32 WebApps MultipleWebApps voorbeeld, of kopieer bovenstaande code en plak deze in de editor van de Arduino IDE.
/* * DIYables WebApp Library - Multiple WebApps Example * * This example demonstrates multiple web apps of the DIYables WebApp library: * - Home page with links to multiple web apps * - Web Monitor: Real-time serial monitoring via WebSocket * - Web Slider: Dual slider control * - Web Joystick: Interactive joystick control * - Web Rotator: Interactive rotatable disc control * - Web Analog Gauge: Professional circular gauge for sensor monitoring * - Web Table: Two-column data table with real-time updates * - Web Plotter: See WebPlotter example for real-time data visualization * * Features: * - Simplified callback system - no manual command parsing needed * - Automatic state synchronization and JSON handling * - All protocol details handled by the library * - Template for hardware control * * Hardware: ESP32 Boards * * 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 the IP address in your web browser */#include <DIYables_ESP32_Platform.h>#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 instancesESP32ServerFactory factory;DIYablesWebAppServerwebAppsServer(factory, 80, 81);DIYablesHomePage homePage;DIYablesWebMonitorPage webMonitorPage;DIYablesWebSliderPage webSliderPage;DIYablesWebJoystickPage webJoystickPage(false, 5); // autoReturn=false, sensitivity=5DIYablesWebRotatorPage webRotatorPage(ROTATOR_MODE_CONTINUOUS); // Continuous rotation mode (0-360°)DIYablesWebAnalogGaugePage webAnalogGaugePage(0.0, 100.0, "%"); // Range: 0-100%, units: %DIYablesWebTablePage webTablePage;// Variables to track statesint currentSlider1 = 64; // Slider 1 value (0-255)int currentSlider2 = 128; // Slider 2 value (0-255)int currentJoystickX = 0; // Current joystick X value (-100 to 100)int currentJoystickY = 0; // Current joystick Y value (-100 to 100)int currentRotatorAngle = 0; // Current rotator angle (0-360°)float currentGaugeValue = 50.0; // Current gauge value (0.0-100.0)voidsetup() {Serial.begin(9600);delay(1000);// TODO: Initialize your hardware pins hereSerial.println("DIYables ESP32 WebApp - Multiple Apps Example");// Add all web applications to the serverwebAppsServer.addApp(&homePage);webAppsServer.addApp(&webMonitorPage);webAppsServer.addApp(&webSliderPage);webAppsServer.addApp(&webJoystickPage);webAppsServer.addApp(&webRotatorPage);webAppsServer.addApp(&webAnalogGaugePage);webAppsServer.addApp(&webTablePage);// Add more web apps here (e.g., WebPlotter)// Set 404 Not Found page (optional - for better user experience)webAppsServer.setNotFoundPage(DIYablesNotFoundPage());// Configure table structure (only attribute names, values will be updated dynamically) webTablePage.addRow("Arduino Status"); webTablePage.addRow("WiFi Connected"); webTablePage.addRow("Uptime"); webTablePage.addRow("Slider 1"); webTablePage.addRow("Slider 2"); webTablePage.addRow("Joystick X"); webTablePage.addRow("Joystick Y"); webTablePage.addRow("Rotator Angle"); webTablePage.addRow("Gauge Value");// Start the WebApp serverif (!webAppsServer.begin(WIFI_SSID, WIFI_PASSWORD)) {while (1) {Serial.println("Failed to start WebApp server!");delay(1000); } } setupCallbacks();}void setupCallbacks() {// Web Monitor callback - echo messages back webMonitorPage.onWebMonitorMessage([](const String& message) {Serial.println("Web Monitor: " + message); webMonitorPage.sendToWebMonitor("Arduino received: " + message); });// Web Slider callback - handle slider values webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) {// Store the received values currentSlider1 = slider1; currentSlider2 = slider2;// Print slider values (0-255) without String concatenationSerial.print("Slider 1: ");Serial.print(slider1);Serial.print(", Slider 2: ");Serial.println(slider2);// Update table with new slider values using String() conversion webTablePage.sendValueUpdate("Slider 1", String(slider1)); webTablePage.sendValueUpdate("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);// Update gauge based on slider1 value (map 0-255 to 0-100) currentGaugeValue = map(slider1, 0, 255, 0, 100); webAnalogGaugePage.sendToWebAnalogGauge(currentGaugeValue);char gaugeStr[16]; snprintf(gaugeStr, sizeof(gaugeStr), "%.1f%%", currentGaugeValue); webTablePage.sendValueUpdate("Gauge Value", String(gaugeStr)); });// Handle slider value requests webSliderPage.onSliderValueToWeb([]() { webSliderPage.sendToWebSlider(currentSlider1, currentSlider2); });// Web Joystick callback - handle joystick movement webJoystickPage.onJoystickValueFromWeb([](int x, int y) {// Store the received values currentJoystickX = x; currentJoystickY = y;// Print joystick position values (-100 to +100)Serial.print("Joystick - X: ");Serial.print(x);Serial.print(", Y: ");Serial.println(y);Serial.print(x);Serial.print(", Y: ");Serial.println(y);// Update table with new joystick values webTablePage.sendValueUpdate("Joystick X", String(x)); webTablePage.sendValueUpdate("Joystick Y", String(y));// TODO: Add your control logic here based on joystick position// Examples:// - Control motors: if (x > 50) { /* move right */ }// - Control servos: servo.write(map(y, -100, 100, 0, 180));// - Control LEDs: analogWrite(LED_PIN, map(abs(x), 0, 100, 0, 255)); });// Handle joystick values requests (when web page loads/reconnects) webJoystickPage.onJoystickValueToWeb([]() { webJoystickPage.sendToWebJoystick(currentJoystickX, currentJoystickY); });// Web Rotator callback - handle rotation angle changes webRotatorPage.onRotatorAngleFromWeb([](float angle) {// Store the received angle currentRotatorAngle = (int)angle;// Print rotator angle (0-360°)Serial.println("Rotator angle: " + String(angle) + "°");// Update table with new rotator angle webTablePage.sendValueUpdate("Rotator Angle", String(angle, 0) + "°");// TODO: Add your control logic here based on rotator angle// Examples:// - Control servo: servo.write(map(angle, 0, 360, 0, 180));// - Control stepper motor: stepper.moveTo(angle);// - Control directional LED strip: setLEDDirection(angle); });// Handle analog gauge value requests (when web page loads/reconnects) webAnalogGaugePage.onGaugeValueRequest([]() { webAnalogGaugePage.sendToWebAnalogGauge(currentGaugeValue); });// Handle table data requests (when web page loads/reconnects) webTablePage.onTableValueRequest([]() {// Send initial values to the table webTablePage.sendValueUpdate("Arduino Status", "Running"); webTablePage.sendValueUpdate("WiFi Connected", "Yes"); webTablePage.sendValueUpdate("Uptime", "0 seconds"); webTablePage.sendValueUpdate("Slider 1", String(currentSlider1)); webTablePage.sendValueUpdate("Slider 2", String(currentSlider2)); webTablePage.sendValueUpdate("Joystick X", String(currentJoystickX)); webTablePage.sendValueUpdate("Joystick Y", String(currentJoystickY)); webTablePage.sendValueUpdate("Rotator Angle", String(currentRotatorAngle) + "°"); webTablePage.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%"); });}voidloop() {// Handle WebApp server communicationswebAppsServer.loop();// Update table with current uptime every 5 secondsstaticunsignedlong lastUptimeUpdate = 0;if (millis() - lastUptimeUpdate > 5000) { lastUptimeUpdate = millis();unsignedlong uptimeSeconds = millis() / 1000;String uptimeStr = String(uptimeSeconds) + " seconds";if (uptimeSeconds >= 60) { uptimeStr = String(uptimeSeconds / 60) + "m " + String(uptimeSeconds % 60) + "s"; } webTablePage.sendValueUpdate("Uptime", uptimeStr); }// Simulate sensor data updates every 3 secondsstaticunsignedlong lastSensorUpdate = 0;if (millis() - lastSensorUpdate > 3000) { lastSensorUpdate = millis();// Simulate a sensor reading that varies over timefloat sensorValue = 50.0 + 30.0 * sin(millis() / 10000.0); // Oscillates between 20-80 currentGaugeValue = sensorValue;// Update gauge and table webAnalogGaugePage.sendToWebAnalogGauge(currentGaugeValue); webTablePage.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%"); }// TODO: Add your main application code heredelay(10);}
Stel de WiFi-inloggegevens in door deze regels in de code aan te passen:
Klik op de Uploaden-knop in de Arduino IDE om de code naar de ESP32 te uploaden.
Open de seriële monitor.
Bekijk het resultaat in de seriële monitor. Het ziet er uit als hieronder:
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
DIYables WebApp - Multiple Apps Example
INFO: Added app /
INFO: Added app /web-monitor
INFO: Added app /web-slider
INFO: Added app /web-joystick
INFO: Added app /web-rotator
INFO: Added app /web-gauge
INFO: Added app /web-table
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
📋 Beschikbare applicaties:
🏠 Homepagina: http://192.168.0.2/
📊 Web Monitor: http://192.168.0.2/web-monitor
🎚️ Web Slider: http://192.168.0.2/web-slider
🕹️ Web Joystick: http://192.168.0.2/web-joystick
🔄 Web Rotator: http://192.168.0.2/web-rotator
⏲️ Web Analoge Meter: http://192.168.0.2/web-gauge
📊 Web Tabel: http://192.168.0.2/web-table
==========================================
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Als u niets ziet, start dan het ESP32-board opnieuw op.
Noteer het getoonde IP-adres en voer dit adres in de adresbalk van een webbrowser op uw smartphone of pc in.
Voorbeeld: http://192.168.0.2
U ziet de homepagina met alle webapplicaties zoals hieronder afgebeeld:
Klik op een willekeurige webapplicatielink (Chat, Web Monitor, Web Digital Pins, Web Slider, Web Joystick, enzovoort), u ziet dan de gebruikersinterface van de betreffende webapp.
U kunt ook elke pagina direct benaderen via het IP-adres gevolgd door het pad van de app, bijvoorbeeld: http://192.168.0.2/chat, http://192.168.0.2/web-monitor, enzovoort.
Verken alle webapplicaties: probeer te chatten met Arduino, bekijk seriële output, bedien digitale pinnen, stel schuifregelaars in en gebruik de virtuele joystick om de volledige mogelijkheden van de geïntegreerde webinterface te ervaren.
Navigatie Webinterface
Homepagina Dashboard
De homepagina fungeert als uw bedieningscentrum met links naar alle applicaties:
Web Monitor:/webmonitor - Seriële communicatie-interface
Chat:/chat - Interactief berichtenverkeer met Arduino
Digitale Pinnen:/digital-pins - Pinbediening en monitoring
Web Slider:/webslider - Dubbele analoge bedieningsschuifregelaars
Web Joystick:/webjoystick - 2D-positiebedieningsinterface
Dit uitgebreide voorbeeld biedt een basis voor uw creatieve projecten. Pas onderstaande configuraties aan om verbluffende IoT-applicaties te bouwen die bij uw unieke visie passen.
Digitale Pin Configuratie
Het voorbeeld heeft specifieke pinnen vooraf geconfigureerd voor verschillende doeleinden:
// Maak joystick aan met aangepaste instellingen // autoReturn=false: joystick blijft op laatste positie bij loslaten // sensitivity=5: alleen updates verzenden bij beweging > 5% DIYablesWebJoystickPage webJoystickPage(false, 5);
Statusvariabelen
Het voorbeeld houdt gesynchroniseerde status bij over alle interfaces:
int pinStates[16] = { LOW }; // Houdt staat pinnen bij (pinnen 0-13) int currentSlider1 = 64; // Slider 1 waarde (0-255) - 25% int currentSlider2 = 128; // Slider 2 waarde (0-255) - 50% int currentJoystickX = 0; // Joystick X waarde (-100 tot 100) int currentJoystickY = 0; // Joystick Y waarde (-100 tot 100)
Ingebouwde Chatcommando's
De chatinterface bevat diverse vooraf geprogrammeerde commando’s:
Basiscommando's
hello - Vriendelijke begroeting
time - Toont uptime van de ESP32 in seconden
status - Geeft status van ESP32 en LED weer
help - Lijst van beschikbare commando's
Bedieningscommando’s
led on - Zet de ingebouwde LED aan
led off - Zet de ingebouwde LED uit
Voorbeeld Chatgesprek
User: hello
ESP32: Hello! I'm your Arduino. How can I help you?
User: led on
ESP32: Built-in LED is now ON!
User: time
ESP32: I've been running for 1245 seconds.
User: status
ESP32: Status: Running smoothly! LED is ON
Voorbeelden van Programmeerintegratie
Compleet Robotbesturingssysteem
#include <Servo.h> // Hardware definities constint MOTOR_LEFT_PWM = 9; constint MOTOR_RIGHT_PWM = 10; constint SERVO_PAN = 11; constint SERVO_TILT = 12; constint LED_STRIP_PIN = 6; Servo panServo, tiltServo; voidsetup() { // Hardware initialisatie panServo.attach(SERVO_PAN); tiltServo.attach(SERVO_TILT); pinMode(MOTOR_LEFT_PWM, OUTPUT); pinMode(MOTOR_RIGHT_PWM, OUTPUT); // ... WebApp setup code ... setupRobotCallbacks(); } void setupRobotCallbacks() { // Gebruik joystick voor robotbeweging webJoystickPage.onJoystickValueFromWeb([](int x, int y) { // Zet joystick om naar tankbesturing int leftSpeed = y + (x / 2); int rightSpeed = y - (x / 2); leftSpeed = constrain(leftSpeed, -100, 100); rightSpeed = constrain(rightSpeed, -100, 100); // Pas snelheidslimieten aan op basis van sliders leftSpeed = map(leftSpeed, -100, 100, -currentSlider1, currentSlider1); rightSpeed = map(rightSpeed, -100, 100, -currentSlider1, currentSlider1); // Bestuur motoren analogWrite(MOTOR_LEFT_PWM, abs(leftSpeed)); analogWrite(MOTOR_RIGHT_PWM, abs(rightSpeed)); Serial.println("Robot - Left: " + String(leftSpeed) + ", Right: " + String(rightSpeed)); }); // Gebruik sliders voor camera pan/tilt bediening webSliderPage.onSliderValueFromWeb([](int slider1, int slider2) { // Slider 1 regelt maximale snelheid, slider 2 regelt camerakantel int panAngle = map(currentJoystickX, -100, 100, 0, 180); int tiltAngle = map(slider2, 0, 255, 0, 180); panServo.write(panAngle); tiltServo.write(tiltAngle); Serial.println("Camera - Pan: " + String(panAngle) + "°, Tilt: " + String(tiltAngle) + "°"); }); // Gebruik digitale pinnen voor speciale functies webDigitalPinsPage.onPinWrite([](int pin, int state) { switch (pin) { case 2: // Koplampen digitalWrite(pin, state); Serial.println("Koplampen " + String(state ? "AAN" : "UIT")); break; case 3: // Claxon/buzzer if (state) { // Buzzer sequentie activeren digitalWrite(pin, HIGH); delay(200); digitalWrite(pin, LOW); } break; case 4: // Noodstop if (state) { analogWrite(MOTOR_LEFT_PWM, 0); analogWrite(MOTOR_RIGHT_PWM, 0); Serial.println("NOODSTOP GEACTIVEERD"); } break; } }); // Uitgebreide chatcommando's voor robotbesturing chatPage.onChatMessage([](constString& message) { String msg = message; msg.toLowerCase(); if (msg.indexOf("stop") >= 0) { analogWrite(MOTOR_LEFT_PWM, 0); analogWrite(MOTOR_RIGHT_PWM, 0); chatPage.sendToChat("Robot stopped!"); return; } if (msg.indexOf("center camera") >= 0) { panServo.write(90); tiltServo.write(90); chatPage.sendToChat("Camera centered!"); return; } if (msg.indexOf("speed") >= 0) { String response = "Current max speed: " + String(map(currentSlider1, 0, 255, 0, 100)) + "%"; chatPage.sendToChat(response); return; } // Standaardreactie voor onbekende commando's chatPage.sendToChat("Robot commands: stop, center camera, speed"); }); }
Dit uitgebreide voorbeeld vormt de basis voor vrijwel elk webgestuurd ESP32-project. Begin met deze template en pas hem aan uw specifieke behoeften aan!
U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!