Compare commits
	
		
			14 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ab7020f718 | ||
| 
						 | 
					52b910ed79 | ||
| 
						 | 
					0478506e87 | ||
| 
						 | 
					9679248691 | ||
| 
						 | 
					db7c0adfed | ||
| 
						 | 
					98536b8e76 | ||
| 
						 | 
					2f6fd9a05e | ||
| 
						 | 
					4e797b9281 | ||
| 
						 | 
					5e3503b497 | ||
| 
						 | 
					7fc43238cd | ||
| 
						 | 
					8106d576be | ||
| 
						 | 
					e942576fd8 | ||
| 
						 | 
					c14215d42f | ||
| 
						 | 
					99f6ebfe93 | 
							
								
								
									
										0
									
								
								vulpes/.gitignore → .gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								vulpes/.gitignore → .gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
									
										5
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -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.
 | 
			
		||||
@@ -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 <Arduino.h>
 | 
			
		||||
#include <WiFi.h>
 | 
			
		||||
#include <AsyncTCP.h>
 | 
			
		||||
#include <SPIFFS.h>
 | 
			
		||||
#include <Preferences.h>
 | 
			
		||||
 | 
			
		||||
// download zip from https://github.com/me-no-dev/ESPAsyncWebServer and install.
 | 
			
		||||
#include <ESPAsyncWebServer.h>
 | 
			
		||||
 | 
			
		||||
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(
 | 
			
		||||
<!DOCTYPE HTML><html><head>
 | 
			
		||||
  <title>ESP Input Form</title>
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
  <!--<script>
 | 
			
		||||
    function submitMessage() {
 | 
			
		||||
      alert("Saved value to ESP SPIFFS");
 | 
			
		||||
      setTimeout(function(){ document.location.reload(false); }, 500);   
 | 
			
		||||
    }
 | 
			
		||||
  </script>-->
 | 
			
		||||
  </head><body>
 | 
			
		||||
  <form action="/get">
 | 
			
		||||
    inputString (current value %inputString%): <input type="text" name="inputString">
 | 
			
		||||
    <!--<input type="submit" value="Submit" ">
 | 
			
		||||
  </form>--><br>
 | 
			
		||||
  <!--<form action="/get" target="hidden-form">-->
 | 
			
		||||
    inputInt (current value %inputInt%): <input type="number " name="inputInt">
 | 
			
		||||
    <!--<input type="submit" value="Submit" ">
 | 
			
		||||
  </form>--><br>
 | 
			
		||||
  <!--<form action="/get" target="hidden-form">-->
 | 
			
		||||
    inputFloat (current value %inputFloat%): <input type="number " name="inputFloat">
 | 
			
		||||
    <input type="submit" value="Submit" ">
 | 
			
		||||
  </form>
 | 
			
		||||
  <!--<iframe style="display:none" name="hidden-form"></iframe>-->
 | 
			
		||||
</body></html>)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 <ESP_IP>/get?inputString=<inputMessage>
 | 
			
		||||
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
 | 
			
		||||
    String inputMessage;
 | 
			
		||||
    // GET inputString value on <ESP_IP>/get?inputString=<inputMessage>
 | 
			
		||||
    if (request->hasParam(PARAM_STRING)) {
 | 
			
		||||
      inputMessage = request->getParam(PARAM_STRING)->value();
 | 
			
		||||
      writeFile(SPIFFS, "/inputString.txt", inputMessage.c_str());
 | 
			
		||||
    }
 | 
			
		||||
    // GET inputInt value on <ESP_IP>/get?inputInt=<inputMessage>
 | 
			
		||||
    else if (request->hasParam(PARAM_INT)) {
 | 
			
		||||
      inputMessage = request->getParam(PARAM_INT)->value();
 | 
			
		||||
      writeFile(SPIFFS, "/inputInt.txt", inputMessage.c_str());
 | 
			
		||||
    }
 | 
			
		||||
    // GET inputFloat value on <ESP_IP>/get?inputFloat=<inputMessage>
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,169 +0,0 @@
 | 
			
		||||
/*********
 | 
			
		||||
  Rui Santos
 | 
			
		||||
  Complete project details at https://randomnerdtutorials.com
 | 
			
		||||
*********/
 | 
			
		||||
