关于BLINKER+8266-12,EEPROM读写不正常

今天继续不断的和Blinker磨合。

又遇新问题

还是昨天那个小项目,本来一直在BLYNK平台上写的,现迁移到Blinker上来,就遇到这个莫名其妙的问题,具体功能我在这里说一下:
1、在设备没有配置时,上电自动进入SmartConfig模式,当配置完成WIFI后,把配置完成的标志位置1,把SSID和password都存到EEPROM里。
2、然后软件重启动,或用户按了我自定义的RESET键就重新启动,重启动时首先读出EEPROM里的帐号和密码进行wifi连接,成功后进入工作模式。

我一直设置读写的ROM区从地址0开始的。每次读写都正常,在刚刚通过SmartConfig配置完成后,重启可以准确的在地址0处读到标识1。只是出现如下的提示。说明是我的ROM使用和Blinker重叠了,而且也的确出现当再次重启后,地址0的标志位就不再是1了,而是随机数了,说明这个地址0的位置 的数据的确会在过程 中被改写。提示如下
在这里插入图片描述
所以,我只好在程序 里把我要用的地址位拉高到4096或更高。结果却奇异的发现,怎么都 读写不正常上。不管是地址从4096开始,8192开始。每次写是第一个标志位flag=1,读出来都是0
下面是我的相关代码。而只要把地址改到0,就第一次读写一定全部正常上。写1,读出来也是1…


```cpp
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <Blinker.h>

#define RESETUP 5  //D1  INPUT_PULLUP 中断 重置和重启


#define DEFSSID "win-elf"
#define DEFPSK "4096"
#define EEPROMBase  //Blinker 要占用0-1279??

char auth[] = "???";

//initializ EEPROM's address and variable
int RelativeAddress=0;  
int flag;               //whether users have input the ssid and password .flag=0 or flag=1
const char* ssid = DEFSSID;
const char* pass = DEFPSK;
String myssid;
String mypass;


//resetup按键的中断处理程序
ICACHE_RAM_ATTR void resetup(){
  if (times>=2){       //该处理是担心2还没有来得及执行,因按键原因又来一个中断出现times=2传入中断。
    times=1;            //当times=2传入后,在这里强制变成1,从头开始算按键时间
  }else{
    times++;
  }
  
  Serial.print("中断启动"+String(times));
  if (times==1){
    timer1=millis();
    Serial.println("timer1="+String(timer1));
  }
  if (times==2){
    timer2=millis();
    Serial.println("timer2="+String(timer2));
    Serial.println("(timer2-timer1)/1000="+String((timer2-timer1)/1000));    
  }
  /
  
  //Cpu will be restart when the time of touched is less than 3 second
  if (times==2 && ((timer2-timer1)/1000)<3){
    Serial.println("《《《《按了重启键,重启》》》》");
    ESP.restart();
  }
  //8266 will be reset when the time of touched is more than 3 second
  if (times==2 && ((timer2-timer1)/1000)>=3){
    //flag=0 ssid='0' pass='0'
    //把wifi帐号密码存入EEPROM 中
      flag=0;
      RelativeAddress=0;  // 相对地址
      char ssid32[32]; 
      myssid="                                ";  //32个空格
      mypass="           ";  //11个空格
      strcpy(ssid32,myssid.c_str());  //把string赋给char[]
      char pass11[11]; 
      strcpy(pass11,mypass.c_str());
      if (EEPROM_write(flag,ssid32,pass11,RelativeAddress))
      {
        Serial.println("《《《《清空配置,重启》》》》");
        ESP.restart();      //重启,可用
      } else {
        Serial.println(">>>>>>存入EEPROM异常!!!>>>>>>>>");
      }
  }
  /
}


void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);
    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}
void myHeartBeat(){
   texCondition.print("在线状态");
     //低电压检测
   if (!digitalRead(LOWVOLTAGE)){
     //通知APP
     texEnergy.print("电量低请充电");
   }else {
     texEnergy.print("电池电量正常");
   }
  
}

boolean EEPROM_write(int flag,char ssid[],char pass[],int address)
{
  EEPROM.begin(128);
  address=EEPROMBase+address; 
  EEPROM.write(address,flag);
  
  for (int i=0;i<strlen(ssid);i++){ //32位长
    address++;
    EEPROM.write(address,ssid);
  }
  for (int j=0;j<strlen(pass);j++){//11位长
    address++;
    EEPROM.write(address,pass[j]);
  }
  
  EEPROM.end();
  delay(1000);
  return(true);
}

String EEPROM_read(int address,int number){
  String result;
  address+=EEPROMBase;
  EEPROM.begin(128);
  for (int i=0;i<number;i++){
    result=result+EEPROM.read(address);
    address++;
  }
  EEPROM.end();
  return (result);
}

void SmartConfig(){
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig...");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
     light(1);                  //delay(500); wait for a second
    if (WiFi.smartConfigDone())
    {

      //把wifi帐号密码存入EEPROM 中
      flag=1;
      RelativeAddress=0;
      char ssid32[32]; 
      strcpy(ssid32,WiFi.SSID().c_str());  //把string赋给char[]
      char pass11[11]; 
      strcpy(pass11,WiFi.psk().c_str());
      if (EEPROM_write(flag,ssid32,pass11,RelativeAddress))
      {
        for (int i=0;i<3;i++){  //提示灯
          light(2);
          delay(800);
        }
        ESP.restart();      //重启,可用
      } else {
        Serial.println(">>>>>>存入EEPROM异常!!!>>>>>>>>");
      }
      
      break;
    }
  }
}
void setup()
{
// Initialize


  
  Serial.begin(115200);
  EEPROM.begin(128);
  flag=EEPROM.read(EEPROMBase);
  EEPROM.end();
  Serial.print("EEPROM flag:");
  Serial.println(flag);
  
  if (flag !=1)
  {
    // IF flag!=1 then set 8266 in SmartConfig  model .
     Serial.println("<<<<<<<现在是【配置】模式>>>>>>>");

     SmartConfig();
                        //     Blinker.begin(auth);   
  }
  
  if (flag==1)
  {
    myssid=EEPROM_read(1,32);  //从第一位读32位
    myssid.trim();
    mypass=EEPROM_read(33,11); //从第33位读11位
    mypass.trim();
    Serial.println("登入的SSID是:"+myssid+"密码是:"+mypass);
    
    ssid = myssid.c_str(); //把string 赋给 char*
    pass = mypass.c_str();
   
    Serial.println("执行BLinker.begin()");
    
    BLINKER_DEBUG.stream(Serial);     
    //BLINKER_DEBUG.debugAll();   
    
    Blinker.begin(auth,ssid,pass);`在这里插入代码片`
    
    Blinker.attachData(dataRead);    

  
    Serial.println("<<<<<<<现在是正常【运行】模式>>>>>>>");
    
    delay(1000); //开机灯亮一秒后,关闭
    light(0);
  }
  

}
void loop()
{
Blinker.run();
}


查了一下,好像有不少人都 和我遇到同样的问题。也有解答说是每次读写都 要加上EEPROM.begin()和EEPROM.end().我也很认真的试了,但似乎都 不行。这个程序,在用BLYNK时一直是正常的。用了BLINKER以后,就一直是上述的情况。也搞不清是什么问题了。

猜你喜欢

转载自blog.csdn.net/weixin_45499326/article/details/109548204
今日推荐