From 8106d576be61b577edcb0f35b67bd1d8b308bc7d Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 25 Sep 2023 21:36:37 -0500 Subject: [PATCH 1/9] Add option to set up for wifi or ap on compile. --- vulpes/src/main.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/vulpes/src/main.cpp b/vulpes/src/main.cpp index 6f49a1d..294dbf1 100644 --- a/vulpes/src/main.cpp +++ b/vulpes/src/main.cpp @@ -34,9 +34,19 @@ const int blinker = LED_BUILTIN; RTC_DS3231 rtc; // set up RTC const int alarmPin = 4; // pin to monitor for RTC alarms +// Network options: "wifi" for existing netowrk, "ap" to be an access point +const char* network = "ap"; +// Connect to existing network // Read from config.h const char* ssid = WIFI_SSID; const char* password = WIFI_PASSWORD; +// Create a new access point +// Replace with your network credentials +const char* ssid_ap = "vulpes001"; +const char* password_ap = NULL; //"123456789"; +IPAddress local_ip(192,168,0,1); +IPAddress gateway(192,168,0,1); +IPAddress subnet(255,255,255,0); const char* PARAM_SEND = "inputSend"; const char* PARAM_WPM = "inputWPM"; @@ -347,15 +357,25 @@ void setup() { sender_key.setMessage(String("mo5 ")); } - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); - if (WiFi.waitForConnectResult() != WL_CONNECTED) { - Serial.println("WiFi Failed!"); - return; + WiFi.setHostname("vulpes"); + if (network == "wifi"){ + // Attach to existing wifi + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.println("WiFi Failed!"); + return; + } + Serial.println(); + Serial.print("IP Address: "); + Serial.println(WiFi.localIP()); + } else if (network == "ap"){ + // Act as new access point + WiFi.softAPConfig(local_ip, gateway, subnet); + WiFi.softAP(ssid_ap, password_ap); } - Serial.println(); - Serial.print("IP Address: "); - Serial.println(WiFi.localIP()); + + // Send web page with input fields to client server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ -- 2.30.2 From 7fc43238cdb44d0b6e7c93fec20adb2f9a9d5b9c Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 25 Sep 2023 21:47:48 -0500 Subject: [PATCH 2/9] Simplify SSID. --- vulpes/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vulpes/src/main.cpp b/vulpes/src/main.cpp index 294dbf1..dccfb67 100644 --- a/vulpes/src/main.cpp +++ b/vulpes/src/main.cpp @@ -41,9 +41,9 @@ const char* network = "ap"; const char* ssid = WIFI_SSID; const char* password = WIFI_PASSWORD; // Create a new access point -// Replace with your network credentials -const char* ssid_ap = "vulpes001"; -const char* password_ap = NULL; //"123456789"; +// Replace with your desired network credentials +const char* ssid_ap = "vulpes"; +const char* password_ap = NULL; //"123456789"; //NULL is empty IPAddress local_ip(192,168,0,1); IPAddress gateway(192,168,0,1); IPAddress subnet(255,255,255,0); -- 2.30.2 From 5e3503b497ddfb2323f88e93031c30e1f38efeb4 Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 25 Sep 2023 21:53:20 -0500 Subject: [PATCH 3/9] Use integer network setting to avoid string comparison. --- vulpes/src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vulpes/src/main.cpp b/vulpes/src/main.cpp index dccfb67..2a36174 100644 --- a/vulpes/src/main.cpp +++ b/vulpes/src/main.cpp @@ -34,8 +34,8 @@ const int blinker = LED_BUILTIN; RTC_DS3231 rtc; // set up RTC const int alarmPin = 4; // pin to monitor for RTC alarms -// Network options: "wifi" for existing netowrk, "ap" to be an access point -const char* network = "ap"; +// Network options: "0" for existing netowrk, "1" to be an access point +const int network = 1; // Connect to existing network // Read from config.h const char* ssid = WIFI_SSID; @@ -358,7 +358,7 @@ void setup() { } WiFi.setHostname("vulpes"); - if (network == "wifi"){ + if (network == 0){ // Attach to existing wifi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); @@ -369,7 +369,7 @@ void setup() { Serial.println(); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); - } else if (network == "ap"){ + } else if (network == 1){ // Act as new access point WiFi.softAPConfig(local_ip, gateway, subnet); WiFi.softAP(ssid_ap, password_ap); -- 2.30.2 From 4e797b92817bd966f091860bcb7ce17378ca8e8b Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 25 Sep 2023 22:02:03 -0500 Subject: [PATCH 4/9] Move folder. --- vulpes/.gitignore => .gitignore | 0 esp32-webserver-form/esp32-webserver-form.ino | 183 ------------------ .../esp32-webserver-prefs.ino | 169 ---------------- esp32-webserver/esp32-webserver.ino | 157 --------------- {vulpes/include => include}/README | 0 {vulpes/lib => lib}/README | 0 vulpes/platformio.ini => platformio.ini | 0 {vulpes/src => src}/config.h.default | 0 {vulpes/src => src}/main.cpp | 0 {vulpes/src => src}/morse.cpp | 0 {vulpes/src => src}/morse.h | 0 test.html | 39 ++++ {vulpes/test => test}/README | 0 vulpes/.vscode/extensions.json | 10 - 14 files changed, 39 insertions(+), 519 deletions(-) rename vulpes/.gitignore => .gitignore (100%) delete mode 100644 esp32-webserver-form/esp32-webserver-form.ino delete mode 100644 esp32-webserver-prefs/esp32-webserver-prefs.ino delete mode 100644 esp32-webserver/esp32-webserver.ino rename {vulpes/include => include}/README (100%) rename {vulpes/lib => lib}/README (100%) rename vulpes/platformio.ini => platformio.ini (100%) rename {vulpes/src => src}/config.h.default (100%) rename {vulpes/src => src}/main.cpp (100%) rename {vulpes/src => src}/morse.cpp (100%) rename {vulpes/src => src}/morse.h (100%) create mode 100644 test.html rename {vulpes/test => test}/README (100%) delete mode 100644 vulpes/.vscode/extensions.json diff --git a/vulpes/.gitignore b/.gitignore similarity index 100% rename from vulpes/.gitignore rename to .gitignore diff --git a/esp32-webserver-form/esp32-webserver-form.ino b/esp32-webserver-form/esp32-webserver-form.ino deleted file mode 100644 index b5bbce4..0000000 --- a/esp32-webserver-form/esp32-webserver-form.ino +++ /dev/null @@ -1,183 +0,0 @@ -/********* - Rui Santos - Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-input-data-html-form/ - - 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 wifi password -#include "config.h" -#include -#include -#include -#include -#include - -// download zip from https://github.com/me-no-dev/ESPAsyncWebServer and install. -#include - -AsyncWebServer server(80); - -// Read from config.h -const char* ssid = WIFI_SSID; -const char* password = WIFI_PASSWORD; - -const char* PARAM_STRING = "inputString"; -const char* PARAM_INT = "inputInt"; -const char* PARAM_FLOAT = "inputFloat"; - -// HTML web page to handle 3 input fields (inputString, inputInt, inputFloat) -const char index_html[] PROGMEM = R"rawliteral( - - ESP Input Form - - - -
- inputString (current value %inputString%): -
- - inputInt (current value %inputInt%): -
- - inputFloat (current value %inputFloat%): - -
- -)rawliteral"; - -void notFound(AsyncWebServerRequest *request) { - request->send(404, "text/plain", "Not found"); -} - -String readFile(fs::FS &fs, const char * path){ - Serial.printf("Reading file: %s\r\n", path); - File file = fs.open(path, "r"); - if(!file || file.isDirectory()){ - Serial.println("- empty file or failed to open file"); - return String(); - } - Serial.println("- read from file:"); - String fileContent; - while(file.available()){ - fileContent+=String((char)file.read()); - } - file.close(); - Serial.println(fileContent); - return fileContent; -} - -void writeFile(fs::FS &fs, const char * path, const char * message){ - Serial.printf("Writing file: %s\r\n", path); - File file = fs.open(path, "w"); - if(!file){ - Serial.println("- failed to open file for writing"); - return; - } - if(file.print(message)){ - Serial.println("- file written"); - } else { - Serial.println("- write failed"); - } - file.close(); -} - -// Replaces placeholder with stored values -String processor(const String& var){ - //Serial.println(var); - if(var == "inputString"){ - return readFile(SPIFFS, "/inputString.txt"); - } - else if(var == "inputInt"){ - return readFile(SPIFFS, "/inputInt.txt"); - } - else if(var == "inputFloat"){ - return readFile(SPIFFS, "/inputFloat.txt"); - } - return String(); -} - -void setup() { - Serial.begin(115200); - // Initialize SPIFFS - #ifdef ESP32 - if(!SPIFFS.begin(true)){ - Serial.println("An Error has occurred while mounting SPIFFS"); - return; - } - #else - if(!SPIFFS.begin()){ - Serial.println("An Error has occurred while mounting SPIFFS"); - return; - } - #endif - - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); - if (WiFi.waitForConnectResult() != WL_CONNECTED) { - Serial.println("WiFi Failed!"); - return; - } - Serial.println(); - Serial.print("IP Address: "); - Serial.println(WiFi.localIP()); - - // Send web page with input fields to client - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ - request->send_P(200, "text/html", index_html, processor); - }); - - // Send a GET request to /get?inputString= - server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) { - String inputMessage; - // GET inputString value on /get?inputString= - if (request->hasParam(PARAM_STRING)) { - inputMessage = request->getParam(PARAM_STRING)->value(); - writeFile(SPIFFS, "/inputString.txt", inputMessage.c_str()); - } - // GET inputInt value on /get?inputInt= - else if (request->hasParam(PARAM_INT)) { - inputMessage = request->getParam(PARAM_INT)->value(); - writeFile(SPIFFS, "/inputInt.txt", inputMessage.c_str()); - } - // GET inputFloat value on /get?inputFloat= - else if (request->hasParam(PARAM_FLOAT)) { - inputMessage = request->getParam(PARAM_FLOAT)->value(); - writeFile(SPIFFS, "/inputFloat.txt", inputMessage.c_str()); - } - else { - inputMessage = "No message sent"; - } - Serial.println(inputMessage); - request->send(200, "text/text", inputMessage); - }); - server.onNotFound(notFound); - server.begin(); -} - -void loop() { - // To access your stored values on inputString, inputInt, inputFloat - String yourInputString = readFile(SPIFFS, "/inputString.txt"); - Serial.print("*** Your inputString: "); - Serial.println(yourInputString); - - int yourInputInt = readFile(SPIFFS, "/inputInt.txt").toInt(); - Serial.print("*** Your inputInt: "); - Serial.println(yourInputInt); - - float yourInputFloat = readFile(SPIFFS, "/inputFloat.txt").toFloat(); - Serial.print("*** Your inputFloat: "); - Serial.println(yourInputFloat); - delay(5000); -} diff --git a/esp32-webserver-prefs/esp32-webserver-prefs.ino b/esp32-webserver-prefs/esp32-webserver-prefs.ino deleted file mode 100644 index 043efe8..0000000 --- a/esp32-webserver-prefs/esp32-webserver-prefs.ino +++ /dev/null @@ -1,169 +0,0 @@ -/********* - Rui Santos - Complete project details at https://randomnerdtutorials.com -*********/ -// include wifi password -#include "config.h" -// Load Wi-Fi library -#include -// Load Preferences library -#include -// Define preferences instance -Preferences prefs; -// Open up preferences with defined namespace -prefs.begin("vulpes", false); - -// Replace with your network credentials -const char* ssid = WIFI_SSID; -const char* password = WIFI_PASSWORD; - -// Set web server port number to 80 -WiFiServer server(80); - -// Variable to store the HTTP request -String header; - -// Auxiliar variables to store the current output state -String output26State = "off"; -String output27State = "off"; - -// Assign output variables to GPIO pins -const int output26 = 26; -const int output27 = 27; - -// Current time -unsigned long currentTime = millis(); -// Previous time -unsigned long previousTime = 0; -// Define timeout time in milliseconds (example: 2000ms = 2s) -const long timeoutTime = 2000; - -void setup() { - Serial.begin(115200); - // Initialize the output variables as outputs - pinMode(output26, OUTPUT); - pinMode(output27, OUTPUT); - // Set outputs to LOW - digitalWrite(output26, LOW); - digitalWrite(output27, LOW); - - preferences.putString("ssid", ssid); - preferences.putString("password", password); - - Serial.println("Network Credentials Saved using Preferences"); - - preferences.end(); - - // Connect to Wi-Fi network with SSID and password - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - // Print local IP address and start web server - Serial.println(""); - Serial.println("WiFi connected."); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - server.begin(); -} - -void loop(){ - WiFiClient client = server.available(); // Listen for incoming clients - - if (client) { // If a new client connects, - currentTime = millis(); - previousTime = currentTime; - Serial.println("New Client."); // print a message out in the serial port - String currentLine = ""; // make a String to hold incoming data from the client - while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected - currentTime = millis(); - if (client.available()) { // if there's bytes to read from the client, - char c = client.read(); // read a byte, then - Serial.write(c); // print it out the serial monitor - header += c; - if (c == '\n') { // if the byte is a newline character - // if the current line is blank, you got two newline characters in a row. - // that's the end of the client HTTP request, so send a response: - if (currentLine.length() == 0) { - // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) - // and a content-type so the client knows what's coming, then a blank line: - client.println("HTTP/1.1 200 OK"); - client.println("Content-type:text/html"); - client.println("Connection: close"); - client.println(); - - // turns the GPIOs on and off - if (header.indexOf("GET /26/on") >= 0) { - Serial.println("GPIO 26 on"); - output26State = "on"; - digitalWrite(output26, HIGH); - } else if (header.indexOf("GET /26/off") >= 0) { - Serial.println("GPIO 26 off"); - output26State = "off"; - digitalWrite(output26, LOW); - } else if (header.indexOf("GET /27/on") >= 0) { - Serial.println("GPIO 27 on"); - output27State = "on"; - digitalWrite(output27, HIGH); - } else if (header.indexOf("GET /27/off") >= 0) { - Serial.println("GPIO 27 off"); - output27State = "off"; - digitalWrite(output27, LOW); - } - - // Display the HTML web page - client.println(""); - client.println(""); - client.println(""); - // CSS to style the on/off buttons - // Feel free to change the background-color and font-size attributes to fit your preferences - client.println(""); - - // Web Page Heading - client.println("

