今天继续不断的和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以后,就一直是上述的情况。也搞不清是什么问题了。