DIYables ESP32 WebApps Library API Referentie - Complete Documentatie

Overzicht

De DIYables ESP32 WebApps Library biedt een uitgebreide modulaire oplossing voor het maken van WebSocket-gebaseerde webapplicaties op de ESP32. De bibliotheek bevat meerdere vooraf gebouwde webapplicaties en een flexibel framework voor het creëren van eigen toepassingen.

De bibliotheek gebruikt een modulaire architectuur, waarbij u alleen de webapplicaties toevoegt die u nodig heeft, wat geheugen spaart en de prestaties verbetert.

Kenmerken

  • Modulaire architectuur: Voeg alleen de webapps toe die u nodig heeft om het geheugenverbruik te optimaliseren
  • Geheugenefficiënt: Elke webapp kan onafhankelijk in- of uitgeschakeld worden
  • Meer dan 11 kant-en-klare webapplicaties: Volledige ESP32-besturing zonder webprogrammeervaardigheden
  • Framework voor eigen webapplicaties: Maak uw eigen applicaties met het basis klassensysteem
  • Realtime communicatie: WebSocket-gebaseerd voor directe updates
  • Responsief ontwerp: Werkt op desktop, tablet en mobiele apparaten
  • Eenvoudige integratie: Simpele callback-gebaseerde API
  • Ondersteuning voor meerdere apps: Meerdere webapps simultaan toevoegen mogelijk

Kernklassen

DIYablesWebAppServer

De hoofdserverklasse die webapplicaties, HTTP-verzoeken en WebSocket-communicatie beheert.

Constructor

DIYablesWebAppServer(int httpPort = 80, int websocketPort = 81)

Maakt een webapp-server instantie aan.

  • httpPort: Poort voor de HTTP-server (standaard: 80)
  • websocketPort: Poort voor de WebSocket-server (standaard: 81)

Methoden

Setup en Connectie
bool begin()

Initialiseert de netwerkverbinding (voor Ethernet of vooraf geconfigureerde verbindingen) en start de webserver.

  • Retourneert: true als succesvol, false bij mislukking
  • Gebruik: Voor toekomstige Ethernet-ondersteuning of wanneer WiFi-credentials vooraf ingesteld zijn
bool begin(const char* ssid, const char* password)

Initialiseert WiFi-verbinding en start de webserver.

  • ssid: WiFi-netwerknaam
  • password: WiFi-wachtwoord
  • Retourneert: true als succesvol, false bij mislukking
  • Gebruik: Standaard WiFi-verbinding met credentials
void loop()

Behandelt HTTP-verzoeken en WebSocket-communicatie. Moet aangeroepen worden in de hoofdloop.

bool isConnected()

Geeft true terug als WiFi verbonden is.

String getIPAddress()

Geeft het IP-adres van de Arduino als string terug.

Applicatiebeheer
void addApp(DIYablesWebAppPageBase* app)

Voegt een webapplicatie toe aan de server.

  • app: Pointer naar een webapplicatie-instantie
void removeApp(const String& path)

Verwijdert een webapplicatie via de URL-pad.

  • path: URL-pad van de applicatie (bijv. "/chat")
DIYablesWebAppPageBase* getApp(const String& path)

Haal een webapplicatie op via het URL-pad.

  • path: URL-pad van de applicatie
  • Retourneert: Pointer naar de app of nullptr als niet gevonden
void setNotFoundPage(const DIYablesNotFoundPage& page)

Stelt de 404 Not Found-pagina in (optioneel).

  • page: Instantie van de 404-pagina
Gespecialiseerde App Toegang
DIYablesWebDigitalPinsPage* getWebDigitalPinsPage()

Haalt de digitale pinnen pagina op als deze toegevoegd is.

  • Retourneert: Pointer naar de digitale pinnen pagina of nullptr
DIYablesWebSliderPage* getWebSliderPage()

Haalt de slider pagina op als deze toegevoegd is.

  • Retourneert: Pointer naar de slider pagina of nullptr
DIYablesWebJoystickPage* getWebJoystickPage()

Haalt de joystick pagina op als deze toegevoegd is.

  • Retourneert: Pointer naar de joystick pagina of nullptr

Basisklassen

DIYablesWebAppPageBase

Abstracte basisklasse waar alle webapplicaties van erven. Biedt algemene functionaliteit voor HTTP-verwerking, WebSocket-communicatie en paginabeheer.

