Как сохранить переменную с плавающей запятой в EEPROM

Это мой первый пост здесь, и я надеюсь, что здесь найдутся любители Arduino, которые мне помогут.

Кто-нибудь здесь знает, как сохранить переменную с плавающей запятой непосредственно в eeprom? Если да, то вы могли бы взглянуть на программу, которую я написал, и, надеюсь, вы сможете объяснить, как она будет настроена для работы с двумя другими переменными, которые я сохраняю в eeprom. Программа, которую я написал, отображает вольтметр на ЖК-дисплее. В программе предусмотрена регулируемая уставка сигнализации, определяющая, когда подавать сигнал тревоги, когда напряжение падает ниже заданного пользователем порога срабатывания сигнализации. Я хочу иметь возможность объявить заданное значение сигнализации как переменную с плавающей запятой и сохранить ее непосредственно в EEPROM. Кажется, я не могу найти ни одной программы, которую я мог бы использовать в качестве примера, чтобы попытаться понять, как это сделать.

Мне удалось заставить мою программу работать над сохранением моей Volt_Alarm_Set_Point, объявив ее как переменную int, а затем сравнив ее с моей Volt_Set_Point (объявленной как переменная с плавающей точкой) до 165 операторов if, чтобы сохранить правильное значение Volt_Alarm_Set_Point. И это работает отлично, но занимает 4956 байт программного пространства. Это нормально, если я использую Arduino Mega, но мне бы хотелось, чтобы моя программа запускалась на Arduino Nano, что может вызвать проблемы с некоторыми более крупными программами.

Если бы кто-нибудь здесь мог показать мне, как это сделать, я был бы очень признателен, и я был бы в вашем отделе. Вот мой код ниже. Я не понимаю, как здесь можно разместить код? На других форумах очень легко публиковать код, но я не могу разобраться с этим. Извини за это... Спасибо Джесси

 #include <EEPROM.h> 
 #include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x27, 20, 4);

//----------Код вольтметра----------//
    int analogInput = A6;                                         
    float vout = 0.0;         
    float vin = 0.0;
    float R1 = 99300.0;
    float R2 = 9970.0; 
    int value = 0;
//----------Код вольтметра----------//

  int Volt_Alarm_Set_Point; // это работает
  float Volt_Set_Point;
// плавающее значение Volt_Alarm_Set_Point; // это не работает
  int s = 0;
  int a = 0;
  int b = 0;

 int Button_1 = 5;
 int Button_2 = 6; 
 int Button_3 = A1;
 int Button_4 = A0;
 int Alarm_Relay_1 = A3;
 int Relay_2 = A2; 
 int Relay_3 = 8;
 int Blinking_Led = 3;// этот готов к использованию в любое время

 #define VOLT_ALARM_SET_POINT_ADDR 0
 #define A_ADDR VOLT_ALARM_SET_POINT_ADDR + sizeof(int) 
 #define B_ADDR A_ADDR + sizeof(int) 

 #define Is_Pressed  0  // используется для кнопок
 #define Is_Turned_On 1  // используется для реле
 #define Is_Turned_Off 0 // используется для реле

 //|---------void setup---------void setup---------|//
void setup() {

    pinMode(Alarm_Relay_1, OUTPUT);
    pinMode(Relay_2, OUTPUT);
    pinMode(Relay_3, OUTPUT);
    pinMode(Blinking_Led, OUTPUT); 
    pinMode(Button_1, INPUT); // на контакте 5
    pinMode(Button_2, INPUT); // на контакте 6
    pinMode(Button_3, INPUT); // на контакте A1
    pinMode(Button_4, INPUT); // на выводе A0
//-----------Код вольтметра--------------//
    pinMode(analogInput, INPUT);
//-----------Код вольтметра--------------//

    lcd.begin();    

    lcd.setCursor(0, 0);
    lcd.print(F("  This Program Is   ")); 
    lcd.setCursor(0, 1);                 
    lcd.print(F("to try and save a   "));
    lcd.setCursor(0, 2);                
    lcd.print(F("float variable      "));
    lcd.setCursor(0, 3);                                    
    lcd.print(F("to the eeprom       "));       
    delay(500);

    lcd.clear();

    EEPROM.get(VOLT_ALARM_SET_POINT_ADDR, Volt_Alarm_Set_Point);
    EEPROM.get(A_ADDR, a); 
    EEPROM.get(B_ADDR, b); 
// EEPROM.put( VOLT_ALARM_SET_POINT_ADDR, Volt_Alarm_Set_Point);
// EEPROM.put(A, a);
// EEPROM.put(B, b);

}// конец установки void()

