Термостат. Замена srting

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021


Доброго времени суток!
Есть вэб термостат, который срабатывает при достижении определенной температуры. Хотелось бы по максимуму избежать стрингов. Например возьмём строку 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% &deg;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);
    }
  }
}

 

 
b707
Offline
Зарегистрирован: 26.05.2017

Adolf_Balalaykin пишет:



 Хотелось бы по максимуму избежать стрингов.

с какой целью?
Библиотека <ESPAsyncWebServer.h> целиком построена на Стрингах, избежать их, не выкинув эту библиотеку - у вас не получится.
Поэтому потрудитесь четче сформулировать. что именно вы хотите.
kalapanga
Offline
Зарегистрирован: 23.10.2016

Adolf_Balalaykin пишет:

Хотелось бы по максимуму избежать стрингов. 

Можно спросить - а с какой целью?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уже двое задали вопрос, который и у меня сразу же возник. Подпишусь, почитаю ответы :-)

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

AlexGyver пишет:

Избегайте глобальных String – если строку нужно “собрать” и отправить – делайте это локально: строка удалится из памяти после закрывающей фигурной скобки. Источник https://alexgyver.ru/lessons/strings/

inputMessage как раз мой случай. Локально не получится. Вот я и подумал что может есть другой путь отличный от тяжелого стринга?

b707
Offline
Зарегистрирован: 26.05.2017

вы на вопрос так и не ответили - с какой целью вы избавляетесь от Стринг? Что-то не работает? Или просто потому, что гайвер посоветовал? Если последнее - то почему бы вам не пойти с этим вопросом на его форум - здесь, знаете ли, гайвер совсем не авторитет и обсуждать его "рекомендации" вряд ли имеет смысл.

Adolf_Balalaykin пишет:

inputMessage как раз мой случай. Локально не получится. Вот я и подумал что может есть другой путь отличный от тяжелого стринга?

прямо наслоение бреда в несколько слоев. Я уже написал, что у вас библиотека возвращает String - а значит отказаться от String вы не можете и никакого "другого пути" у вас нет. А вот сделать эту переменную локальной - как раз можно. Но снова встает вопрос - "Зачем?"

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
у вас библиотека возвращает String - а значит отказаться от String вы не можете
Так может человек вопросы задаёт, чтобы и библиотеку, заодно, переделать?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

b707 пишет:

вы на вопрос так и не ответили - с какой целью вы избавляетесь от Стринг? Что-то не работает? 

Нет задачи избавится совсем, ищу приемлемое решение. Вы меня убедили еще в первом ответе. Это скорее ответы на ваши  наводящие вопросы.
К слову, я тут кроме прочего, еще в паралельной теме столкнулся с проблемой task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/uptime. Сделал функцию, в которой текстовые строки вывел в массив,  проблема ушла.

ЕвгенийП пишет:

Так может человек вопросы задаёт, чтобы и библиотеку, заодно, переделать?

Сарказм понятен. Рано мне еще из песочницы вылазить, а тем более в чужие библиотеки лезть. Я еще на том уровне когда читают буквари, впитываю и пытаюсь вникнуть в советы и ответы форума.