Constructor

DIYablesWebAppPageBase(const String& pagePath)

Maakt een basispagina-instantie aan met het opgegeven URL-pad.

  • pagePath: URL-pad voor de pagina (bijv. "/web-joystick")

Virtuele Methoden (Moeten geïmplementeerd worden door afgeleide klassen)

virtual void handleHTTPRequest(IWebClient& client) = 0

Verwerkt HTTP-verzoeken voor deze pagina. Pure virtuele methode.

  • client: Web client interface voor versturen van response
virtual void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_t length) = 0

Verwerkt WebSocket-berichten voor deze pagina. Pure virtuele methode.

  • ws: WebSocket connectie interface
  • message: Ontvangen berichtinhoud
  • length: Lengte van het bericht
virtual const char* getPageInfo() const = 0

Geeft een identificatiestring van de pagina terug, gebruikt in verbindingsinfo-weergave. Pure virtuele methode.

  • Retourneert: Pagina-informatie string (bijv. "🕹️ Web Joystick: ")
virtual String getNavigationInfo() const = 0

Geeft HTML terug voor de navigatieknop op de homepagina. Pure virtuele methode.

  • Retourneert: HTML-string voor navigatiekaart

Virtuele Methoden (Optionele overrides)

virtual void onWebSocketConnection(IWebSocket& ws)

Wordt aangeroepen wanneer een nieuwe WebSocket-verbinding tot stand komt.

  • ws: Nieuwe WebSocket-verbinding
virtual void onWebSocketClose(IWebSocket& ws)

Wordt aangeroepen wanneer een WebSocket-verbinding wordt gesloten.

  • ws: Gesloten WebSocket-verbinding

Algemene Methoden

const char* getPagePath() const

Geeft het URL-pad terug voor deze pagina.

  • Retourneert: Padstring
bool isEnabled() const

Controleert of de pagina momenteel is ingeschakeld.

  • Retourneert: true als ingeschakeld, false als uitgeschakeld
void setEnabled(bool enable)

Schakelt de pagina in of uit.

  • enable: true om in te schakelen, false om uit te schakelen

Hulpmethoden

void sendHTTPHeader(IWebClient& client, const char* contentType = "text/html")

Verzendt standaard HTTP-headers naar de client.

  • client: Web client interface
  • contentType: MIME-type (standaard: "text/html")
void sendWebSocketMessage(IWebSocket& ws, const char* message)

Verzendt een bericht naar een specifieke WebSocket-client.

  • ws: Doel WebSocket-verbinding
  • message: Te verzenden bericht
void broadcastToAllClients(const char* message)

Zend een bericht uit naar alle verbonden WebSocket-clients.

  • message: Bericht om uit te zenden
void sendLargeHTML(IWebClient& client, const char* html)

Verzendt grote HTML-inhoud met chunked transfer encoding.

  • client: Web client interface
  • html: HTML-inhoud om te verzenden

Voorbeeld Gebruik

class CustomPage : public DIYablesWebAppPageBase { public: CustomPage() : DIYablesWebAppPageBase("/custom") {} void handleHTTPRequest(IWebClient& client) override { sendHTTPHeader(client); client.println("<html><body>Custom Page</body></html>"); } void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_t length) override { // Handle WebSocket messages sendWebSocketMessage(ws, "Response: " + String(message)); } const char* getPageInfo() const override { return " 🔧 Custom Page: "; } String getNavigationInfo() const override { return "<a href=\"/custom\" class=\"app-card custom\">" "<h3>🔧 Custom</h3><p>Custom functionality</p></a>"; } };

Webapplicatie Klassen

DIYablesHomePage

Centraal navigatiepunt met links naar alle ingeschakelde applicaties.

Constructor

DIYablesHomePage()

URL Pad

  • Pad: / (root)

DIYablesWebChatPage

Interactieve chatinterface voor tweerichtingscommunicatie met Arduino.

Constructor

DIYablesWebChatPage()

URL Pad

  • Pad: /webchat

Methoden

void onWebChatMessage(std::function<void(const String&)> callback)

Stelt callback in voor binnenkomende chatberichten.

void sendToWebChat(const String& message)

Verzendt een bericht naar de webchat-interface.

DIYablesWebMonitorPage

Webgebaseerde seriële monitor voor realtime output en commando-invoer.

Constructor

DIYablesWebMonitorPage()

URL Pad