// include wifi password
 | 
			
		||||
#include "config.h"
 | 
			
		||||
// Load Wi-Fi library
 | 
			
		||||
#include <WiFi.h>
 | 
			
		||||
// Load Preferences library
 | 
			
		||||
#include <Preferences.h>
 | 
			
		||||
// 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("<!DOCTYPE html><html>");
 | 
			
		||||
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
 | 
			
		||||
            client.println("<link rel=\"icon\" href=\"data:,\">");
 | 
			
		||||
            // CSS to style the on/off buttons
 | 
			
		||||
            // Feel free to change the background-color and font-size attributes to fit your preferences
 | 
			
		||||
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
 | 
			
		||||
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
 | 
			
		||||
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
 | 
			
		||||
            client.println(".button2 {background-color: #555555;}</style></head>");
 | 
			
		||||
 | 
			
		||||
            // Web Page Heading
 | 
			
		||||
            client.println("<body><h1>ESP32 Web Server</h1>");
 | 
			
		||||
 | 
			
		||||
            // Display current state, and ON/OFF buttons for GPIO 26
 | 
			
		||||
            client.println("<p>GPIO 26 - State " + output26State + "</p>");
 | 
			
		||||
            // If the output26State is off, it displays the ON button
 | 
			
		||||
            if (output26State=="off") {
 | 
			
		||||
              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
 | 
			
		||||
            } else {
 | 
			
		||||
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Display current state, and ON/OFF buttons for GPIO 27
 | 
			
		||||
            client.println("<p>GPIO 27 - State " + output27State + "</p>");
 | 
			
		||||
            // If the output27State is off, it displays the ON button
 | 
			
		||||
            if (output27State=="off") {
 | 
			
		||||
              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
 | 
			
		||||
            } else {
 | 
			
		||||
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
 | 
			
		||||
            }
 | 
			
		||||
            client.println("</body></html>");
 | 
			
		||||
 | 
			
		||||
            // 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("");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,157 +0,0 @@
 | 
			
		||||
/*********
 | 
			
		||||
  Rui Santos
 | 
			
		||||
  Complete project details at https://randomnerdtutorials.com  
 | 
			
		||||
*********/
 | 
			
		||||
 | 
			
		||||
// include wifi password
 | 
			
		||||
#include "config.h"
 | 
			
		||||
// Load Wi-Fi library
 | 
			
		||||
#include <WiFi.h>
 | 
			
		||||
 | 
			
		||||
// 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("<!DOCTYPE html><html>");
 | 
			
		||||
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
 | 
			
		||||
            client.println("<link rel=\"icon\" href=\"data:,\">");
 | 
			
		||||
            // CSS to style the on/off buttons 
 | 
			
		||||
            // Feel free to change the background-color and font-size attributes to fit your preferences
 | 
			
		||||
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
 | 
			
		||||
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
 | 
			
		||||
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
 | 
			
		||||
            client.println(".button2 {background-color: #555555;}</style></head>");
 | 
			
		||||
            
 | 
			
		||||
            // Web Page Heading
 | 
			
		||||
            client.println("<body><h1>ESP32 Web Server</h1>");
 | 
			
		||||
            
 | 
			
		||||
            // Display current state, and ON/OFF buttons for GPIO 26  
 | 
			
		||||
            client.println("<p>GPIO 26 - State " + output26State + "</p>");
 | 
			
		||||
            // If the output26State is off, it displays the ON button       
 | 
			
		||||
            if (output26State=="off") {
 | 
			
		||||
              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
 | 
			
		||||
            } else {
 | 
			
		||||
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
 | 
			
		||||
            } 
 | 
			
		||||
               
 | 
			
		||||
            // Display current state, and ON/OFF buttons for GPIO 27  
 | 
			
		||||
            client.println("<p>GPIO 27 - State " + output27State + "</p>");
 | 
			
		||||
            // If the output27State is off, it displays the ON button       
 | 
			
		||||
            if (output27State=="off") {
 | 
			
		||||
              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
 | 
			
		||||
            } else {
 | 
			
		||||
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
 | 
			
		||||
            }
 | 
			
		||||
            client.println("</body></html>");
 | 
			
		||||
            
 | 
			
		||||
            // 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("");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -31,12 +31,27 @@ AsyncWebServer server(80);
 | 
			
		||||
const int keyer = 32;
 | 
			
		||||
const int blinker = LED_BUILTIN;
 | 
			
		||||
 | 
			
		||||
// Battery voltage monitor
 | 
			
		||||
const int voltage_pin = 33;
 | 
			
		||||
int voltage_pin_value = 0;
 | 
			
		||||
 | 
			
		||||
// RTC connections
 | 
			
		||||
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 +64,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 +82,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;
 | 
			
		||||
@@ -72,15 +93,7 @@ long pause_until_millis = 0;
 | 
			
		||||
const char index_html[] PROGMEM = R"rawliteral(
 | 
			
		||||
<!DOCTYPE HTML><html><head>
 | 
			
		||||
  <link rel="icon" href="data:,">
 | 
			
		||||
  <title>Vulpes Radio Orienteering Controller</title>
 | 
			
		||||
  <style>
 | 
			
		||||
    .inv_message {
 | 
			
		||||
      display: none;
 | 
			
		||||
      }
 | 
			
		||||
    .inv_program {
 | 
			
		||||
      display: none;
 | 
			
		||||
      }
 | 
			
		||||
  </style>
 | 
			
		||||
  <title>ESP Input Form</title>
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
  <script type="text/javascript">
 | 
			
		||||
    // Utility from https://webreflection.medium.com/using-the-input-datetime-local-9503e7efdce
 | 
			
		||||
@@ -121,17 +134,19 @@ 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%;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  </script></head><body>
 | 
			
		||||
  <h1>Vulpes Radio Orienteering Controller</h1>
 | 
			
		||||
  <p>Local time: <b><span id=local-time-unix></span></b></p>
 | 
			
		||||
  <p>Local time: <b><span id=local-time-unix></span></b>. If this is incorrect, your browser is not providing the correct time 
 | 
			
		||||
  (<a href="https://support.mozilla.org/en-US/questions/1297208">Firefox example</a>).</p>
 | 
			
		||||
 | 
			
		||||
  <form action="/get"  onsubmit="putDate(this);" accept-charset=utf-8>
 | 
			
		||||
    <h2>General Settings</h2>
 | 
			
		||||
    <p>Sending program:
 | 
			
		||||
    <select name="inputSend" id="send-program">
 | 
			
		||||
      <option value="0">0 - Off</option>
 | 
			
		||||
      <option value="0" >0 - Off</option>
 | 
			
		||||
      <option value="1">1 - Continuous</option>
 | 
			
		||||
      <option value="2">2 - Cycle</option>
 | 
			
		||||
    </select><br>
 | 
			
		||||
@@ -146,29 +161,24 @@ const char index_html[] PROGMEM = R"rawliteral(
 | 
			
		||||
      <option value="5">5 - MO5</option>
 | 
			
		||||
    </select><br>
 | 
			
		||||
 | 
			
		||||
    <!-- Hidden unless "0 - Custom Message" is selected -->
 | 
			
		||||
    <span id="message0" class="inv_message">
 | 
			
		||||
      Custom message: <input type="text" name="inputCustomMsg" value = "%inputCustomMsg%"><br>
 | 
			
		||||
    </span>
 | 
			
		||||
    Custom message: <input type="text" name="inputCustomMsg" value = "%inputCustomMsg%"><br>
 | 
			
		||||
    
 | 
			
		||||
    Speed: <input type="number" name="inputWPM" value = %inputWPM%> WPM
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <!-- Hidden unless "2 - Cycle" is selected -->
 | 
			
		||||
    <span id="program2" class="inv_program">
 | 
			
		||||
      <h2>Cycle Settings</h2>
 | 
			
		||||
      <p>Only applies when <em>Sending Program</em> is set to "2 - Cycle". You cannot set a cycle start date more than a month in advance.<br>
 | 
			
		||||
      Cycle start time <input type="datetime-local" id="js_start_time_unix_entry" /><br>
 | 
			
		||||
      Current value: <b><span id=current-start></span></b><br>
 | 
			
		||||
      
 | 
			
		||||
      <!-- JS converts the entered start time to a unix timestamp, and copies that value
 | 
			
		||||
      to this hidden field so the user doesn't have to see it. -->
 | 
			
		||||
      <input type="hidden" name="inputStartTimeUnix" id="js_start_time_unix" /></p>
 | 
			
		||||
        Step length: <input type="number" name="inputStepLength" min=1000 step=1000 value = %inputStepLength%> milliseconds <br>
 | 
			
		||||
        Cycle ID: <input type="number" name="inputCycleID" min=1 value = %inputCycleID%><br>
 | 
			
		||||
        Number of transmitters: <input type="number" name="inputNtransmitters" min=1 value = %inputNtransmitters%><br>
 | 
			
		||||
      </p>
 | 
			
		||||
    </span>
 | 
			
		||||
    <h2>Cycle Settings</h2>
 | 
			
		||||
    <p>Only applies when <em>Sending Program</em> is set to "2 - Cycle". You cannot set a cycle start date more than a month in advance.</p>
 | 
			
		||||
    <p>Cycle start time <input type="datetime-local" id="js_start_time_unix_entry" /><br>
 | 
			
		||||
    Current value: <b><span id=current-start></span></b>
 | 
			
		||||
    
 | 
			
		||||
    <!-- JS converts the entered start time to a unix timestamp, and copies that value
 | 
			
		||||
    to this hidden field so the user doesn't have to see it. -->
 | 
			
		||||
    <input type="hidden" name="inputStartTimeUnix" id="js_start_time_unix" /></p>
 | 
			
		||||
    <p>
 | 
			
		||||
      Step length: <input type="number" name="inputStepLength" min=1000 step=1000 value = %inputStepLength%> milliseconds <br>
 | 
			
		||||
      Cycle ID: <input type="number" name="inputCycleID" min=1 value = %inputCycleID%><br>
 | 
			
		||||
      Number of transmitters: <input type="number" name="inputNtransmitters" min=1 value = %inputNtransmitters%><br>
 | 
			
		||||
    </p>
 | 
			
		||||
    
 | 
			
		||||
    <!-- This field is hidden so people don't change the submit time (it will be wrong).
 | 
			
		||||
    The value is automatically filled in with JS. -->
 | 
			
		||||
@@ -179,41 +189,29 @@ const char index_html[] PROGMEM = R"rawliteral(
 | 
			
		||||
 | 
			
		||||
    <input type="submit" value="Submit"">
 | 
			
		||||
  </form>
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  <iframe style="display:none" name="hidden-form" id="hidden-form"></iframe>
 | 
			
		||||
 | 
			
		||||
  <br><hr>
 | 
			
		||||
  <h2>Network Settings</h2>
 | 
			
		||||
  <form onsubmit="return confirm('Are you sure you want to change the network and reboot?');" action="/get2" accept-charset=utf-8>
 | 
			
		||||
    <p>Network Access: 
 | 
			
		||||
    <select name="inputNetwork" id="network">
 | 
			
		||||
      <option value="0">Access Point</option>
 | 
			
		||||
      <option value="1">Existing Wireless Network (advanced)</option>
 | 
			
		||||
    </select><br>
 | 
			
		||||
    Existing Wireless Network SSID: <input type="text" name="inputSSID" value = "%inputSSID%"><br>
 | 
			
		||||
    Existing Wireless Network Password: <input type="password" name="inputPassword" value = "%inputPassword%"><br>
 | 
			
		||||
    </p><p>
 | 
			
		||||
    Access Point: Connect to wireless network "vulpes" and point your browser to URL <a href="http://192.168.0.1">http://192.168.0.1</a> (http, not http<b>s</b>)<br>
 | 
			
		||||
    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).<br>
 | 
			
		||||
    If an existing network can't be connected to, an access point will be set up.
 | 
			
		||||
    </p>
 | 
			
		||||
  <input type="submit" value="Submit and Reboot">
 | 
			
		||||
  </form>
 | 
			
		||||
 | 
			
		||||
  <iframe style="display:none" name="hidden-form02" id="hidden-form02"></iframe>
 | 
			
		||||
  <script type="text/javascript">
 | 
			
		||||
    // Show more stuff depending on selected values
 | 
			
		||||
    // https://stackoverflow.com/a/24849350
 | 
			
		||||
    show_message = function () {
 | 
			
		||||
          'use strict';
 | 
			
		||||
          var vis_message = document.querySelector('.vis_message'),   
 | 
			
		||||
              target = document.getElementById("message"+this.value);
 | 
			
		||||
          if (vis_message !== null) {
 | 
			
		||||
              vis_message.className = 'inv_message';
 | 
			
		||||
          }
 | 
			
		||||
          if (target !== null ) {
 | 
			
		||||
              target.className = 'vis_message';
 | 
			
		||||
          }
 | 
			
		||||
    }
 | 
			
		||||
    show_program = function () {
 | 
			
		||||
          'use strict';
 | 
			
		||||
          var vis_program = document.querySelector('.vis_program'),   
 | 
			
		||||
              target = document.getElementById("program"+this.value);
 | 
			
		||||
          if (vis_program !== null) {
 | 
			
		||||
              vis_program.className = 'inv_program';
 | 
			
		||||
          }
 | 
			
		||||
          if (target !== null ) {
 | 
			
		||||
              target.className = 'vis_program';
 | 
			
		||||
          }
 | 
			
		||||
    }
 | 
			
		||||
    document
 | 
			
		||||
      .getElementById('message')
 | 
			
		||||
      .addEventListener('change', show_message);
 | 
			
		||||
    document
 | 
			
		||||
      .getElementById('send-program')
 | 
			
		||||
      .addEventListener('change', show_program);
 | 
			
		||||
    
 | 
			
		||||
  </script>
 | 
			
		||||
