From 966464cd2effcb136017f3011768469642347c58 Mon Sep 17 00:00:00 2001 From: Alessevan <44125445+Alessevan@users.noreply.github.com> Date: Thu, 17 Apr 2025 11:55:33 +0200 Subject: [PATCH] feat: improvements --- prog/prog.ino | 138 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 131 insertions(+), 7 deletions(-) diff --git a/prog/prog.ino b/prog/prog.ino index 8766946..b4254f2 100644 --- a/prog/prog.ino +++ b/prog/prog.ino @@ -10,17 +10,85 @@ const int SDL = 22; const int SDA2 = 21; // useless in the code const int minHeight = 50; -const int maxHeight = 455; +const int maxHeight = 445; -int minServo = 30; -int maxServo = 60; +int minServo = 0; +int maxServo = 180; int lastAngle = -1; float curHeight = 50; float targetHeight = 250; -float equilibrium = 0; +int equilibrium = 0; +int error = 0; + +#include <WiFi.h> +#include <AsyncTCP.h> +#include <ESPAsyncWebServer.h> + +// Replace with your network credentials +const char* ssid = "ESP_ping"; +const char* password = "pong"; + +const char* PARAM_INPUT_1 = "output"; +const char* PARAM_INPUT_2 = "state"; + +// Create AsyncWebServer object on port 80 +AsyncWebServer server(80); + +const char index_html[] PROGMEM = R"rawliteral( +<!DOCTYPE HTML><html> +<head> + <title>ESP 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;} + h2 {font-size: 3.0rem;} + 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 {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>ESP Web Server</h2> + %BUTTONPLACEHOLDER% +<script> + +function sendSliderValue(element) { + var slider1 = document.getElementById("slider1"); + var xhr = new XMLHttpRequest(); + xhr.open("GET", "/update?output="+slider1.id+"&state=" + slider1.value, 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 += "<div class=\"slidecontainer\"><input type=\"range\" min=\"20\" max=\"450\" value=\"250\" class=\"slider\" id=\"slider1\" onchange=\"sendSliderValue(this.value)\"\"></div>"; + buttons += "<div class=\"slidecontainer\"><input type=\"range\" min=\"20\" max=\"450\" value=\"250\" class=\"slider\" id=\"slider2\" onchange=\"sendSliderValue(this.value)\"\"></div>"; + buttons += "<div class=\"slidecontainer\"><input type=\"range\" min=\"20\" max=\"450\" value=\"250\" class=\"slider\" id=\"slider3\" onchange=\"sendSliderValue(this.value)\"\"></div>"; + buttons += "<div class=\"slidecontainer\"><input type=\"range\" min=\"20\" max=\"450\" value=\"250\" class=\"slider\" id=\"slider4\" onchange=\"sendSliderValue(this.value)\"\"></div>"; + buttons += "<div class=\"slidecontainer\"><input type=\"range\" min=\"20\" max=\"450\" value=\"250\" class=\"slider\" id=\"slider5\" onchange=\"sendSliderValue(this.value)\"\"></div>"; + + + return buttons; + } + return String(); +} auto mesureHeight(){ VL53L0X_RangingMeasurementData_t measure; @@ -41,11 +109,54 @@ auto mesureHeight(){ } } +int requestedValue = 250; + +void wifisetup() { + Serial.print("Setting AP (Access Point)…"); + WiFi.softAP(ssid); + + IPAddress IP = WiFi.softAPIP(); + Serial.print("AP IP address: "); + Serial.println(IP); + + // 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(PARAM_INPUT_1) && request->hasParam(PARAM_INPUT_2)) { + inputMessage1 = request->getParam(PARAM_INPUT_1)->value(); + inputMessage2 = request->getParam(PARAM_INPUT_2)->value(); + requestedValue = 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 setup() { Serial.begin(115200); // Starts the serial communication while (! Serial) { delay(1); } + + wifisetup(); + servo1.attach(servoPin); Serial.println("Adafruit VL53L0X test"); @@ -57,7 +168,7 @@ void setup() { Serial.println("Setuping"); servo1.write(minServo); - delay(2000); + delay(5000); float h = mesureHeight(); if (h < maxHeight) { Serial.println("CHANGE FAN SPEED"); @@ -91,9 +202,22 @@ void loop() { float h = mesureHeight(); Serial.print("Measure = "); Serial.println(h); - if (abs(h - targetHeight) > 1.0f) { - servo1.write(equilibrium + 5); + int angle = 0; + if (abs(h - requestedValue) > 5.0f) { + Serial.println("HEYEYEYEYEYEYEY"); + angle = equilibrium + ((h - requestedValue) * 1 / (7)); + } else if (abs(h - requestedValue) > 2.0f) { + angle = equilibrium + ((h - requestedValue) * 1 / (7)); + } else { + error = 0; + angle = equilibrium; } + error += requestedValue - h; + Serial.print("angle = "); + Serial.print(angle); + Serial.print("; equilibrium = "); + Serial.println(equilibrium); + servo1.write(min(max(angle, minServo), maxServo)); delay(1); } \ No newline at end of file