diff --git a/arduino_code/test_asyncbuttons.ino b/arduino_code/test_asyncbuttons.ino new file mode 100644 index 0000000000000000000000000000000000000000..8731fc019ab3b089612eecf9aeb909c92f72136e --- /dev/null +++ b/arduino_code/test_asyncbuttons.ino @@ -0,0 +1,119 @@ +// Importing necessary libraries +#include <WiFi.h> +#include <AsyncTCP.h> +#include <ESPAsyncWebServer.h> + +// Setting network credentials +const char* ssid = "Connectify-ESP32 Boot"; +const char* password = "temp_pass1234"; + +const char* input_parameter1 = "output"; +const char* input_parameter2 = "state"; + +// Creating a AsyncWebServer object +AsyncWebServer server(80); + + +const char index_html[] PROGMEM = R"rawliteral( +<!DOCTYPE HTML><html> +<head> + <title>ESP32 WEB SERVER</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="icon" href="data:,"> + <style> + html {font-family: Arial; display: inline-block; text-align: center;} + p {font-size: 3.0rem;} + body {max-width: 600px; margin:0px auto; padding-bottom: 25px;} + .switch {position: relative; display: inline-block; width: 120px; height: 68px} + .switch input {display: none} + .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px} + .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px} + input:checked+.slider {background-color: #b30000} + input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)} + </style> +</head> +<body> + <h2>ESP32 WEB SERVER</h2> + %BUTTONPLACEHOLDER% +<script>function toggleCheckbox(element) { + var xhr = new XMLHttpRequest(); + if(element.checked){ xhr.open("GET", "/update?output="+element.id+"&state=1", true); } + else { xhr.open("GET", "/update?output="+element.id+"&state=0", true); } + xhr.send(); +} +</script> +</body> +</html> +)rawliteral"; + +// Replaces placeholder with button section in your web page +String processor(const String& var){ + //Serial.println(var); + if(var == "BUTTONPLACEHOLDER"){ + String buttons = ""; + buttons += "<h4>Output - GPIO 2</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"2\" " + outputState(2) + "><span class=\"slider\"></span></label>"; + return buttons; + } + return String(); +} + +String outputState(int output){ + if(digitalRead(output)){ + return "checked"; + } + else { + return ""; + } +} + +void setup(){ + // Serial port for debugging purposes + Serial.begin(115200); + +pinMode(2,OUTPUT); +digitalWrite(2, LOW); + + + // Connect to Wi-Fi + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.println("Connecting to WiFi"); + } + + // Print ESP Local IP Address + Serial.println(WiFi.localIP()); + + // Route for root / web page + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send_P(200, "text/html", index_html, processor); + }); + + // Send a GET request to <ESP_IP>/update?output=<inputMessage1>&state=<inputMessage2> + server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) { + String inputMessage1; + String inputMessage2; + // GET input1 value on <ESP_IP>/update?output=<inputMessage1>&state=<inputMessage2> + if (request->hasParam(input_parameter1) && request->hasParam(input_parameter2)) { + inputMessage1 = request->getParam(input_parameter1)->value(); + inputMessage2 = request->getParam(input_parameter2)->value(); + digitalWrite(inputMessage1.toInt(), inputMessage2.toInt()); + } + else { + inputMessage1 = "No message sent"; + inputMessage2 = "No message sent"; + } + Serial.print("GPIO: "); + Serial.print(inputMessage1); + Serial.print(" - Set to: "); + Serial.println(inputMessage2); + request->send(200, "text/plain", "OK"); + }); + + // Start server + server.begin(); +} + +void loop() { + +} \ No newline at end of file diff --git a/arduino_code/test_webpage_sensors.ino b/arduino_code/test_webpage_sensors.ino index eb54e3146643ed54c9b66cb694b855694aad5697..4bb1bc21d52d129376a8c756d965297e82a56693 100644 --- a/arduino_code/test_webpage_sensors.ino +++ b/arduino_code/test_webpage_sensors.ino @@ -8,25 +8,34 @@ #include <WiFi.h> #include <ESPAsyncWebServer.h> #include <AsyncTCP.h> +#include <Stepper.h> // Replace with your network credentials const char* ssid = "Connectify-ESP32 Boot"; const char* password = "temp_pass1234"; +const char* input_parameter1 = "output"; +const char* input_parameter2 = "state"; + #define PRESSUREPIN1 34 #define PRESSUREPIN2 35 -#define motorIN1 -#define motorIN2 -#define motorIN3 -#define motorIN4 +#define motorIN1 33 +#define motorIN2 32 +#define motorIN3 26 +#define motorIN4 27 + +#define PRESSURE1GOAL 1000 +#define PRESSURE2GOAL 2034 -#define PRESSUREGOAL1 357 -#define PRESSUREGOAL2 2034 +Stepper motor(200, motorIN1, motorIN2, motorIN3, motorIN4); // current temperature & humidity, updated in loop() int pressure1 = 0.0; int pressure2 = 0.0; -float motorSpeed = 0.0; +float motor1Speed = 0.0; +String pressure1status = "NOT YET..."; +String pressure2status = "NOT YET..."; +String motor1status = "Not running"; // Create AsyncWebServer object on port 80 AsyncWebServer server(80); @@ -53,33 +62,59 @@ const char index_html[] PROGMEM = R"rawliteral( h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } - .dht-labels{ + .sensorlabel{ font-size: 1.5rem; - vertical-align:middle; + vertical-align:center; padding-bottom: 15px; } + .statuslabel { font-size: 1.3rem; } + button2 {background-color: #555555;} + body {max-width: 600px; margin:0px auto; padding-bottom: 25px;} + .switch {position: relative; display: inline-block; width: 120px; height: 68px} + .switch input {display: none} + .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px} + .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px} + input:checked+.slider {background-color: #b30000} + input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)} </style> </head> <body> <h2>Remotely Adjustable Boot</h2> <p> - <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> - <span class="dht-labels">Pressure LEFT</span> + <i class="fas fa-thermometer-half" style="color:#4a32a8;"></i> + <span class="sensorlabel">Pressure LEFT</span> + <br> <span id="pressure1">%PRESSURE1%</span> <sup class="units">mmHg</sup> </p> <p> - <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> - <span class="dht-labels">Pressure RIGHT</span> + <span class="sensorlabel">Status:</span> + <span id="pressure1status" class="statuslabel">%PRESSURE1STATUS%</span> + </p> + <p> + <i class="fas fa-thermometer-half" style="color:#4a32a8;"></i> + <span class="sensorlabel">Pressure RIGHT</span> <span id="pressure2">%PRESSURE2%</span> <sup class="units">mmHg</sup> </p> <p> - <i class="fas fa-tint" style="color:#00add6;"></i> - <span class="dht-labels">Motor Speed</span> - <span id="motorspeed">%MOTORSPEED%</span> - <sup class="units">%</sup> + <span class="sensorlabel">Status:</span> + <span id="pressure2status" class="statuslabel">%PRESSURE2STATUS%</span> </p> + <p> + <i class="fas fa-wrench" style="color:#4a32a8;"></i> + <span class="sensorlabel">Motor Status</span> + <span id="motor1status">%MOTOR1STATUS%</span> + <sup class="units">torque</sup> + </p> + %BUTTONPLACEHOLDER% + <script>function toggleCheckbox(element) { + var xhr = new XMLHttpRequest(); + if(element.checked){ xhr.open("GET", "/update?output="+element.id+"&state=1", true); } + else { xhr.open("GET", "/update?output="+element.id+"&state=0", true); } + xhr.send(); + } + </script> </body> <script> setInterval(function ( ) { @@ -93,6 +128,17 @@ setInterval(function ( ) { xhttp.send(); }, 0.1 ) ; +setInterval(function ( ) { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + document.getElementById("pressure1status").innerHTML = this.responseText; + } + }; + xhttp.open("GET", "/pressure1status", true); + xhttp.send(); +}, 0.1 ) ; + setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { @@ -104,31 +150,62 @@ setInterval(function ( ) { xhttp.send(); }, 0.1 ) ; +setInterval(function ( ) { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + document.getElementById("pressure2status").innerHTML = this.responseText; + } + }; + xhttp.open("GET", "/pressure2status", true); + xhttp.send(); +}, 0.1 ) ; setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { - document.getElementById("motorspeed").innerHTML = this.responseText; + document.getElementById("motor1status").innerHTML = this.responseText; } }; - xhttp.open("GET", "/motorspeed", true); + xhttp.open("GET", "/motor1status", true); xhttp.send(); }, 0.1 ) ; </script> </html>)rawliteral"; +String outputState(int output){ + if(digitalRead(output)){ + return "checked"; + } + else { + return ""; + } +} + // Replaces placeholder with DHT values String processor(const String& var){ //Serial.println(var); if(var == "PRESSURE1"){ return String(pressure1); } + else if (var == "PRESSURE1STATUS"){ + return String(pressure1status); + } else if(var == "PRESSURE2"){ return String(pressure2); } - else if(var == "MOTORSPEED"){ - return String(motorSpeed); + else if (var == "PRESSURE2STATUS"){ + return String(pressure2status); + } + else if(var == "MOTOR1STATUS"){ + return String(motor1status); + } + else if(var == "BUTTONPLACEHOLDER"){ + String buttons = ""; + buttons += "<h4>Output - GPIO 2</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"2\" " + outputState(2) + "><span class=\"slider\"></span></label>"; + + return buttons; } return String(); } @@ -155,18 +232,46 @@ void setup(){ server.on("/pressure1", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(pressure1).c_str()); }); + server.on("/pressure1status", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send_P(200, "text/plain", String(pressure1status).c_str()); + }); server.on("/pressure2", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(pressure2).c_str()); }); - server.on("/motorspeed", HTTP_GET, [](AsyncWebServerRequest *request){ - request->send_P(200, "text/plain", String(motorSpeed).c_str()); + server.on("/pressure2status", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send_P(200, "text/plain", String(pressure2status).c_str()); + }); + server.on("/motor1status", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send_P(200, "text/plain", String(motor1status).c_str()); + }); + + server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) { + String inputMessage1; + String inputMessage2; + // GET input1 value on <ESP_IP>/update?output=<inputMessage1>&state=<inputMessage2> + if (request->hasParam(input_parameter1) && request->hasParam(input_parameter2)) { + inputMessage1 = request->getParam(input_parameter1)->value(); + inputMessage2 = request->getParam(input_parameter2)->value(); + digitalWrite(inputMessage1.toInt(), inputMessage2.toInt()); + } + else { + inputMessage1 = "No message sent"; + inputMessage2 = "No message sent"; + } + Serial.print("GPIO: "); + Serial.print(inputMessage1); + Serial.print(" - Set to: "); + Serial.println(inputMessage2); + request->send(200, "text/plain", "OK"); }); // Start server server.begin(); + pinMode(2, OUTPUT); + digitalWrite(2, LOW); } -void loop(){ +void loop(){ unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { @@ -187,45 +292,10 @@ void loop(){ intervals2[aModulus2] += 1; intervalValues2[aModulus2] += int(a2 % 600); - - Serial.println("Reading #" + String(counter) + ": " + String(a1) + ", " + String(aModulus1)); - Serial.println("Reading #" + String(counter) + ": " + String(a2) + ", " + String(aModulus2)); - + delay(10); } - - Serial.println("Intervals array #1: ["); - for (int counter = 0; counter < 7; counter++) { - Serial.print(intervals1[counter]); - Serial.print(","); - } - Serial.print("]"); - - Serial.println("Interval Values array #1: "); - for (int counter = 0; counter < 7; counter++) { - Serial.print(intervalValues1[counter]); - Serial.print(","); - } - Serial.print("]"); - - Serial.println("**********"); - - Serial.println("Intervals array #2: ["); - for (int counter = 0; counter < 7; counter++) { - Serial.print(intervals2[counter]); - Serial.print(","); - } - Serial.print("]"); - - Serial.println("Interval Values array #2: "); - for (int counter = 0; counter < 7; counter++) { - Serial.print(intervalValues2[counter]); - Serial.print(","); - } - Serial.print("]"); - - Serial.println("**********"); - + int maxIntervalSize1 = intervals1[0]; int maxIntervalIndex1 = 0; for (int index = 1; index < 7; index ++) { @@ -234,7 +304,6 @@ void loop(){ maxIntervalSize1 = intervals1[index]; } } - Serial.println("maxIntervalIndex #1: " + maxIntervalIndex1); int maxIntervalSize2 = intervals2[0]; int maxIntervalIndex2 = 0; for (int index = 1; index < 7; index ++) { @@ -243,20 +312,22 @@ void loop(){ maxIntervalSize2 = intervals2[index]; } } - Serial.println("maxIntervalIndex #2: " + maxIntervalIndex2); pressure1 = (intervalValues1[maxIntervalIndex1]/maxIntervalSize1)+ maxIntervalIndex1*600; pressure2 = (intervalValues2[maxIntervalIndex2]/maxIntervalSize2)+ maxIntervalIndex2*600; - Serial.println("adcValue #1: " + pressure1); - Serial.println("adcValue #2: " + pressure2); - Serial.println("******************************"); - - float newMotorSpeed = 0; - if (isnan(newMotorSpeed)) { - Serial.println("Failed to read from DHT sensor!"); + + if (((float)abs(pressure1 - PRESSURE1GOAL)/(float)PRESSURE1GOAL) <= 0.15){ + pressure1status = "LEFT GOAL REACHED"; } else { - motorSpeed = newMotorSpeed; - Serial.println(motorSpeed); + pressure1status = "not yet..."; + } + + if (((float)abs(pressure2 - PRESSURE2GOAL)/(float)PRESSURE2GOAL) <= 0.15){ + pressure2status = "RIGHT GOAL REACHED"; } + else { + pressure2status = "not yet..."; + } + } } \ No newline at end of file