Как сохранить переменную с плавающей запятой в 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 ответа
Поскольку в вашем значении с плавающей запятой всегда используется только одна цифра после запятой, почему бы не умножить его на 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);
@Мишель Кейзерс
Я пытался использовать предложенный вами код, но мне не удалось правильно настроить его для работы в моем коде. Хотя я благодарен вам за ответ. Мне удалось найти способ сохранить значение моей переменной с плавающей запятой в целое число, и это работает хорошо. Ниже я прикрепляю рабочую программу, поэтому, если кто-нибудь когда-нибудь погуглит вопрос, который я задавал, он найдет это, и, надеюсь, это будет для них полезно, потому что это работает...
{
// эта программа использует 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
}//----------------------------------// всему, что показывает ваш счетчик...
//-------------------------------Код вольтметра-------------- -----------------//
}
//======= Область подпрограммы ======= Область подпрограммы =======//
// завершаем область подпрограммы
// конец программы...
}
Это универсальные функции, которые вы сможете использовать где угодно.
Вызовите эту функцию, используя 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
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Очистка EEPROM
- Spiffs против Eeprom на esp8266
- В ESP8266 EEPROM сохраненные данные отличаются, когда я пытаюсь их прочитать
Похоже на
Volt_Set_Point = Volt_Alarm_Set_Point/10.0;
:), @Mikael PatelПочему бы вам просто не использовать
EEPROM.put()
иEEPROM.get()
в качестве числа с плавающей запятой?, @Edgar Bonet@EdgarBonet - Для меня это что-то новое. Спасибо!, @LegitimateWorkUser