//|---------void setup---------void setup---------|//
//|---------void цикл ---------void цикл ---------|//

void loop() {

    delay(50);
  //приращение & уменьшить Volt_Alarm_Set_Point
    if (digitalRead(Button_1)==Is_Pressed 
      ||digitalRead(Button_2)==Is_Pressed)  
      {Adjust_The_Volt_Alarm_Set_Point();}  

    Read_Volt_Meter();
    //Умножить_By_0_Point_1;
    Display_A_Float_Voltage_Reference();

    lcd.setCursor(0, 0); 
    lcd.print(F("This is the Volt adj")); 
    lcd.setCursor(0, 1); 
    lcd.print(F("Volt Set Pnt = ")); 

    if (Volt_Alarm_Set_Point<=9){
    lcd.setCursor(16, 1); 
    lcd.print(" ");}
    lcd.setCursor(15, 1); 
    lcd.print(Volt_Set_Point);  

    lcd.setCursor(0,2); 
    lcd.print(F("VoltageX= "));   
    lcd.setCursor(10, 2); 
    lcd.print(vin); 

    if (Volt_Alarm_Set_Point<=9){
    lcd.setCursor(17, 2); 
    lcd.print(" ");}
    lcd.setCursor(16, 2); 
    lcd.print(Volt_Alarm_Set_Point);           

    if (vin < Volt_Set_Point){digitalWrite(Relay_3, Is_Turned_On);}   
    if (vin > Volt_Set_Point){digitalWrite(Relay_3, Is_Turned_Off);} 

    lcd.setCursor(0, 3);lcd.print("A = ");lcd.setCursor(4, 3);lcd.print(a); 
    lcd.setCursor(6, 3);lcd.print("B = ");lcd.setCursor(11, 3);lcd.print(b);         

    if (a==0) {digitalWrite(Relay_2, Is_Turned_Off);}
    if (a==1) {digitalWrite(Relay_2, Is_Turned_On);}

    if (b==0) {digitalWrite(Alarm_Relay_1, Is_Turned_Off);}
    if (b==1) {digitalWrite(Alarm_Relay_1, Is_Turned_On);}

    if (digitalRead(Button_4)==Is_Pressed){
      if (a==0){a=1;}else{a=0;}
      while (digitalRead(Button_4)==Is_Pressed){
      if (a==0) {digitalWrite(Relay_2, Is_Turned_Off);}
      if (a==1) {digitalWrite(Relay_2, Is_Turned_On);}        
      lcd.setCursor(0, 3);lcd.print("A = ");lcd.setCursor(4,3);lcd.print(a); 
      lcd.setCursor(6, 3);lcd.print("B = ");lcd.setCursor(11,3);lcd.print(b);            
      }
      EEPROM.put(A_ADDR, a); EEPROM.put(B_ADDR, b);
    }    

    if (digitalRead(Button_3)==Is_Pressed){
     if (b==0){b=1;}else{b=0;}
     while (digitalRead(Button_3)==Is_Pressed){
     if (b==0) {digitalWrite(Alarm_Relay_1, Is_Turned_Off);}
     if (b==1) {digitalWrite(Alarm_Relay_1, Is_Turned_On);}        
     lcd.setCursor(0, 3);lcd.print("A = ");lcd.setCursor(4,3);lcd.print(a); 
     lcd.setCursor(6, 3);lcd.print("B = ");lcd.setCursor(11,3);lcd.print(b);            
     }
     EEPROM.put(A_ADDR, a); EEPROM.put(B_ADDR, b);
    }     
  }// конец цикла void()

