Термостат. Замена srting
- Войдите на сайт для отправки комментариев
Вс, 10/04/2022 - 15:02
Доброго времени суток!
Есть вэб термостат, который срабатывает при достижении определенной температуры. Хотелось бы по максимуму избежать стрингов. Например возьмём строку 18, просто заменить на переменную float не получится. Строки 52 и 106 не аукнутся. Перевести на char? Подскажите как?
#ifdef ESP32 #include <WiFi.h> #include <AsyncTCP.h> #else #include <ESP8266WiFi.h> #include <ESPAsyncTCP.h> #endif #include <ESPAsyncWebServer.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> // Имя и пароль const char* ssid = "uname"; const char* password = "pass"; // Пороговое значение температуры по умолчанию String inputMessage = "25.0"; String lastTemperature; String enableArmChecked = "checked"; String inputMessage2 = "true"; // Веб-страница в формате HTML для обработки 2 полей ввода (threshold_input и enable_arm_input) const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html><head> <title>Temperature Threshold Output Control</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head><body> <h2>DS18B20 Temperature</h2> <h3>%TEMPERATURE% °C</h3> <h2>ESP Arm Trigger</h2> <form action="/get"> Temperature Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br> Arm Trigger <input type="checkbox" name="enable_arm_input" value="true" %ENABLE_ARM_INPUT%><br><br> <input type="submit" value="Submit"> </form> </body></html>)rawliteral"; void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); } AsyncWebServer server(80); // Заменяет заполнитель значения датчика температуры DS18B20 String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return lastTemperature; } else if(var == "THRESHOLD"){ return inputMessage; } else if(var == "ENABLE_ARM_INPUT"){ return enableArmChecked; } return String(); } // Переменная флага для отслеживания того, были ли активированы триггеры или нет bool triggerActive = false; const char* PARAM_INPUT_1 = "threshold_input"; const char* PARAM_INPUT_2 = "enable_arm_input"; // Интервал обновлений показания датчика. unsigned long previousMillis = 0; const long interval = 5000; // GPIO, к которому подключен выход const int output = 2; // GPIO, к которому подключен датчик const int oneWireBus = 4; OneWire oneWire(oneWireBus); DallasTemperature sensors(&oneWire); void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi отказ!"); return; } Serial.println(); Serial.print("ESP IP адрес: http://"); Serial.println(WiFi.localIP()); pinMode(output, OUTPUT); digitalWrite(output, LOW); // Запуск датчика температуры sensors.begin(); // Отправляем веб страницу server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); // Получаем GET запрос по адресу <ESP_IP>/get?threshold_input=<inputMessage>&enable_arm_input=<inputMessage2> server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) { // ПОЛУЧИТЬ значение threshold_input на <ESP_IP>/get?threshold_input=<inputMessage> if (request->hasParam(PARAM_INPUT_1)) { inputMessage = request->getParam(PARAM_INPUT_1)->value(); // ПОЛУЧИТЬ значение enable_arm_input на <ESP_IP>/get?enable_arm_input=<inputMessage2> if (request->hasParam(PARAM_INPUT_2)) { inputMessage2 = request->getParam(PARAM_INPUT_2)->value(); enableArmChecked = "checked"; } else { inputMessage2 = "false"; enableArmChecked = ""; } } Serial.println(inputMessage); Serial.println(inputMessage2); request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home Page</a>"); }); server.onNotFound(notFound); server.begin(); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; sensors.requestTemperatures(); // Замер температуры float temperature = sensors.getTempCByIndex(0); Serial.print(temperature); Serial.println(" *C"); lastTemperature = String(temperature); // Проверка, превышает ли температура пороговое значение и нужно ли запускать выход if(temperature > inputMessage.toFloat() && inputMessage2 == "true" && !triggerActive){ String message = String("Температура выше порогв. Текущая температура: ") + String(temperature) + String("C"); Serial.println(message); triggerActive = true; digitalWrite(output, HIGH); } // Проверка, находится ли температура ниже порогового значения и нужно ли запускать выход else if((temperature < inputMessage.toFloat()) && inputMessage2 == "true" && triggerActive) { String message = String("Температура ниже порога. Текущая температура: ") + String(temperature) + String(" C"); Serial.println(message); triggerActive = false; digitalWrite(output, LOW); } } }
Хотелось бы по максимуму избежать стрингов.
Можно спросить - а с какой целью?
Уже двое задали вопрос, который и у меня сразу же возник. Подпишусь, почитаю ответы :-)
Избегайте глобальных String – если строку нужно “собрать” и отправить – делайте это локально: строка удалится из памяти после закрывающей фигурной скобки. Источник https://alexgyver.ru/lessons/strings/
inputMessage как раз мой случай. Локально не получится. Вот я и подумал что может есть другой путь отличный от тяжелого стринга?
вы на вопрос так и не ответили - с какой целью вы избавляетесь от Стринг? Что-то не работает? Или просто потому, что гайвер посоветовал? Если последнее - то почему бы вам не пойти с этим вопросом на его форум - здесь, знаете ли, гайвер совсем не авторитет и обсуждать его "рекомендации" вряд ли имеет смысл.
inputMessage как раз мой случай. Локально не получится. Вот я и подумал что может есть другой путь отличный от тяжелого стринга?
прямо наслоение бреда в несколько слоев. Я уже написал, что у вас библиотека возвращает String - а значит отказаться от String вы не можете и никакого "другого пути" у вас нет. А вот сделать эту переменную локальной - как раз можно. Но снова встает вопрос - "Зачем?"
вы на вопрос так и не ответили - с какой целью вы избавляетесь от Стринг? Что-то не работает?
Так может человек вопросы задаёт, чтобы и библиотеку, заодно, переделать?
Сарказм понятен. Рано мне еще из песочницы вылазить, а тем более в чужие библиотеки лезть. Я еще на том уровне когда читают буквари, впитываю и пытаюсь вникнуть в советы и ответы форума.