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

10-13 06:18