ESP32 Web Server

"); - - // Display current state, and ON/OFF buttons for GPIO 26 - client.println("

GPIO 26 - State " + output26State + "

"); - // If the output26State is off, it displays the ON button - if (output26State=="off") { - client.println("

"); - } else { - client.println("

"); - } - - // Display current state, and ON/OFF buttons for GPIO 27 - client.println("

GPIO 27 - State " + output27State + "

"); - // If the output27State is off, it displays the ON button - if (output27State=="off") { - client.println("

"); - } else { - client.println("

"); - } - client.println(""); - - // The HTTP response ends with another blank line - client.println(); - // Break out of the while loop - break; - } else { // if you got a newline, then clear currentLine - currentLine = ""; - } - } else if (c != '\r') { // if you got anything else but a carriage return character, - currentLine += c; // add it to the end of the currentLine - } - } - } - // Clear the header variable - header = ""; - // Close the connection - client.stop(); - Serial.println("Client disconnected."); - Serial.println(""); - } -} diff --git a/esp32-webserver/esp32-webserver.ino b/esp32-webserver/esp32-webserver.ino deleted file mode 100644 index 6815ed3..0000000 --- a/esp32-webserver/esp32-webserver.ino +++ /dev/null @@ -1,157 +0,0 @@ -/********* - Rui Santos - Complete project details at https://randomnerdtutorials.com -*********/ - -// include wifi password -#include "config.h" -// Load Wi-Fi library -#include - -// Replace with your network credentials -const char* ssid = WIFI_SSID; -const char* password = WIFI_PASSWORD; - -// Set web server port number to 80 -WiFiServer server(80); - -// Variable to store the HTTP request -String header; - -// Auxiliar variables to store the current output state -String output26State = "off"; -String output27State = "off"; - -// Assign output variables to GPIO pins -const int output26 = 26; -const int output27 = 27; - -// Current time -unsigned long currentTime = millis(); -// Previous time -unsigned long previousTime = 0; -// Define timeout time in milliseconds (example: 2000ms = 2s) -const long timeoutTime = 2000; - -void setup() { - Serial.begin(115200); - // Initialize the output variables as outputs - pinMode(output26, OUTPUT); - pinMode(output27, OUTPUT); - // Set outputs to LOW - digitalWrite(output26, LOW); - digitalWrite(output27, LOW); - - // Connect to Wi-Fi network with SSID and password - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - // Print local IP address and start web server - Serial.println(""); - Serial.println("WiFi connected."); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - server.begin(); -} - -void loop(){ - WiFiClient client = server.available(); // Listen for incoming clients - - if (client) { // If a new client connects, - currentTime = millis(); - previousTime = currentTime; - Serial.println("New Client."); // print a message out in the serial port - String currentLine = ""; // make a String to hold incoming data from the client - while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected - currentTime = millis(); - if (client.available()) { // if there's bytes to read from the client, - char c = client.read(); // read a byte, then - Serial.write(c); // print it out the serial monitor - header += c; - if (c == '\n') { // if the byte is a newline character - // if the current line is blank, you got two newline characters in a row. - // that's the end of the client HTTP request, so send a response: - if (currentLine.length() == 0) { - // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) - // and a content-type so the client knows what's coming, then a blank line: - client.println("HTTP/1.1 200 OK"); - client.println("Content-type:text/html"); - client.println("Connection: close"); - client.println(); - - // turns the GPIOs on and off - if (header.indexOf("GET /26/on") >= 0) { - Serial.println("GPIO 26 on"); - output26State = "on"; - digitalWrite(output26, HIGH); - } else if (header.indexOf("GET /26/off") >= 0) { - Serial.println("GPIO 26 off"); - output26State = "off"; - digitalWrite(output26, LOW); - } else if (header.indexOf("GET /27/on") >= 0) { - Serial.println("GPIO 27 on"); - output27State = "on"; - digitalWrite(output27, HIGH); - } else if (header.indexOf("GET /27/off") >= 0) { - Serial.println("GPIO 27 off"); - output27State = "off"; - digitalWrite(output27, LOW); - } - - // Display the HTML web page - client.println(""); - client.println(""); - client.println(""); - // CSS to style the on/off buttons - // Feel free to change the background-color and font-size attributes to fit your preferences - client.println(""); - - // Web Page Heading - client.println("