  • Pad: /webmonitor

Methoden

void onWebMonitorMessage(std::function<void(const String&)> callback)

Stelt callback in voor binnenkomende monitorberichten.

void sendToWebMonitor(const String& message)

Verzendt een bericht naar de webmonitor-interface.

DIYablesWebDigitalPinsPage

Besturing en monitoring van digitale pinnen 0-13 via webinterface.

Constructor

DIYablesWebDigitalPinsPage()

URL Pad

  • Pad: /webdigitalpins

Methoden

void enablePin(int pin, int mode)

Schakelt een pin in voor webbesturing.

  • pin: Pinnummer (0-13)
  • mode: WEB_PIN_OUTPUT of WEB_PIN_INPUT
void onPinWrite(std::function<void(int, int)> callback)

Stelt callback in voor schrijfoperaties op pinnen (output pins).

void onPinRead(std::function<int(int)> callback)

Stelt callback in voor leesoperaties op pinnen (input pins).

void onPinModeChange(std::function<void(int, int)> callback)

Stelt callback in voor wijzigingen in pinmode.

void updatePinState(int pin, int state)

Update pinstatus realtime voor webclients.

DIYablesWebSliderPage

Dubbele slider besturing voor analoge/PWM toepassingen.

Constructor

DIYablesWebSliderPage()

URL Pad

  • Pad: /webslider

Methoden

void onSliderValueFromWeb(std::function<void(int, int)> callback)

Stelt callback in voor schuifwaarde veranderingen vanaf het web.

  • Parameters: slider1 (0-255), slider2 (0-255)
void onSliderValueToWeb(std::function<void()> callback)

Stelt callback in wanneer webclient huidige waarden opvraagt.

void sendToWebSlider(int slider1, int slider2)

Verzendt sliderwaarden naar de webinterface.

DIYablesWebJoystickPage

2D joystick besturing voor robotica en positioneringsprojecten.

Constructor

DIYablesWebJoystickPage(bool autoReturn = true, float sensitivity = 10.0)
  • autoReturn: Of de joystick automatisch teruggaat naar midden
  • sensitivity: Minimale beweging in procenten om updates te triggeren

URL Pad

  • Pad: /webjoystick

Methoden

void onJoystickValueFromWeb(std::function<void(int, int)> callback)

Stelt callback in voor joystickbeweging vanaf het web.

  • Parameters: x (-100 tot 100), y (-100 tot 100)
void onJoystickValueToWeb(std::function<void()> callback)

Stelt callback in wanneer webclient huidige positie opvraagt.

void sendToWebJoystick(int x, int y)

Verzendt joystickpositie naar webinterface.

void setAutoReturn(bool autoReturn)

Stelt in of joystick automatisch terugkeert.

void setSensitivity(float sensitivity)

Stelt bewegingsgevoeligheid in (percentage).

DIYablesWebPlotterPage

Realtime datavisualisatie met ondersteuning voor meerdere dataseries.

Constructor

DIYablesWebPlotterPage()

URL Pad

  • Pad: /webplotter

Methoden

void setPlotTitle(const String& title)

Stelt de titel van de plot in.

void setAxisLabels(const String& xLabel, const String& yLabel)

Stelt de assenlabels in.

void enableAutoScale(bool enable)

Schakelt automatische schaling van de Y-as aan of uit.

void setMaxSamples(int maxSamples)

Stelt maximaal aantal weer te geven datapunten in.

void addDataPoint(const String& seriesName, float x, float y)

Voegt een datapunt toe aan een serie.

void clearPlot()

Leegt alle data uit de plot.

DIYablesNotFoundPage

Optionale 404-foutpagina voor betere gebruikerservaring.

Constructor

DIYablesNotFoundPage()

Basis Voorbeeld Gebruik

#include <DIYablesWebApps.h> // WiFi credentials const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; // Creëer server en webapplicaties DIYablesWebAppServer webAppsServer(80, 81); DIYablesHomePage homePage; DIYablesWebChatPage chatPage; DIYablesWebMonitorPage monitorPage; void setup() { Serial.begin(9600); // Voeg alleen de applicaties toe die u nodig heeft webAppsServer.addApp(&homePage); webAppsServer.addApp(&chatPage); webAppsServer.addApp(&monitorPage); // Optioneel: 404 pagina toevoegen webAppsServer.setNotFoundPage(DIYablesNotFoundPage()); // Start server if (webAppsServer.begin(ssid, password)) { Serial.println("Server gestart"); Serial.print("IP: "); Serial.println(webAppsServer.getIPAddress()); } // Stel callbacks in chatPage.onWebChatMessage([](const String& message) { Serial.println("Chat: " + message); chatPage.sendToWebChat("Arduino ontving: " + message); }); } void loop() { webAppsServer.loop(); delay(10); }

Overzicht Webapplicaties

Home Pagina