//|---------void цикл ---------void цикл ---------|//
//======= Область подпрограммы ======= Область подпрограммы =======//
///*
void Display_A_Float_Voltage_Reference()
{
if (Volt_Alarm_Set_Point==0){Volt_Set_Point=0.00;}// этот код использует 165 операторов if для 4956 байт программного пространства и 4 байт динамической памяти.
if (Volt_Alarm_Set_Point==1){Volt_Set_Point=0.10;} 
if (Volt_Alarm_Set_Point==2){Volt_Set_Point=0.20;} 
if (Volt_Alarm_Set_Point==3){Volt_Set_Point=0.30;} 
if (Volt_Alarm_Set_Point==4){Volt_Set_Point=0.40;} 
if (Volt_Alarm_Set_Point==5){Volt_Set_Point=0.50;} 
if (Volt_Alarm_Set_Point==6){Volt_Set_Point=0.60;} 
if (Volt_Alarm_Set_Point==7){Volt_Set_Point=0.70;} 
if (Volt_Alarm_Set_Point==8){Volt_Set_Point=0.80;} 
if (Volt_Alarm_Set_Point==9){Volt_Set_Point=0.90;} 
if (Volt_Alarm_Set_Point==10){Volt_Set_Point=1.00;} 

if (Volt_Alarm_Set_Point==11){Volt_Set_Point=1.10;} 
if (Volt_Alarm_Set_Point==12){Volt_Set_Point=1.20;} 
if (Volt_Alarm_Set_Point==13){Volt_Set_Point=1.30;} 
if (Volt_Alarm_Set_Point==14){Volt_Set_Point=1.40;} 
if (Volt_Alarm_Set_Point==15){Volt_Set_Point=1.50;} 
if (Volt_Alarm_Set_Point==16){Volt_Set_Point=1.60;} 
if (Volt_Alarm_Set_Point==17){Volt_Set_Point=1.70;} 
if (Volt_Alarm_Set_Point==18){Volt_Set_Point=1.80;} 
if (Volt_Alarm_Set_Point==19){Volt_Set_Point=1.90;} 
if (Volt_Alarm_Set_Point==20){Volt_Set_Point=2.00;}

if (Volt_Alarm_Set_Point==21){Volt_Set_Point=2.10;} 
if (Volt_Alarm_Set_Point==22){Volt_Set_Point=2.20;} 
if (Volt_Alarm_Set_Point==23){Volt_Set_Point=2.30;} 
if (Volt_Alarm_Set_Point==24){Volt_Set_Point=2.40;} 
if (Volt_Alarm_Set_Point==25){Volt_Set_Point=2.50;} 
if (Volt_Alarm_Set_Point==26){Volt_Set_Point=2.60;} 
if (Volt_Alarm_Set_Point==27){Volt_Set_Point=2.70;} 
if (Volt_Alarm_Set_Point==28){Volt_Set_Point=2.80;} 
if (Volt_Alarm_Set_Point==29){Volt_Set_Point=2.90;} 
if (Volt_Alarm_Set_Point==30){Volt_Set_Point=3.00;}

if (Volt_Alarm_Set_Point==31){Volt_Set_Point=3.1;} 
if (Volt_Alarm_Set_Point==32){Volt_Set_Point=3.2;} 
if (Volt_Alarm_Set_Point==33){Volt_Set_Point=3.3;} 
if (Volt_Alarm_Set_Point==34){Volt_Set_Point=3.4;} 
if (Volt_Alarm_Set_Point==35){Volt_Set_Point=3.5;} 
if (Volt_Alarm_Set_Point==36){Volt_Set_Point=3.6;} 
if (Volt_Alarm_Set_Point==37){Volt_Set_Point=3.7;} 
if (Volt_Alarm_Set_Point==38){Volt_Set_Point=3.8;} 
if (Volt_Alarm_Set_Point==39){Volt_Set_Point=3.9;} 
if (Volt_Alarm_Set_Point==40){Volt_Set_Point=4.0;}

if (Volt_Alarm_Set_Point==41){Volt_Set_Point=4.1;} 
if (Volt_Alarm_Set_Point==42){Volt_Set_Point=4.2;} 
if (Volt_Alarm_Set_Point==43){Volt_Set_Point=4.3;} 
if (Volt_Alarm_Set_Point==44){Volt_Set_Point=4.4;} 
if (Volt_Alarm_Set_Point==45){Volt_Set_Point=4.5;} 
if (Volt_Alarm_Set_Point==46){Volt_Set_Point=4.6;} 
if (Volt_Alarm_Set_Point==47){Volt_Set_Point=4.7;} 
if (Volt_Alarm_Set_Point==48){Volt_Set_Point=4.8;} 
if (Volt_Alarm_Set_Point==49){Volt_Set_Point=4.9;} 
if (Volt_Alarm_Set_Point==50){Volt_Set_Point=5.0;}

if (Volt_Alarm_Set_Point==51){Volt_Set_Point=5.1;} 
if (Volt_Alarm_Set_Point==52){Volt_Set_Point=5.2;} 
if (Volt_Alarm_Set_Point==53){Volt_Set_Point=5.3;} 
if (Volt_Alarm_Set_Point==54){Volt_Set_Point=5.4;} 
if (Volt_Alarm_Set_Point==55){Volt_Set_Point=5.5;} 
if (Volt_Alarm_Set_Point==56){Volt_Set_Point=5.6;} 
if (Volt_Alarm_Set_Point==57){Volt_Set_Point=5.7;} 
if (Volt_Alarm_Set_Point==58){Volt_Set_Point=5.8;} 
if (Volt_Alarm_Set_Point==59){Volt_Set_Point=5.9;} 
if (Volt_Alarm_Set_Point==60){Volt_Set_Point=6.0;}

if (Volt_Alarm_Set_Point==61){Volt_Set_Point=6.1;} 
if (Volt_Alarm_Set_Point==62){Volt_Set_Point=6.2;} 
if (Volt_Alarm_Set_Point==63){Volt_Set_Point=6.3;} 
if (Volt_Alarm_Set_Point==64){Volt_Set_Point=6.4;} 
if (Volt_Alarm_Set_Point==65){Volt_Set_Point=6.5;} 
if (Volt_Alarm_Set_Point==66){Volt_Set_Point=6.6;} 
if (Volt_Alarm_Set_Point==67){Volt_Set_Point=6.7;} 
if (Volt_Alarm_Set_Point==68){Volt_Set_Point=6.8;} 
if (Volt_Alarm_Set_Point==69){Volt_Set_Point=6.9;} 
if (Volt_Alarm_Set_Point==70){Volt_Set_Point=7.0;}

if (Volt_Alarm_Set_Point==71){Volt_Set_Point=7.1;} 
if (Volt_Alarm_Set_Point==72){Volt_Set_Point=7.2;} 
if (Volt_Alarm_Set_Point==73){Volt_Set_Point=7.3;} 
if (Volt_Alarm_Set_Point==74){Volt_Set_Point=7.4;} 
if (Volt_Alarm_Set_Point==75){Volt_Set_Point=7.5;} 
if (Volt_Alarm_Set_Point==76){Volt_Set_Point=7.6;} 
if (Volt_Alarm_Set_Point==77){Volt_Set_Point=7.7;} 
if (Volt_Alarm_Set_Point==78){Volt_Set_Point=7.8;} 
if (Volt_Alarm_Set_Point==79){Volt_Set_Point=7.9;} 
if (Volt_Alarm_Set_Point==80){Volt_Set_Point=8.0;}

if (Volt_Alarm_Set_Point==81){Volt_Set_Point=8.1;} 
if (Volt_Alarm_Set_Point==82){Volt_Set_Point=8.2;} 
if (Volt_Alarm_Set_Point==83){Volt_Set_Point=8.3;} 
if (Volt_Alarm_Set_Point==84){Volt_Set_Point=8.4;} 
if (Volt_Alarm_Set_Point==85){Volt_Set_Point=8.5;} 
if (Volt_Alarm_Set_Point==86){Volt_Set_Point=8.6;} 
if (Volt_Alarm_Set_Point==87){Volt_Set_Point=8.7;} 
if (Volt_Alarm_Set_Point==88){Volt_Set_Point=8.8;} 
if (Volt_Alarm_Set_Point==89){Volt_Set_Point=8.9;} 
if (Volt_Alarm_Set_Point==90){Volt_Set_Point=9.0;}

if (Volt_Alarm_Set_Point==91){Volt_Set_Point=9.1;} 
if (Volt_Alarm_Set_Point==92){Volt_Set_Point=9.2;} 
if (Volt_Alarm_Set_Point==93){Volt_Set_Point=9.3;} 
if (Volt_Alarm_Set_Point==94){Volt_Set_Point=9.4;} 
if (Volt_Alarm_Set_Point==95){Volt_Set_Point=9.5;} 
if (Volt_Alarm_Set_Point==96){Volt_Set_Point=9.6;} 
if (Volt_Alarm_Set_Point==97){Volt_Set_Point=9.7;} 
if (Volt_Alarm_Set_Point==98){Volt_Set_Point=9.8;} 
if (Volt_Alarm_Set_Point==99){Volt_Set_Point=9.9;} 
if (Volt_Alarm_Set_Point==100){Volt_Set_Point=10.0;}

if (Volt_Alarm_Set_Point==101){Volt_Set_Point=10.1;} 
if (Volt_Alarm_Set_Point==102){Volt_Set_Point=10.2;} 
if (Volt_Alarm_Set_Point==103){Volt_Set_Point=10.3;} 
if (Volt_Alarm_Set_Point==104){Volt_Set_Point=10.4;} 
if (Volt_Alarm_Set_Point==105){Volt_Set_Point=10.5;} 
if (Volt_Alarm_Set_Point==106){Volt_Set_Point=10.6;} 
if (Volt_Alarm_Set_Point==107){Volt_Set_Point=10.7;} 
if (Volt_Alarm_Set_Point==108){Volt_Set_Point=10.8;} 
if (Volt_Alarm_Set_Point==109){Volt_Set_Point=10.9;} 
if (Volt_Alarm_Set_Point==110){Volt_Set_Point=11.0;}

if (Volt_Alarm_Set_Point==111){Volt_Set_Point=11.1;} 
if (Volt_Alarm_Set_Point==112){Volt_Set_Point=11.2;} 
if (Volt_Alarm_Set_Point==113){Volt_Set_Point=11.3;} 
if (Volt_Alarm_Set_Point==114){Volt_Set_Point=11.4;} 
if (Volt_Alarm_Set_Point==115){Volt_Set_Point=11.5;} 
if (Volt_Alarm_Set_Point==116){Volt_Set_Point=11.6;} 
if (Volt_Alarm_Set_Point==117){Volt_Set_Point=11.7;} 
if (Volt_Alarm_Set_Point==118){Volt_Set_Point=11.8;} 
if (Volt_Alarm_Set_Point==119){Volt_Set_Point=11.9;} 
if (Volt_Alarm_Set_Point==120){Volt_Set_Point=12.0;}

if (Volt_Alarm_Set_Point==121){Volt_Set_Point=12.1;} 
if (Volt_Alarm_Set_Point==122){Volt_Set_Point=12.2;} 
if (Volt_Alarm_Set_Point==123){Volt_Set_Point=12.3;} 
if (Volt_Alarm_Set_Point==124){Volt_Set_Point=12.4;} 
if (Volt_Alarm_Set_Point==125){Volt_Set_Point=12.5;} 
if (Volt_Alarm_Set_Point==126){Volt_Set_Point=12.6;} 
if (Volt_Alarm_Set_Point==127){Volt_Set_Point=12.7;} 
if (Volt_Alarm_Set_Point==128){Volt_Set_Point=12.8;} 
if (Volt_Alarm_Set_Point==129){Volt_Set_Point=12.9;} 
if (Volt_Alarm_Set_Point==130){Volt_Set_Point=13.0;}

if (Volt_Alarm_Set_Point==131){Volt_Set_Point=13.1;} 
if (Volt_Alarm_Set_Point==132){Volt_Set_Point=13.2;} 
if (Volt_Alarm_Set_Point==133){Volt_Set_Point=13.3;} 
if (Volt_Alarm_Set_Point==134){Volt_Set_Point=13.4;} 
if (Volt_Alarm_Set_Point==135){Volt_Set_Point=13.5;} 
if (Volt_Alarm_Set_Point==136){Volt_Set_Point=13.6;} 
if (Volt_Alarm_Set_Point==137){Volt_Set_Point=13.7;} 
if (Volt_Alarm_Set_Point==138){Volt_Set_Point=13.8;} 
if (Volt_Alarm_Set_Point==139){Volt_Set_Point=13.9;} 
if (Volt_Alarm_Set_Point==140){Volt_Set_Point=14.0;}


if (Volt_Alarm_Set_Point==141){Volt_Set_Point=14.1;} 
if (Volt_Alarm_Set_Point==142){Volt_Set_Point=14.2;} 
if (Volt_Alarm_Set_Point==143){Volt_Set_Point=14.3;} 
if (Volt_Alarm_Set_Point==144){Volt_Set_Point=14.4;} 
if (Volt_Alarm_Set_Point==145){Volt_Set_Point=14.5;} 
if (Volt_Alarm_Set_Point==146){Volt_Set_Point=14.6;} 
if (Volt_Alarm_Set_Point==147){Volt_Set_Point=14.7;} 
if (Volt_Alarm_Set_Point==148){Volt_Set_Point=14.8;} 
if (Volt_Alarm_Set_Point==149){Volt_Set_Point=14.9;} 
if (Volt_Alarm_Set_Point==150){Volt_Set_Point=15.0;}

} // конец void Display_A_Float_Voltage_Reference()
//*/

  void Adjust_The_Volt_Alarm_Set_Point() 
 { s=0;
  // нажмите кнопку, чтобы увеличить заданное значение сигнализации
  if (digitalRead(Button_2) == Is_Pressed) 
     { s=1;   
      if (Volt_Alarm_Set_Point <= 150)
      { 
       Volt_Alarm_Set_Point = Volt_Alarm_Set_Point  + 1;// в этой строке используется переменная int
       if (Volt_Alarm_Set_Point > 150)
          {Volt_Alarm_Set_Point = 150;}
      }
     }
 // нажмите кнопку, чтобы уменьшить это заданное значение сигнализации
  if (digitalRead(Button_1) == Is_Pressed) 
    { s=1; 
     Volt_Alarm_Set_Point = Volt_Alarm_Set_Point  - 1;// в этой строке используется переменная int
     if (Volt_Alarm_Set_Point <= 0)
     {Volt_Alarm_Set_Point = 0;}
    }
    if (s==1){EEPROM.put( VOLT_ALARM_SET_POINT_ADDR,Volt_Alarm_Set_Point);}
 }


