184 lines
5.6 KiB
Arduino
184 lines
5.6 KiB
Arduino
|
/*********
|
||
|
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);
|
||
|
}
|