  • URL: http://[esp32-ip]/
  • Doel: Centraal navigatiepunt
  • Kenmerken: Links naar alle ingeschakelde applicaties, verbindingsstatus

WebChat Applicatie

  • URL: http://[esp32-ip]/webchat
  • Doel: Tweerichtings communicatie-interface
  • Kenmerken: Realtime berichten, berichtgeschiedenis, WebSocket-status

Web Monitor

  • URL: http://[esp32-ip]/webmonitor
  • Doel: Vervanging seriële monitor
  • Kenmerken: Realtime seriële output, commando-invoer, dark theme

Web Digital Pins Control

  • URL: http://[esp32-ip]/webdigitalpins
  • Doel: Besturing digitale pinnen 0-13
  • Kenmerken: Individuele pinbediening, bulkoperaties, realtime status

Web Slider Control

  • URL: http://[esp32-ip]/webslider
  • Doel: Dubbele analoge/PWM-besturing
  • Kenmerken: Twee onafhankelijke sliders (0-255), preset waarden, realtime feedback

Web Joystick Control

  • URL: http://[esp32-ip]/webjoystick
  • Doel: 2D positiecontrole voor robots/voertuigen
  • Kenmerken: Touch/muisbesturing, coördinatenweergave, gevoeligheidsaanpassing

Web Plotter

  • URL: http://[esp32-ip]/webplotter
  • Doel: Realtime datavisualisatie
  • Kenmerken: Meerdere dataseries, autoscaling, configureerbare titels en assen

WebSocket Communicatie

Alle applicaties gebruiken WebSocket op poort 81 voor realtime communicatie:

  • WebSocket URL: ws://[esp32-ip]:81
  • Verbinding: Automatisch opnieuw verbinden bij verlies
  • Protocol: Tekstgebaseerd berichtenformaat

Berichtformaten

WebChat Berichten

  • Van Web: Direct tekstbericht
  • Naar Web: Direct tekstbericht

Web Monitor Berichten

  • Van Web: Direct tekstbericht
  • Naar Web: Direct tekstbericht

Web Digital Pin Berichten

  • Van Web: JSON formaat: {"pin": 13, "state": 1}
  • Naar Web: JSON formaat: {"pin": 13, "state": 1}

Web Slider Berichten

  • Van Web: JSON formaat: {"slider1": 128, "slider2": 255}
  • Naar Web: JSON formaat: {"slider1": 128, "slider2": 255}

Web Joystick Berichten

  • Van Web: JSON formaat: {"x": 50, "y": -25}
  • Naar Web: JSON formaat: {"x": 50, "y": -25}

Web Plotter Berichten

  • Van Web: Niet van toepassing (alleen display)
  • Naar Web: JSON formaat: {"series": "temp", "x": 10.5, "y": 23.4}

Foutafhandeling

De bibliotheek bevat automatische foutafhandeling voor:

  • WiFi-verbinding mislukt
  • WebSocket-verbinding verbroken
  • Ongeldige berichtformaten
  • Limiet op clientverbindingen

Geheugengebruik

Voordelen Modulaire Architectuur: Alleen de webapplicaties toevoegen die u nodig heeft, beperkt het geheugengebruik.

Geschat geheugengebruik per component:

  • DIYablesWebAppServer: ~8KB Flash, ~2KB RAM
  • DIYablesHomePage: ~3KB Flash, ~1KB RAM
  • DIYablesWebChatPage: ~6KB Flash, ~1.5KB RAM
  • DIYablesWebMonitorPage: ~5KB Flash, ~1.5KB RAM
  • DIYablesWebDigitalPinsPage: ~8KB Flash, ~2KB RAM
  • DIYablesWebSliderPage: ~6KB Flash, ~1.5KB RAM
  • DIYablesWebJoystickPage: ~7KB Flash, ~1.5KB RAM
  • DIYablesWebPlotterPage: ~10KB Flash, ~2KB RAM
  • WebSocket Buffer: ~1KB RAM per verbinding

Totaal als alle apps ingeschakeld zijn: ~53KB Flash, ~12KB RAM

Minimale setup (server + home + 1 app): ~17KB Flash, ~4.5KB RAM

Browsercompatibiliteit

Ondersteunde browsers:

  • Chrome 50+
  • Firefox 45+
  • Safari 10+
  • Edge 79+
  • Mobiele browsers (iOS Safari, Chrome Mobile)

Beveiligingsnotities

  • Geen authenticatie geïmplementeerd (alleen geschikt voor lokale netwerken)
  • Gebruik alleen in vertrouwde netwerken
  • Overweeg authenticatie toe te voegen voor publieke implementaties

Problemen en Oplossingen

Veelvoorkomende problemen

  1. Kan niet verbinden met WiFi

- Controleer SSID en wachtwoord

- Verifieer dat netwerk 2.4GHz is (geen 5GHz)

- Controleer signaalsterkte

  1. WebSocket verbinding mislukt

- Controleer of IP-adres correct is

- Controleer firewall-instellingen

- Probeer een andere browser

  1. Hoog geheugengebruik

- Schakel ongebruikte applicaties uit

- Beperk aantal gelijktijdige verbindingen

- Herstart ESP32 bij geheugenfragmentatie

  1. Trage respons

- Controleer WiFi signaalsterkte

- Verlaag frequentie van WebSocket-berichten

- Gebruik kortere callbackfuncties

Voorbeeldprojecten

Voorbeeldapplicaties

De DIYables ESP32 WebApps Library bevat uitgebreide voorbeelden gericht op het ESP32 educatieve platform:

Beschikbare voorbeelden