void Read_Volt_Meter() 
{
   //-------------------------------Код вольтметра-------------- -----------------//
   //-----------------------------------// Этот код считывает значение по аналогу
   value = analogRead(analogInput);//---// вход A6 и здесь мы можем изменить
   vout = (value * 4.72) / 1024.0;//----// значение напряжения соответствует фактическому питанию
   vin = vout / (R2/(R1+R2));//---------// напряжение равно, проверив его с помощью
   if (vin<0.09) {//--------------------// точный цифровой измеритель Votl, затем ввод
   vin=0.0;//---------------------------// это здесь-->(значение * 4.79) изменение 4.79
   }//----------------------------------// всему, что показывает ваш счетчик...
   //-------------------------------Код вольтметра-------------- -----------------//
}
//======= Область подпрограммы ======= Область подпрограммы =======//
// завершаем область подпрограммы
// конец программы...

, 👍3

Обсуждение

Похоже на Volt_Set_Point = Volt_Alarm_Set_Point/10.0; :), @Mikael Patel

Почему бы вам просто не использовать EEPROM.put() и EEPROM.get() в качестве числа с плавающей запятой?, @Edgar Bonet

@EdgarBonet - Для меня это что-то новое. Спасибо!, @LegitimateWorkUser


3 ответа


7

