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

maobob 发表于 2020-11-7 15:27

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

我把读写的ROM区从0开始写,每次读写都 正常,只是出现如下的提示。说明的确是内存冲突,只是数据的确会在过程 中被改写。



如果把地址改到从高位开始,怎么都 读写不正常上。不管是地址从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//D1INPUT_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;
      myssid="                              ";//32个空格
      mypass="         ";//11个空格
      strcpy(ssid32,myssid.c_str());//把string赋给char[]
      char pass11;
      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);
}

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;
      strcpy(ssid32,WiFi.SSID().c_str());//把string赋给char[]
      char pass11;
      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 SmartConfigmodel .
   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();
}

maobob 发表于 2020-11-8 10:26

自己解决了,还是对EEPROMi了解造成的。纠错写在另一篇里了

coloz 发表于 2020-11-10 10:12

与blinker无关,建议阅读8266 EEPROM例程

maobob 发表于 2020-11-10 16:36

coloz 发表于 2020-11-10 10:12
与blinker无关,建议阅读8266 EEPROM例程

是的,是对EEPROM理解错了。已解决。
页: [1]
查看完整版本: 关于BLINKER+8266-12,EEPROM读写不正常