</body></html>)rawliteral";
 | 
			
		||||
 | 
			
		||||
@@ -278,6 +276,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"){
 | 
			
		||||
@@ -291,6 +298,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
 | 
			
		||||
@@ -324,8 +333,11 @@ void setup() {
 | 
			
		||||
    //rtc.adjust(DateTime(2023, 9, 2, 17, 32, 0));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Report the RTC time
 | 
			
		||||
  Serial.print("RTC time on startup: ");
 | 
			
		||||
  // Report the RTC time after waiting two seconds
 | 
			
		||||
  // https://amiok.net/gitea/W1CDN/vulpes/issues/50#issuecomment-1376
 | 
			
		||||
  Serial.println("Wait 2s for RTC");
 | 
			
		||||
  delay(2000); 
 | 
			
		||||
  Serial.println("RTC time on startup: ");
 | 
			
		||||
  Serial.println(rtc.now().unixtime());
 | 
			
		||||
  Serial.println(rtc.now().timestamp());
 | 
			
		||||
 | 
			
		||||
@@ -363,6 +375,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);
 | 
			
		||||
@@ -389,21 +404,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 <ESP_IP>/get?inputCustomMsg=<inputMessage>
 | 
			
		||||
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
 | 
			
		||||
    String inputMessage;
 | 
			
		||||
@@ -550,6 +583,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 <ESP_IP>/get2?inputNetwork=<inputMessage>
 | 
			
		||||
    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 <ESP_IP>/get2?inputSSID=<inputMessage>
 | 
			
		||||
    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 <ESP_IP>/get2?inputNetwork=<inputMessage>
 | 
			
		||||
    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();
 | 
			
		||||
 | 
			
		||||
@@ -557,6 +621,13 @@ void setup() {
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
 | 
			
		||||
  // For testing, print the value returned from the voltage circuit.
 | 
			
		||||
  // This is not voltage, and needs to be scaled to the battery. See KB1OIQ's solution.
 | 
			
		||||
  voltage_pin_value = analogRead(voltage_pin);
 | 
			
		||||
  Serial.println(voltage_pin_value);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // This statement from https://github.com/garrysblog/DS3231-Alarm-With-Adafruit-RTClib-Library/blob/master/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired.ino
 | 
			
		||||
  // Check if alarm by polling SQW alarm pin
 | 
			
		||||
  if((yourInputSend == 2) & (digitalRead(alarmPin) == LOW)) {
 | 
			
		||||
							
								
								
									
										10
									
								
								vulpes/.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vulpes/.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							@@ -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"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user