  • Chat Voorbeeld: Tweezijdige communicatie-interface
  • WebMonitor Voorbeeld: Vervanging seriële monitor met extra functies
  • WebDigitalPins Voorbeeld: Bestur alle digitale pinnen met visuele feedback
  • WebSlider Voorbeeld: Dubbele analoge/PWM besturing met presets
  • WebJoystick Voorbeeld: 2D positiecontrole voor robotica projecten
  • MultipleWebApps Voorbeeld: Alle applicaties tegelijkertijd actief

Zie de map examples/ voor complete projecten en de map docs/ voor gedetailleerde installatie-instructies.

Platform Abstractie Interfaces

De DIYables ESP32 WebApps Library gebruikt een platformabstractielaag met interfaces die ondersteuning bieden voor meerdere hardwareplatforms. Deze interfaces scheiden de kern WebApp-functionaliteit van platformspecifieke implementaties.

Kerninterfaces

IWebClient

Interface voor HTTP client verbindingen.

class IWebClient { public: virtual ~IWebClient() = default; // Stream interface methoden virtual int available() = 0; virtual int read() = 0; virtual int peek() = 0; virtual size_t write(uint8_t data) = 0; virtual size_t write(const uint8_t* buffer, size_t size) = 0; virtual void flush() = 0; // Verbindingsbeheer virtual bool connected() = 0; virtual void stop() = 0; // Gemaksmethoden virtual void print(const String& str) = 0; virtual void println(const String& str) = 0; };

IWebSocket

Interface voor WebSocket-verbindingen met bidirectionele communicatieondersteuning.

class IWebSocket { public: enum DataType { TEXT = 1, BINARY = 2 }; enum CloseCode { NORMAL_CLOSURE = 1000, GOING_AWAY = 1001, PROTOCOL_ERROR = 1002, UNSUPPORTED_DATA = 1003, POLICY_VIOLATION = 1008, MESSAGE_TOO_BIG = 1009, INTERNAL_ERROR = 1011 }; virtual ~IWebSocket() = default; // Berichtafhandeling virtual void sendText(const char* message) = 0; virtual void sendBinary(const uint8_t* data, size_t length) = 0; virtual bool isConnected() const = 0; virtual void close(CloseCode code = NORMAL_CLOSURE, const char* reason = nullptr) = 0; // Event callbacks virtual void onMessage(std::function<void(IWebSocket*, DataType, const char*, uint16_t)> callback) = 0; virtual void onClose(std::function<void(IWebSocket*, CloseCode, const char*, uint16_t)> callback) = 0; };

IWebServer

Interface voor HTTP server functionaliteit.

class IWebServer { public: virtual ~IWebServer() = default; // Server lifecycle virtual bool begin() = 0; virtual void stop() = 0; virtual IWebClient* available() = 0; // Configuratie virtual void setPort(uint16_t port) = 0; virtual uint16_t getPort() const = 0; };

IWebSocketServer

Interface voor WebSocket-server met verbindingsbeheer.

class IWebSocketServer { public: using ConnectionCallback = std::function<void(IWebSocket*)>; using MessageCallback = std::function<void(IWebSocket*, IWebSocket::DataType, const char*, uint16_t)>; virtual ~IWebSocketServer() = default; // Server lifecycle virtual bool begin() = 0; virtual void stop() = 0; virtual void listen() = 0; // Event-afhandeling virtual void onConnection(ConnectionCallback callback) = 0; virtual void onMessage(MessageCallback callback) = 0; // Broadcast virtual void broadcastText(const char* message) = 0; virtual void broadcastBinary(const uint8_t* data, size_t length) = 0; // Configuratie virtual void setPort(uint16_t port) = 0; virtual uint16_t getPort() const = 0; };

INetworkProvider

Interface voor netwerkconnectiviteitbeheer.

class INetworkProvider { public: virtual ~INetworkProvider() = default; // Netwerk lifecycle virtual bool begin(const char* ssid, const char* password) = 0; virtual void end() = 0; virtual bool isConnected() = 0; // Netwerkinformatie virtual String getLocalIP() = 0; virtual String getSSID() = 0; virtual int32_t getRSSI() = 0; };

IServerFactory

Factory interface voor aanmaken van platformspecifieke implementaties.

class IServerFactory { public: virtual ~IServerFactory() = default; // Factory methoden virtual INetworkProvider* createNetworkProvider() = 0; virtual IWebServer* createWebServer(uint16_t port) = 0; virtual IWebSocketServer* createWebSocketServer(uint16_t port) = 0; // Platforminformatie virtual String getPlatformName() const = 0; };

Platform Implementatie Voorbeeld

Voor de ESP32 zijn de interfaces geïmplementeerd met de DIYables_ESP32_WebServer bibliotheek:

class ESP32ServerFactory : public IServerFactory { public: INetworkProvider* createNetworkProvider() override { return new ESP32NetworkProvider(); } IWebServer* createWebServer(uint16_t port) override { return new ESP32WebServer(port); } IWebSocketServer* createWebSocketServer(uint16_t port) override { return new ESP32WebSocketServer(port); } String getPlatformName() const override { return "ESP32"; } };

Nieuwe Platformondersteuning Toevoegen

Om ondersteuning voor een nieuw platform toe te voegen (bijv. ESP32):

  1. Implementeer alle interfaces voor het doelsysteem
  2. Maak een ServerFactory die uw implementaties instanties maakt
  3. Beheer platformspecifieke netwerken en WebSocket-protocollen
  4. Test met bestaande WebApp klassen (wijzigingen niet nodig)

Voorbeeldgebruik met verschillende platforms:

ESP32ServerFactory factory; DIYablesWebAppServer server(factory, 80, 81); // ESP32 (hypothetisch) ESP32ServerFactory esp32Factory; DIYablesWebAppServer esp32Server(esp32Factory, 80, 81);

Voordelen van Interface Ontwerp

  • Platformonafhankelijkheid: Kern WebApp-logica werkt op elk platform
  • Uitbreidbaarheid: Gemakkelijk nieuwe hardware ondersteuning toevoegen
  • Onderhoudbaarheid: Platforms specifieke code is geïsoleerd
  • Testbaarheid: Interfaces kunnen gemockt worden voor unittests
  • Consistentie: Zelfde API op alle ondersteunde platforms

Huidige Platformondersteuning

  • ESP32: Volledig geïmplementeerd en getest
  • 🔄 ESP32: Beschikbaar als aparte uitbreiding - DIYables_WebApps_ESP32
  • 🚀 Toekomstige Platforms: Kunnen toegevoegd worden met hetzelfde interfaceschema

Dit is de volledige vertaling volgens richtlijnen met behoud van technische specificaties, consistente terminologie, en een behulpzame, professionele Nederlandse stijl.

※ ONZE BERICHTEN

  • 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!