Поскольку в вашем значении с плавающей запятой всегда используется только одна цифра после запятой, почему бы не умножить его на 10 и не поместить в целое число? Для значения до 15,0 (в результате получается 150 int) вы можете использовать простой байт и сохранить его непосредственно в EEPROM.

Тогда вы сможете избавиться от всех операторов if.

Чтобы сделать формулу более удобной, вы даже можете добавить округление (например, добавив + 0,5 перед преобразованием в целое число).

Таким образом: EEPROM.put(VOLT_ALARM_SET_POINT_ADDR, (байт) (значение * 10,0 + 0,5);

И чтобы получить значение: EEPROM.get(VOLT_ALARM_SET_POINT_ADDR, f); f = (float) (f / 10,0);

,

4

@Мишель Кейзерс

Я пытался использовать предложенный вами код, но мне не удалось правильно настроить его для работы в моем коде. Хотя я благодарен вам за ответ. Мне удалось найти способ сохранить значение моей переменной с плавающей запятой в целое число, и это работает хорошо. Ниже я прикрепляю рабочую программу, поэтому, если кто-нибудь когда-нибудь погуглит вопрос, который я задавал, он найдет это, и, надеюсь, это будет для них полезно, потому что это работает...

    {
        // эта программа использует 6986 байт программного пространства
    // старая программа со всеми операторами if использовала 11872 байта
    // Эта программа использует на 4886 байт меньше программного пространства для выполнения той же задачи
     
     #include <EEPROM.h> 
     #include <LiquidCrystal_I2C.h>
     LiquidCrystal_I2C lcd(0x27, 20, 4);
    
    //----------Код вольтметра----------//
        int analogInput = A6;                                         
        float vout = 0.0;         
        float vin = 0.0;
        float R1 = 99300.0;
        float R2 = 9970.0; 
        int value = 0;
    //----------Код вольтметра----------//
    
      int Volt_Alarm_Set_Point; // это работает
      float Volt_Set_Point;
      int s = 0;
      int a = 0;
      int b = 0;
    
     int Button_1 = 5;
     int Button_2 = 6; 
     int Button_3 = A1;
     int Button_4 = A0;
     int Alarm_Relay_1 = A3;
     int Relay_2 = A2; 
     int Relay_3 = 8;
     int Blinking_Led = 3;// этот готов к использованию в любое время
    
     #define VOLT_ALARM_SET_POINT_ADDR 0
     #define A_ADDR VOLT_ALARM_SET_POINT_ADDR + sizeof(int) 
     #define B_ADDR A_ADDR + sizeof(int) 
    
     #define Is_Pressed  0  // используется для кнопок
     #define Is_Not_Pressed  1  // используется для кнопок
     #define Is_Turned_On 1  // используется для реле
     #define Is_Turned_Off 0 // используется для реле
    
     //|---------void setup---------void setup---------|//
    void setup() {
    
        pinMode(Alarm_Relay_1, OUTPUT);
        pinMode(Relay_2, OUTPUT);
        pinMode(Relay_3, OUTPUT);
        pinMode(Blinking_Led, OUTPUT); 
        pinMode(Button_1, INPUT); // на контакте 5
        pinMode(Button_2, INPUT); // на контакте 6
        pinMode(Button_3, INPUT); // на контакте A1
        pinMode(Button_4, INPUT); // на выводе A0
    //-----------Код вольтметра--------------//
        pinMode(analogInput, INPUT);
    //-----------Код вольтметра--------------//
    
        lcd.begin();    
    
        lcd.setCursor(0, 0);
        lcd.print(F(" This Program Is an ")); 
        lcd.setCursor(0, 1);                 
        lcd.print(F("example on how to   "));
        lcd.setCursor(0, 2);                
        lcd.print(F("save a float. Named "));
        lcd.setCursor(0, 3);                                    
        lcd.print(F("Save_Float_Using_Int"));       
        delay(3500);
    
        lcd.clear();
    
        EEPROM.get(VOLT_ALARM_SET_POINT_ADDR, Volt_Alarm_Set_Point);
        EEPROM.get(A_ADDR, a); 
        EEPROM.get(B_ADDR, b); 
    
    }// конец установки void()
    
    //|---------void setup---------void setup---------|//
    //|---------void цикл ---------void цикл ---------|//
    
    void loop() {
    
        delay(50);
      //приращение & уменьшить Volt_Alarm_Set_Point
        if (digitalRead(Button_1)==Is_Pressed 
          ||digitalRead(Button_2)==Is_Pressed)  
          {Adjust_The_Volt_Alarm_Set_Point();}
           
        Volt_Set_Point = Volt_Alarm_Set_Point*0.1;// эта математическая операция отображает правильное плавающее значение на ЖК-дисплее
    
        Read_Volt_Meter();
    
        lcd.setCursor(0, 0); 
        lcd.print(F("This is the Volt adj")); 
    
        if (Volt_Set_Point<10.00)// этот оператор if избавляет от оставшихся нежелательных #
        {lcd.setCursor(19, 1);   // при уменьшении переменной Volt_Set_Point
        lcd.print(" ");}
        lcd.setCursor(0, 1); 
        lcd.print(F("Volt Set Pnt = "));
        lcd.setCursor(15, 1); 
        lcd.print(Volt_Set_Point); // 2-я строка ЖК-дисплея (отображает переменную с плавающей запятой)
    
        lcd.setCursor(0,2); 
        lcd.print(F("Voltage = "));   
        lcd.setCursor(10, 2); 
        lcd.print(vin);
        if (Volt_Alarm_Set_Point<10)//этот оператор if избавляет от оставшихся нежелательных #
        {lcd.setCursor(17, 2);      // при уменьшении переменной Volt_Alarm_Set_Point
        lcd.print(" ");}
        if (Volt_Alarm_Set_Point<100)// этот оператор if избавляет от оставшихся нежелательных #
        {lcd.setCursor(18, 2);       // при уменьшении переменной Volt_Alarm_Set_Point
        lcd.print("  ");}        
        lcd.setCursor(16, 2); 
        lcd.print(Volt_Alarm_Set_Point);  // 3-я строка ЖК-дисплея (отображает сохраненную целочисленную переменную)
                  
        if (vin <= Volt_Set_Point){digitalWrite(Relay_3, Is_Turned_On);}   
        if (vin > Volt_Set_Point){digitalWrite(Relay_3, Is_Turned_Off);} 
    
        lcd.setCursor(0, 3);lcd.print("A = ");lcd.setCursor(4, 3);lcd.print(a); 
        lcd.setCursor(6, 3);lcd.print("B = ");lcd.setCursor(10, 3);lcd.print(b);         
    
        if (a==0) {digitalWrite(Relay_2, Is_Turned_Off);}
        if (a==1) {digitalWrite(Relay_2, Is_Turned_On);}
    
        if (b==0) {digitalWrite(Alarm_Relay_1, Is_Turned_Off);}
        if (b==1) {digitalWrite(Alarm_Relay_1, Is_Turned_On);}
    
        if (digitalRead(Button_4)==Is_Pressed){
          if (a==0){a=1;}else{a=0;}
          while (digitalRead(Button_4)==Is_Pressed){
          if (a==0) {digitalWrite(Relay_2, Is_Turned_Off);}
          if (a==1) {digitalWrite(Relay_2, Is_Turned_On);}        
          lcd.setCursor(0, 3);lcd.print("A = ");lcd.setCursor(4,3);lcd.print(a);            
          }
          EEPROM.put(A_ADDR, a); EEPROM.put(B_ADDR, b);
        }    
    
        if (digitalRead(Button_3)==Is_Pressed){
         if (b==0){b=1;}else{b=0;}
         while (digitalRead(Button_3)==Is_Pressed){
         if (b==0) {digitalWrite(Alarm_Relay_1, Is_Turned_Off);}
         if (b==1) {digitalWrite(Alarm_Relay_1, Is_Turned_On);}         
         lcd.setCursor(6, 3);lcd.print("B = ");lcd.setCursor(10,3);lcd.print(b);            
         }
         EEPROM.put(A_ADDR, a); EEPROM.put(B_ADDR, b);
        }     
      }// конец цикла void()
    
    //|---------void цикл ---------void цикл ---------|//
    //======= Область подпрограммы ======= Область подпрограммы =======//
    
      void Adjust_The_Volt_Alarm_Set_Point() 
     { s=0;
      // нажмите кнопку, чтобы увеличить заданное значение сигнализации
      if (digitalRead(Button_2) == Is_Pressed) 
         { s=1;   
          if (Volt_Alarm_Set_Point <= 150)
          { 
           Volt_Alarm_Set_Point = Volt_Alarm_Set_Point + 1;// в этой строке используется переменная int
           if (Volt_Alarm_Set_Point > 150)
              {Volt_Alarm_Set_Point = 150;}
          }
         }
     // нажмите кнопку, чтобы уменьшить это заданное значение сигнализации
      if (digitalRead(Button_1) == Is_Pressed) 
        { s=1;
         Volt_Alarm_Set_Point = Volt_Alarm_Set_Point - 1;// в этой строке используется переменная int
         if (Volt_Alarm_Set_Point <= 0)
         {Volt_Alarm_Set_Point = 0;}     
        }// здесь переменная s гарантирует, что мы сохраним один раз & только при нажатии кнопки
        if (s==1){EEPROM.put( VOLT_ALARM_SET_POINT_ADDR,Volt_Alarm_Set_Point);}
     }
    
    
    void Read_Volt_Meter() 
    {
       //-------------------------------Код вольтметра-------------- -----------------//
       //-----------------------------------// Этот код считывает значение по аналогу
       value = analogRead(analogInput);//---// вход A6 и здесь мы можем изменить
       vout = (value * 4.72) / 1024.0;//----// значение напряжения соответствует фактическому питанию
       vin = vout / (R2/(R1+R2));//---------// напряжение равно, проверив его с помощью
       if (vin<0.09) {//--------------------// точный цифровой измеритель Votl, затем ввод
       vin=0.0;//---------------------------// это здесь-->(значение * 4.79) изменение 4.79
       }//----------------------------------// всему, что показывает ваш счетчик...
       //-------------------------------Код вольтметра-------------- -----------------//
    }
    //======= Область подпрограммы ======= Область подпрограммы =======//
    // завершаем область подпрограммы
    // конец программы...
    }
,

-1

Это универсальные функции, которые вы сможете использовать где угодно.

Вызовите эту функцию, используя SaveFloat(ваше число с плавающей запятой); например SaveFloat (12.34); или вызовите float yourfloat = LoadFloat();

void SaveFloat (float input) { 

  String valstring = String(input);

  int digitcount = 0;

  for (int index = 0; index < valstring.length(); index++) {

    if (String(valstring.charAt(index)) != ".") {

      String temp = String(valstring.charAt(index));
      int digit = temp.toInt();

      EEPROM.update(index + 10, digit); // Измените + 10 на любой адрес, который вы хотите использовать в качестве начального адреса. например, + 11 будет EEPROM.read(11);

    } else {

      EEPROM.update(index + 10, 254); // Измените + 10 на любой адрес, который вы хотите использовать в качестве начального адреса. например, + 11 будет EEPROM.read(11);

    }

    digitcount++;

  }

  EEPROM.update(9, digitcount); //Этот адрес важен, поэтому установите для него адрес, который вы не используете.

}

float LoadFloat () {            

  String output = "";

  for (int index = 0; index < EEPROM.read(//где вы сохранили "digitcount"); index++) {

    if (EEPROM.read (index + 10) < 10) { // Измените + 10 на любой адрес, который вы хотите использовать в качестве начального адреса. например, + 11 будет EEPROM.read(11);

      output += EEPROM.read (index + 10); // Измените + 10 на любой адрес, который вы хотите использовать в качестве начального адреса. например, + 11 будет EEPROM.read(11);

    } else {

      output += ".";

    }

  }

  return output.toFloat();

}
,

Почему вы выполняете все эти бесполезные и сложные преобразования двоичного кода ↔ текста ↔ BCD только для сохранения значения? Почему бы не сохранить его как есть, в двоичном виде? Например, void SaveFloat(float x){EEPROM.put(10,x);} и float LoadFloat(){float x;return EEPROM.get(10,x);}, @Edgar Bonet