关于BLINKER+8266-12,EEPROM读写不正常-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2044|回复: 3

[过期] 关于BLINKER+8266-12,EEPROM读写不正常

[复制链接]
发表于 2020-11-7 15:27 | 显示全部楼层 |阅读模式
我把读写的ROM区从0开始写,每次读写都 正常,只是出现如下的提示。说明的确是内存冲突,只是数据的确会在过程 中被改写。
blinker提示.png


如果把地址改到从高位开始,怎么都 读写不正常上。不管是地址从4096开始,8192开始。每次写是第一个标志位flag=1,读出来都是0
下面是代码。功能上是在设备没有配置时,进入SmartConfig模式,当配置完成后,把配置完成的标志位置1,把SSID和password都存
到EEPROM里云。然后重启动,或用户按了我自定义的RESET键就重新启动,读出EEPROM里的帐号和密码进行连接,进入工作模式。

看了很多贴子有关于这个问题的,但似乎都 没办法解决我的困惑。这个程序,在用BLYNK时一直是正常上的。用了BLINKER以后,就一直是上述的情况。

#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();
}

 楼主| 发表于 2020-11-8 10:26 | 显示全部楼层
自己解决了,还是对EEPROMi了解造成的。纠错写在另一篇里了
发表于 2020-11-10 10:12 | 显示全部楼层
与blinker无关,建议阅读8266 EEPROM例程
 楼主| 发表于 2020-11-10 16:36 | 显示全部楼层
coloz 发表于 2020-11-10 10:12
与blinker无关,建议阅读8266 EEPROM例程

是的,是对EEPROM理解错了。已解决。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 13:40 , Processed in 0.110319 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表