diff --git a/vulpes/.gitignore b/.gitignore similarity index 100% rename from vulpes/.gitignore rename to .gitignore 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/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 81% rename from vulpes/src/main.cpp rename to src/main.cpp index 6f49a1d..45d96c3 100644 --- a/vulpes/src/main.cpp +++ b/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: "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; -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"; +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); const char* PARAM_SEND = "inputSend"; const char* PARAM_WPM = "inputWPM"; @@ -49,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; @@ -64,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; @@ -113,11 +129,13 @@ 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%; }

Vulpes Radio Orienteering Controller

-

Local time:

+

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

General Settings

@@ -167,6 +185,26 @@ const char index_html[] PROGMEM = R"rawliteral(
+ +

+

Network Settings

+
+

Network Access: +
+ 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).
+ If an existing network can't be connected to, an access point will be set up. +

+ +
+ + @@ -233,6 +271,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"){ @@ -246,6 +293,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 @@ -321,6 +370,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); @@ -347,21 +399,39 @@ 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 (yourInputNetwork == 1){ + // Attach to existing wifi + WiFi.mode(WIFI_STA); + 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! 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: "); + Serial.println(WiFi.localIP()); + } else if (yourInputNetwork == 0){ + // 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){ 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; @@ -508,6 +578,37 @@ 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); + } + // Shouldn't need to do this if using this form. + request->redirect("/"); + + resetFunc(); // reset the Arduino via software function + }); + server.onNotFound(notFound); server.begin(); 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/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" - ] -}