ESP32 Web Server

"); - - // Display current state, and ON/OFF buttons for GPIO 26 - client.println("

GPIO 26 - State " + output26State + "

"); - // If the output26State is off, it displays the ON button - if (output26State=="off") { - client.println("

"); - } else { - client.println("

"); - } - - // Display current state, and ON/OFF buttons for GPIO 27 - client.println("

GPIO 27 - State " + output27State + "

"); - // If the output27State is off, it displays the ON button - if (output27State=="off") { - client.println("

"); - } else { - client.println("

"); - } - client.println(""); - - // The HTTP response ends with another blank line - client.println(); - // Break out of the while loop - break; - } else { // if you got a newline, then clear currentLine - currentLine = ""; - } - } else if (c != '\r') { // if you got anything else but a carriage return character, - currentLine += c; // add it to the end of the currentLine - } - } - } - // Clear the header variable - header = ""; - // Close the connection - client.stop(); - Serial.println("Client disconnected."); - Serial.println(""); - } -} diff --git a/vulpes/include/README b/include/README similarity index 100% rename from vulpes/include/README rename to include/README diff --git a/vulpes/lib/README b/lib/README similarity index 100% rename from vulpes/lib/README rename to lib/README diff --git a/vulpes/platformio.ini b/platformio.ini similarity index 100% rename from vulpes/platformio.ini rename to platformio.ini diff --git a/vulpes/src/config.h.default b/src/config.h.default similarity index 100% rename from vulpes/src/config.h.default rename to src/config.h.default diff --git a/vulpes/src/main.cpp b/src/main.cpp similarity index 100% rename from vulpes/src/main.cpp rename to src/main.cpp diff --git a/vulpes/src/morse.cpp b/src/morse.cpp similarity index 100% rename from vulpes/src/morse.cpp rename to src/morse.cpp diff --git a/vulpes/src/morse.h b/src/morse.h similarity index 100% rename from vulpes/src/morse.h rename to src/morse.h diff --git a/test.html b/test.html new file mode 100644 index 0000000..e5dfd4b --- /dev/null +++ b/test.html @@ -0,0 +1,39 @@ + + + + + + + + + +
Content 1
+
Content 2
+
Content 3
+ + + + diff --git a/vulpes/test/README b/test/README similarity index 100% rename from vulpes/test/README rename to test/README diff --git a/vulpes/.vscode/extensions.json b/vulpes/.vscode/extensions.json deleted file mode 100644 index 080e70d..0000000 --- a/vulpes/.vscode/extensions.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ], - "unwantedRecommendations": [ - "ms-vscode.cpptools-extension-pack" - ] -} -- 2.30.2 From 2f6fd9a05ed593332b03b722cbb19aeebbdf759a Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 25 Sep 2023 22:06:49 -0500 Subject: [PATCH 5/9] Remove old file and stub out readme. --- README.md | 5 +++++ test.html | 39 --------------------------------------- 2 files changed, 5 insertions(+), 39 deletions(-) create mode 100644 README.md delete mode 100644 test.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..81a58f9 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vulpes + +## Access Point +When using as a wireless access point, the network SSID is "vulpes" +with no password. Navigate to http://192.168.0.1 to access webform. \ No newline at end of file diff --git a/test.html b/test.html deleted file mode 100644 index e5dfd4b..0000000 --- a/test.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - -
Content 1
-
Content 2
-
Content 3
- - - - -- 2.30.2 From 98536b8e76dd46ddc40d03d3c82fc0f9bde4b0b8 Mon Sep 17 00:00:00 2001 From: mattbk Date: Tue, 26 Sep 2023 20:57:41 -0500 Subject: [PATCH 6/9] Stub out network form. --- src/main.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2a36174..f7df652 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,8 +38,8 @@ const int alarmPin = 4; // pin to monitor for RTC alarms const int network = 1; // Connect to existing network // Read from config.h -const char* ssid = WIFI_SSID; -const char* password = WIFI_PASSWORD; +//const char* ssid = WIFI_SSID; +//const char* password = WIFI_PASSWORD; // Create a new access point // Replace with your desired network credentials const char* ssid_ap = "vulpes"; @@ -59,6 +59,9 @@ const char* PARAM_RUNNING = "programRunning"; const char* PARAM_STEPLENGTH = "inputStepLength"; const char* PARAM_CYCLEID = "inputCycleID"; const char* PARAM_NTRANS = "inputNtransmitters"; +const char* PARAM_NETWORK = "inputNetwork"; +const char* PARAM_SSID = "inputSSID"; +const char* PARAM_PASSWORD = "inputPassword"; // Global variables int yourInputSend; @@ -74,6 +77,9 @@ bool programRunning; int yourInputStepLength; int yourInputCycleID; int yourInputNtransmitters; +int yourInputNetwork; +String yourInputSSID; +String yourInputPassword; long start_millis = 0; long stop_millis = 0; long pause_until_millis = 0; @@ -123,6 +129,7 @@ const char index_html[] PROGMEM = R"rawliteral( // Fill in the other form fields document.getElementById("send-program").value = %inputSend%; document.getElementById("message").value = %inputMsg%; + document.getElementById("network").value = %inputNetwork%; } @@ -177,6 +184,23 @@ const char index_html[] PROGMEM = R"rawliteral( + +

