EEPROM存储超255计数数值断电后异常的解决方法求助
问题描述
我有两个按钮,按下第一个按钮时count变量递增,同时将值存入EEPROM以应对断电情况,重启后需从之前存储的count值启动。但当count超过255时,断电重启后会变为0或其他无效值,我每日需要存储1至5000的记录,求助解决方法。
问题根源
Arduino默认的EEPROM.read()和EEPROM.update()仅操作单字节(8位)数据,最大值为255。当count超过255时,写入EEPROM会被截断为低8位(例如256会被存为0,257存为1),导致重启后读取到错误值。
解决方案
利用Arduino EEPROM库提供的get()和put()函数,直接支持多字节数据类型(如int、long)的读写,无需手动拆分字节。这两个函数会自动处理数据的多字节存储与拼接,同时put()内部已实现类似update()的逻辑,仅在数据变化时写入,减少EEPROM磨损。
修改后的完整代码
const int BUTTON1 = 3; // 补充原代码缺失的BUTTON1定义 const int BUTTON2 = 2; //const int BUZZER = 4; int lastState1 = LOW; // 上一次输入引脚状态 int currentState1; // 当前输入引脚读取值 unsigned long pressedTime1 = 0; unsigned long releasedTime1 = 0; const int SHORT_PRESS_TIME1 = 5000; int count = 0, z = 0, p = 0; int ledState; #include<LiquidCrystal.h> #include <EEPROM.h> #include <SPI.h> #include <SD.h> File myFile; LiquidCrystal lcd(5, 6, 7, 8, 9, 10); void configmode(); void setup() { Serial.begin(9600); pinMode(BUTTON1, INPUT); pinMode(BUTTON2, INPUT); //pinMode(BUZZER, OUTPUT); //digitalWrite(BUZZER, LOW); lcd.begin(16, 2); // 从EEPROM读取多字节的count值 EEPROM.get(0, count); lcd.clear(); lcd.setCursor(0,0); lcd.print("NUMBER OF ENTRY"); lcd.setCursor(7,1); lcd.print(count); delay(100); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print("NUMBER OF ENTRY"); lcd.setCursor(7,1); lcd.print(count); delay(100); currentState1 = digitalRead(BUTTON1); if(lastState1 == LOW && currentState1 == HIGH) { // 按钮按下 pressedTime1 = millis(); } else if(lastState1 == HIGH && currentState1 == LOW) { // 按钮释放 releasedTime1 = millis(); long pressDuration1 = releasedTime1 - pressedTime1; if( pressDuration1 < SHORT_PRESS_TIME1 ) { count = count + 1; // 将多字节的count值写入EEPROM EEPROM.put(0, count); } else { lcd.clear(); lcd.setCursor(0,0); lcd.print("Config mode...."); delay(700); configmode(); } } lastState1 = currentState1; if(count > 0) { p = count % z; if(p == 0) { //digitalWrite(BUZZER, HIGH); } else { //digitalWrite(BUZZER, LOW); } } } void configmode() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Config value..."); lcd.setCursor(7,1); lcd.print(z); delay(500); while (true) { int x = digitalRead(BUTTON1); int y = digitalRead(BUTTON2); if(x == HIGH) { z = z + 1; lcd.clear(); lcd.setCursor(0,0); lcd.print("Config value..."); lcd.setCursor(7,1); lcd.print(z); delay(500); if(z == 50) { z = 0; } } if( y == HIGH ) { count = 0; // 重置count后同步写入EEPROM EEPROM.put(0, count); lcd.setCursor(0,0); lcd.print("EXIT CONFIG..."); delay(5000); lcd.clear(); return; } } }
关键修改点
- 补充了原代码中缺失的
BUTTON1引脚定义 - 将
count的读写从单字节的read()/update()替换为多字节的get()/put(),支持存储最大32767的int值(完全覆盖5000的需求) - 在配置模式重置
count时,同步写入EEPROM保证数据一致性
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

