You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:53:12