Created
September 24, 2022 11:02
-
-
Save sarasantos/00208ce745b24f9ebb54edacaf2e28d1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/********* | |
Rui Santos | |
Complete instructions at https://RandomNerdTutorials.com/build-web-servers-ebook/ | |
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. | |
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | |
*********/ | |
#include <Arduino.h> | |
#include <WiFi.h> | |
#include <AsyncTCP.h> | |
#include <ESPAsyncWebServer.h> | |
#include "SPIFFS.h" | |
// Replace with your network credentials | |
const char* ssid = "REPLACE_WITH_YOUR_SSID"; | |
const char* password = "REPLACE_WITH_YOUR_SSID"; | |
// Create AsyncWebServer object on port 80 | |
AsyncWebServer server(80); | |
// Create a WebSocket object | |
AsyncWebSocket ws("/ws"); | |
// Set LED GPIO | |
const int ledPin = 2; | |
// setting PWM properties | |
const int freq = 5000; | |
const int ledChannel = 0; | |
const int resolution = 8; | |
String sliderValue = "0"; | |
int dutyCycle; | |
// Initialize SPIFFS | |
void initSPIFFS() { | |
if (!SPIFFS.begin(true)) { | |
Serial.println("An error has occurred while mounting SPIFFS"); | |
} | |
Serial.println("SPIFFS mounted successfully"); | |
} | |
// Initialize WiFi | |
void initWiFi() { | |
WiFi.mode(WIFI_STA); | |
WiFi.begin(ssid, password); | |
Serial.print("Connecting to WiFi .."); | |
while (WiFi.status() != WL_CONNECTED) { | |
Serial.print('.'); | |
delay(1000); | |
} | |
Serial.println(WiFi.localIP()); | |
} | |
void notifyClients(String sliderValue) { | |
ws.textAll(sliderValue); | |
} | |
void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) { | |
AwsFrameInfo *info = (AwsFrameInfo*)arg; | |
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) { | |
data[len] = 0; | |
sliderValue = (char*)data; | |
dutyCycle = map(sliderValue.toInt(), 0, 100, 0, 255); | |
Serial.println(dutyCycle); | |
notifyClients(sliderValue); | |
} | |
} | |
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, | |
void *arg, uint8_t *data, size_t len) { | |
switch (type) { | |
case WS_EVT_CONNECT: | |
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str()); | |
break; | |
case WS_EVT_DISCONNECT: | |
Serial.printf("WebSocket client #%u disconnected\n", client->id()); | |
break; | |
case WS_EVT_DATA: | |
handleWebSocketMessage(arg, data, len); | |
break; | |
case WS_EVT_PONG: | |
case WS_EVT_ERROR: | |
break; | |
} | |
} | |
void initWebSocket() { | |
ws.onEvent(onEvent); | |
server.addHandler(&ws); | |
} | |
void setup() { | |
Serial.begin(115200); | |
pinMode(ledPin, OUTPUT); | |
initSPIFFS(); | |
initWiFi(); | |
// configure LED PWM functionalitites | |
ledcSetup(ledChannel, freq, resolution); | |
// attach the channel to the GPIO to be controlled | |
ledcAttachPin(ledPin, ledChannel); | |
initWebSocket(); | |
// Web Server Root URL | |
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { | |
request->send(SPIFFS, "/index.html", "text/html"); | |
}); | |
server.serveStatic("/", SPIFFS, "/"); | |
server.on("/currentValue", HTTP_GET, [](AsyncWebServerRequest *request) { | |
request->send(200, "/text/plain", String(sliderValue).c_str()); | |
}); | |
// Start server | |
server.begin(); | |
} | |
void loop() { | |
ledcWrite(ledChannel, dutyCycle); | |
ws.cleanupClients(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment