• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 пожалуй
 
Сверху Снизу