用Arduino MEGA制造了温度传感器设备。用户可以使用按钮更改变量int templimit
。该变量的值被写入EEPROM,因此重启后将保留其最后一个值。我的问题是,每次重新启动都会减少EEPROM的使用寿命。
我的问题:有什么方法可以避免从EEPROM读取/更新并将变量存储在其他内存上?
保存到EEPROM:
void save_to_eeprom(unsigned int address, float config) { // (address, value)
for (byte i = 0; i < sizeof(config); i++) { // size of config is 4
EEPROM.write(address + i, reinterpret_cast<byte*>(&config)[i]);
}
从EEPROM读取:
float read_from_eeprom(unsigned int address) { //(address)
float config;
for (byte i = 0; i < sizeof(config); i++) { // size of config is 4
reinterpret_cast<byte*>(&config)[i] = EEPROM.read(address + i);
}
return config;
}
这是
templimit
重新启动后将保留其最后一个值的方式,完整代码为:#include <EEPROM.h>
// this constant won't change:
const int buttonPin = 8; // up
const int buttonPin1 = 3; // down
const int buttonPin2 = 2; // enter
// Variables will change:
int buttonPushCounter; // counter for the number of button presses
int buttonState;; // up
int buttonState1;; // down
int buttonState2;; // enter
int templimit = read_from_eeprom(20); // temperature limit for alarm
void setup() {
Serial.begin(9600);
Serial.println("Update temperature limit if not wait 10 sec for time out");
updatevalue();
Serial.println("Done");
Serial.println(templimit); // temperature limit for alarm
}
void loop() {
// do nothing
}
int updatevalue(void) {
int timenow;
int timepassed;
int counter = 10;
timenow = millis();
while (buttonState == LOW and buttonState1 == LOW and buttonState2 == LOW) { // this loop is just for 10 sec time out
buttonState2 = digitalRead(buttonPin2); // enter
buttonState = digitalRead(buttonPin); //up
buttonState1 = digitalRead(buttonPin1); // down
timepassed = (millis() - timenow);
delay(1000);
Serial.println(counter--);
if (timepassed >= 10000)
return 0;
}
while (buttonState2 != HIGH) { // do this until enter is pressed
buttonState2 = digitalRead(buttonPin2); // enter
buttonState = digitalRead(buttonPin); //up
buttonState1 = digitalRead(buttonPin1); // down
if (buttonState == HIGH) { // up
buttonPushCounter++;
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
}
if (buttonState1 == HIGH) { // down
buttonPushCounter-- ;
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
}
delay(700);
}
save_to_eeprom(20, buttonPushCounter); // save to address 20 tha value it can be negative
}
我的问题:有什么方法可以避免从EEPROM读取更新?
最佳答案
EEPROM是执行此类操作的正确位置。
(我能想到的唯一选择是闪存,它的写周期更少,因此更糟)
您说“每次重新启动都会减少EEPROM的使用寿命”,这并非完全正确。正是写操作减少了EEPROM的使用寿命。用户按下回车键时,将执行代码中的写操作。因此,您可以在不写入EEPROM的情况下重新启动任意数量的设备。
无论如何,我想如果要在意外重启后保持设置不变,您将无能为力。但是,可能会有一个小的改进:仅当新值与旧值不同时才执行写操作。
EEPROM具有100 000个写周期,因此您应该能够多次更改温度限制而不会出现故障。
关于c++ - 如何避免使用EEPROM代替闪存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41198865/