今天繼續不斷的和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以后,就一直是上述的情況,也搞不清是什么問題了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/207786.html
標籤:其他
上一篇:手機藍牙控制繼電器實驗