+

Network Settings

+
+

Network Access
+ AP URL (http, not https): http://192.168.0.1
+
+ Existing Network SSID:
+ Existing Network Password:
+

+ +
+ + @@ -243,6 +267,15 @@ String processor(const String& var){ else if(var == "inputNtransmitters"){ return readFile(SPIFFS, "/inputNtransmitters.txt"); } + else if(var == "inputNetwork"){ + return readFile(SPIFFS, "/inputNetwork.txt"); + } + else if(var == "inputSSID"){ + return readFile(SPIFFS, "/inputSSID.txt"); + } + else if(var == "inputPassword"){ + return readFile(SPIFFS, "/inputPassword.txt"); + } else if(var == "inputFloat"){ return readFile(SPIFFS, "/inputFloat.txt"); } else if(var == "inputStartTimeUnix"){ @@ -331,6 +364,9 @@ void setup() { yourInputStepLength = readFile(SPIFFS, "/inputStepLength.txt").toInt(); yourInputCycleID = readFile(SPIFFS, "/inputCycleID.txt").toInt(); yourInputNtransmitters = readFile(SPIFFS, "/inputNtransmitters.txt").toInt(); + yourInputNetwork = readFile(SPIFFS, "/inputNetwork.txt").toInt(); + yourInputSSID = readFile(SPIFFS, "/inputSSID.txt"); + yourInputPassword = readFile(SPIFFS, "/inputPassword.txt"); // Set WPM from saved value sender_blink.setWPM(yourInputWPM); sender_key.setWPM(yourInputWPM); @@ -358,18 +394,22 @@ void setup() { } WiFi.setHostname("vulpes"); - if (network == 0){ + if (yourInputNetwork == 1){ // Attach to existing wifi WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); + const char* ssid_char = yourInputSSID.c_str(); + const char* password_char = yourInputPassword.c_str(); + WiFi.begin(ssid_char, password_char); if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!"); - return; + // If you fail to connect, act as new access point + WiFi.softAPConfig(local_ip, gateway, subnet); + WiFi.softAP(ssid_ap, password_ap); + //return; } - Serial.println(); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); - } else if (network == 1){ + } else if (yourInputNetwork == 0){ // Act as new access point WiFi.softAPConfig(local_ip, gateway, subnet); WiFi.softAP(ssid_ap, password_ap); @@ -382,6 +422,7 @@ void setup() { request->send_P(200, "text/html", index_html, processor); }); + // Form 1 // Send a GET request to /get?inputCustomMsg= server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) { String inputMessage; @@ -528,6 +569,34 @@ void setup() { // https://techtutorialsx.com/2018/01/14/esp32-arduino-http-server-external-and-internal-redirects/ request->redirect("/"); }); + + // Form 2 + server.on("/get2", HTTP_GET, [] (AsyncWebServerRequest *request) { + String inputMessage; + /// GET inputNetwork value on /get2?inputNetwork= + if (request->hasParam(PARAM_NETWORK)) { + inputMessage = request->getParam(PARAM_NETWORK)->value(); + writeFile(SPIFFS, "/inputNetwork.txt", inputMessage.c_str()); + yourInputNetwork = inputMessage.toInt(); + Serial.println(yourInputNetwork); + } + /// GET inputSSID value on /get2?inputSSID= + if (request->hasParam(PARAM_SSID)) { + inputMessage = request->getParam(PARAM_SSID)->value(); + writeFile(SPIFFS, "/inputSSID.txt", inputMessage.c_str()); + yourInputSSID = inputMessage; + Serial.println(yourInputSSID); + } + /// GET inputNetwork value on /get2?inputNetwork= + if (request->hasParam(PARAM_PASSWORD)) { + inputMessage = request->getParam(PARAM_PASSWORD)->value(); + writeFile(SPIFFS, "/inputPassword.txt", inputMessage.c_str()); + yourInputPassword = inputMessage; + Serial.println(yourInputPassword); + } + request->redirect("/"); + }); + server.onNotFound(notFound); server.begin(); -- 2.30.2 From db7c0adfed9ea293cf0a28cd1c151ef45db0d527 Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 27 Sep 2023 20:12:38 -0500 Subject: [PATCH 7/9] Reboot on network change form. --- src/main.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f7df652..bbeb011 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -134,7 +134,8 @@ const char index_html[] PROGMEM = R"rawliteral(

Vulpes Radio Orienteering Controller

-

Local time:

+

Local time: . If this is incorrect, your browser is not providing the correct time + (Firefox example).

General Settings

@@ -188,16 +189,18 @@ const char index_html[] PROGMEM = R"rawliteral(

Network Settings

-

Network Access
- AP URL (http, not https): http://192.168.0.1
+

Network Access:
- Existing Network SSID:
- Existing Network Password:
+ Existing Wireless Network SSID:
+ Existing Wireless Network Password:
+

+ Access Point: Connect to wireless network "vulpes" and point your browser to URL http://192.168.0.1 (http, not https)
+ Existing Network (advanced): Connect to the same existing network and use the proper IP address (useful if you have access to the router or a serial connection).

- +
@@ -289,6 +292,8 @@ String processor(const String& var){ return String(); } +// https://www.thegeekpub.com/276838/how-to-reset-an-arduino-using-code/ +void(* resetFunc) (void) = 0; // create a standard reset function // Set up arduinomorse pin and default WPM LEDMorseSender sender_blink(blinker, 10.0f); //f makes it a float @@ -594,7 +599,10 @@ void setup() { yourInputPassword = inputMessage; Serial.println(yourInputPassword); } - request->redirect("/"); + // Shouldn't need to do this if using this form. + //request->redirect("/"); + + resetFunc(); // reset the Arduino via software function }); server.onNotFound(notFound); -- 2.30.2 From 9679248691f3a5668686bdb81ec4a976d58fc269 Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 27 Sep 2023 20:43:01 -0500 Subject: [PATCH 8/9] Default to AP if wifi is inaccessible. --- src/main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bbeb011..c15d0c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -198,7 +198,8 @@ const char index_html[] PROGMEM = R"rawliteral( Existing Wireless Network Password:

Access Point: Connect to wireless network "vulpes" and point your browser to URL http://192.168.0.1 (http, not https)
- Existing Network (advanced): Connect to the same existing network and use the proper IP address (useful if you have access to the router or a serial connection). + Existing Network (advanced): Connect to the same existing network and use the proper IP address (useful if you have access to the router or a serial connection).
+ If an existing network can't be connected to, an access point will be set up.

@@ -406,10 +407,13 @@ void setup() { const char* password_char = yourInputPassword.c_str(); WiFi.begin(ssid_char, password_char); if (WiFi.waitForConnectResult() != WL_CONNECTED) { - Serial.println("WiFi Failed!"); + Serial.println("WiFi Failed! Setting up access point 'vulpes'..."); // If you fail to connect, act as new access point + WiFi.disconnect(true); WiFi.softAPConfig(local_ip, gateway, subnet); WiFi.softAP(ssid_ap, password_ap); + // update the file so the webform is right + writeFile(SPIFFS, "/inputNetwork.txt", "0"); //return; } Serial.print("IP Address: "); -- 2.30.2 From 0478506e870ca9dde7ea90a683ab40aa0c095cc2 Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 27 Sep 2023 20:56:37 -0500 Subject: [PATCH 9/9] Add confirmation so people don't click the wrong button. --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c15d0c0..45d96c3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -188,7 +188,7 @@ const char index_html[] PROGMEM = R"rawliteral(

Network Settings

-
+

Network Access: