#include #include #include #include #include #include #include "FS.h" const char *deviceName = "esp8266-dcmotor.com"; const char *ap_ssid = "ESP8266-DC-Motor"; const char *ap_password = ""; ESP8266WebServer server(80); WebSocketsServer ws = WebSocketsServer(8080); static double f = 0; void ws_handle(uint8_t client, WStype_t type, uint8_t * payload, size_t length) { static char buffer[32]; switch(type) { case WStype_CONNECTED: sprintf(buffer, "%.2f", f); ws.sendTXT(client, buffer); break; case WStype_TEXT: { f = atof((const char *)payload); analogWrite(5, (int)(f * PWMRANGE)); break; } } } const char* wifi_ssid; const char* wifi_psk; bool loadConfig() { File configFile = SPIFFS.open("/config.json", "r"); if (!configFile) { Serial.println("Failed to open config file"); return false; } size_t size = configFile.size(); if (size > 1024) { Serial.println("Config file size is too large"); return false; } std::unique_ptr buf(new char[size]); configFile.readBytes(buf.get(), size); StaticJsonDocument<1024> doc; DeserializationError error = deserializeJson(doc, buf.get()); if (error) { Serial.print("Failed to parse config file. Error: "); Serial.println(error.c_str()); return false; } wifi_ssid = doc["ssid"]; wifi_psk = doc["psk"]; return true; } void ap_start() { Serial.println("Configuring access point..."); WiFi.softAP(ap_ssid, ap_password); IPAddress ip = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(ip); digitalWrite(LED_BUILTIN, 0); } void connectToWifi() { Serial.println("Connecting to "); Serial.print("wifi_ssid: "); Serial.println(wifi_ssid); Serial.print("wifi_psk: "); Serial.println(wifi_psk); // WiFi.persistent(false); // WiFi.mode(WIFI_OFF); // this is a temporary line, to be removed after SDK update to 1.5.4 // WiFi.mode(WIFI_STA); // WiFi.disconnect(); // delay(1000); // if (WiFi.status() != WL_CONNECTED) { WiFi.begin(wifi_ssid, wifi_psk); // } //Static IP address configuration // IPAddress staticIP(192, 168, 43, 90); //ESP static ip // IPAddress gateway(192, 168, 43, 1); //IP Address of your WiFi Router (Gateway) // IPAddress subnet(255, 255, 255, 0); //Subnet mask // IPAddress dns(8, 8, 8, 8); //DNS // WiFi.hostname(deviceName); // WiFi.config(staticIP, subnet, gateway, dns); int i = 60; while (WiFi.status() != WL_CONNECTED) { delay(1000); i--; if (i <= 0) break; Serial.print("."); digitalWrite(LED_BUILTIN, i % 2 == 0); } Serial.println(); digitalWrite(LED_BUILTIN, 1); } void startHttpServer() { server.on("/", HTTP_GET, []() { server.send(200, "text/html", "" "" "" "" ""); }); server.on("/info", HTTP_GET, []() { server.send(200, "application/json", "{ \"name\": \"DC Motor\", \"websocket_port\": 8080 }"); }); server.on("/config/raw", HTTP_GET, []() { server.send(200, "application/json", "{}"); }); server.on("/config", HTTP_GET, []() { server.send(200, "text/html", "" "" "
" "
" "
" "" "
" ""); }); server.on("/config", HTTP_POST, []() { if (server.hasArg("ssid")) { wifi_ssid = server.arg("ssid").c_str(); } if (server.hasArg("psk")) { wifi_psk = server.arg("psk").c_str(); } Serial.println("Saving configuration: "); Serial.print("ssid: "); Serial.println(wifi_ssid); Serial.print("psk: "); Serial.println(wifi_psk); // saveConfig StaticJsonDocument<1024> doc; doc["ssid"] = wifi_ssid; doc["psk"] = wifi_psk; File configFile = SPIFFS.open("/config.json", "w"); if (configFile) { serializeJson(doc, configFile); server.send(200); } else { Serial.println("Failed to open config file for writing"); server.send(500); } }); server.begin(); Serial.println("HTTP server started"); } void setup() { pinMode(5, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, 1); Serial.begin(115200); Serial.println(); Serial.println("DC Motor " __DATE__ " " __TIME__); delay(1000); Serial.println("Mounting FS..."); if (!SPIFFS.begin()) { Serial.println("Failed to mount file system"); return; } if (!loadConfig()) { Serial.println("Failed to load config"); ap_start(); } else { Serial.println("Config loaded"); connectToWifi(); if (WiFi.status() == WL_CONNECTED) { Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } else { Serial.println("WiFi connection failed"); ap_start(); } } // start webSocket server ws.begin(); ws.onEvent(ws_handle); //if (MDNS.begin("esp8266")) { // Serial.println("MDNS responder started"); //} startHttpServer(); // Add service to MDNS //MDNS.addService("http", "tcp", 80); //MDNS.addService("ws", "tcp", 8080); } void loop() { ws.loop(); server.handleClient(); }