gpt4 book ai didi

c++ - 如何避免使用 EEPROM 而不是闪存?

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:12 24 4
gpt4 key购买 nike

A 用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com