• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Запись значений типа float в eeprom из WEB-интерфейса

Thorn

New member
Доброго времени Наваял простенький инкубатор для дома на 10 яиц :) с контролем температуры, влажности и вращения. Однако в силу неполного знания web интерфейс получился простенький и значения которые я могу записать в EEPROM для использования могут быть только строковые целочисленные типа int . При этом выводить на страничку значения температуры в float я могу/
Я так понял проблема в этом кусочке кода:
Код:
//////////////////////////////////
///  used for error checking   ///
//////////////////////////////////

boolean isValidNumber(String str) {
  for (byte i = 0; i < str.length(); i++)
  {
    if (isDigit(str.charAt(i))) return true;
  }
  return false;
}

////////////////////////////////////////////////////////////////////
// handler for web server request: http://IpAddress/submit        //
////////////////////////////////////////////////////////////////////

void handle_submit() {
  webMessage = "";
////////////////////////////////////////////////////////////////////
//***Контроллер Вкл\Выкл
  if (server.args() > 0 ) {
    for ( uint8_t i = 0; i < server.args(); i++ ) {
//***Контроллер Вкл\Выкл
      if (server.argName(i) == "powerOn") {
        if (server.arg(i) != "")
        {
          if (isValidNumber(server.arg(i)) )
            powerOn = server.arg(i).toInt();
          else
            webMessage += "Power On-Off must be a number<br>";
        }
        else
          webMessage += "Power On-Off is required<br>";
      }
////////////////////////////////////////////////////////////////////
//***Обогрев Вкл\Выкл     
      if (server.argName(i) == "heatOn_") {
        if (server.arg(i) != "")
        {
          if (isValidNumber(server.arg(i)) )
            heatOn_ = server.arg(i).toInt();
          else
            webMessage += "Heat On must be a number<br>";
        }
        else
          webMessage += "Heat On is required<br>";
      }
      if (server.argName(i) == "heatOff_") {
        if (server.arg(i) != "")
        {
          if (isValidNumber(server.arg(i)) )
            heatOff_ = server.arg(i).toInt();
          else
            webMessage += "Heat Off must be a number<br>";
        }
        else
          webMessage += "Heat Off is required<br>";
      }
    if (webMessage == ""){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  EEPROM.write(10, powerOn);        //Запись значения ВКЛЮЧЕНИЕ/ВыКЛЮЧЕНИЕ контроллера
//  EEPROM.write(11, heatOn_);       //Запись значения температуры на ВКЛЮЧЕНИЕ обогрева
//  EEPROM.write(12, heatOff_);      //Запись значения температуры на ВыКЛЮЧЕНИЕ обогрева
  EEPROM_float_write(50, heatOn_);
  EEPROM_float_write(60, heatOff_);
  EEPROM.write(21, humiOn);        //Запись значения на ВКЛЮЧЕНИЕ вентилятора
  EEPROM.write(22, humiOff);       //Запись значения на ВыКЛЮЧЕНИЕ вентилятора
//  EEPROM.write(21, fanOn);        //Запись значения на ВКЛЮЧЕНИЕ вентилятора
//  EEPROM.write(22, fanOff);       //Запись значения на ВыКЛЮЧЕНИЕ вентилятора
  EEPROM.commit();                //Окончание работы после записи с EPROM модуля esp8266
      setRtc(seconds, minutes, hours, day, date, month, year);
//     void setRtc(byte seconds, byte minutes, byte hours, byte day, byte date, byte month, byte year);
   
    }
  }
  power();
  controlTemp();
  controlHumi();

  setHTML();
  server.send(200, "text/html", webString);            // send to someones browser when asked
  delay(100);
}
А в частности в строке
if (isValidNumber(server.arg(i)) )
heatOn_ = server.arg(i).toInt();

- выручайте братцы, как привести в божеский вид и сохранять температуру с десятыми/.
ps - при записи и чтении float в EEPROM использую две функции и они полностью рабочие:
Код:
void EEPROM_float_write(int addr, float val_){     //Запись в ЕЕПРОМ
скрин с проектом прилагаю ,

  EEPROM.begin(512);                              //Начало работы с EEPROM модуля esp8266
  byte *x = (byte *)&val_;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
    EEPROM.commit();                              //Окончание работы после записи с EPROM модуля esp8266
}

float EEPROM_float_read(int addr){               //Чтение из ЕЕПРОМ
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
    EEPROM.commit();                //Окончание работы после записи с EPROM модуля esp8266
  return y[0];
}
 

Вложения

Сергей_Ф

Moderator
Команда форума
@Thorn зачем вам float? Умножьте температуру на 10 или на 100 и сохраняйте в int32 и даже int16 хватит
 

Thorn

New member
гм, тоже вариант - просто решил что на будущее неплохо будет иметь решение именно работать с float напрямую и в web и в коде. Щас к примеру попробую пермножением\делением но всёже вдруг ветку прочитают знающие и уже сталкивающиеся с подобным.
 

Сергей_Ф

Moderator
Команда форума
@Thorn, советую избегать float, где только возможно. Микроконтроллеры не имеют сопроцессора и обрабатывают его черезвычайно медленно. Они не для этого сделаны.
 

Thorn

New member
Я Вас понял, оставлю его пожалуй лишь в процедуре конвертации температуры с ds18b20 пожалуй
 
Сверху Снизу