【问题标题】:How to reconnect esp32 to wifi after getting disconnected temporarily using wifimanager library and not halting如何在使用 wifimanager 库暂时断开连接并且不停止后将 esp32 重新连接到 wifi
【发布时间】:2021-04-11 19:19:56
【问题描述】:

有人可以建议如何在断开一段时间后自动重新连接到最后一个已知的 wifi 网络(通过 wifi 管理器库),并且在连接网络之前不会永远阻塞?

以下代码可以工作,但每次网络丢失或初始化期间未找到网络时都需要重新启动。但是在连接网络之前我无法阻止它,因为我的程序应该在离线和在线模式下运行,即即使没有互联网也可以控制引脚,并且在每个循环中它都会尝试连接到网络。如果网络可用,则使用 Blynk 控制引脚。

#include <WiFi.h>

#include <WiFiClient.h>

#include <WebServer.h> //copiedota
#include <ESPmDNS.h> //copiedota
#include <Update.h> //copiedota


#include <WiFiManager.h>   
#include <ArduinoJson.h>          // https://github.com/bblanchon/ArduinoJson


#include <BlynkSimpleEsp32.h>
BlynkTimer timer;

#define DEBUG_SW 1

// By default the mode is with_internet
int MODE = 0;
bool connected_once = false;

char auth[] = "***";

// Your WiFi credentials.
const char* host = "shariqESP"; //copiedota
// Set password to "" for open networks.

char ssid[] = "rm7pro";

//char ssid[] = "";

char pass[] = <"*****">;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wm;

  wm.setConfigPortalTimeout(40);
  
   //wm.setDebugOutput(true);
  
Serial.printf("SSID0: %s\n", wm.getWiFiSSID().c_str());
String saved_ssid_old =wm.getWiFiSSID().c_str();

  if(!wm.autoConnect("AutoConnectAP")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    //ESP.restart();
    //delay(5000);
  } 
   Serial.printf("SSID1: %s\n", WiFi.SSID().c_str());
   Serial.println("SSID00: " + (String)wm.getWiFiSSID());
   Serial.println( wm.getWiFiIsSaved() );


if(WiFi.SSID().c_str() == ""){

int str_len = saved_ssid_old.length() + 1; 
char char_array[str_len];
// Copy it over 
saved_ssid_old.toCharArray(char_array, str_len);
Serial.println( ssid);

strcpy(ssid , char_array);

}
  
if(WiFi.SSID().c_str() != ""){
    Serial.println("not blank");

  String saved_ssid =WiFi.SSID().c_str();
  String saved_ssid_old =wm.getWiFiSSID().c_str();
  Serial.println(saved_ssid);
  Serial.println( saved_ssid_old );

    //if( !saved_ssid_old.equals(saved_ssid)  ){
      // Length (with one extra character for the null terminator)
      int str_len = saved_ssid.length() + 1; 
  // Prepare the character array (the buffer)
  char char_array[str_len];
   
  // Copy it over 
  saved_ssid.toCharArray(char_array, str_len);
  Serial.println( ssid);
  Serial.println( "different ssid");
  

  memset( ssid,0, sizeof(ssid)) ;
  //char ssid[str_len];
  strcpy(ssid , char_array);


char ssid2[] ="rm7pro";
if ( strcmp(ssid2, ssid) == 0 ) {
  Serial.println( "same ssid"); 

}
else if ( strcmp(ssid2, ssid)  > 0 ){
  Serial.println( "rm7pro is great same ssid"); 

}
else{
   Serial.println( "rm7pro is less same ssid"); 

  }
       
   // }
        
}
Serial.print("Now printing SSID:");
  Serial.println( ssid);

wm.disconnect();
delay(1000);  

   WiFi.begin(ssid, pass);
    Serial.print("main begin ssid:");
    Serial.println(ssid);
    int ct= 0;
      Serial.print("before while ssid:");
    Serial.println(ssid);
    
    while(WiFi.status() != WL_CONNECTED ){
      delay(1000);
      ct=ct+1000;
      if(ct>5000){
        Serial.println("not able to connect to wifi");        
        break;
        }
      }

    Serial.print("after while bfore if ssid:");
    Serial.println(ssid);
    
   if (WiFi.status() == WL_CONNECTED)
  {
     Serial.println( "connected once");
   connected_once = true;
  }
  Serial.print("before while after if ssid:");
    Serial.println(ssid);
  
  //setOTA(); //custom

   Serial.print("End ssid:");
    Serial.println(ssid);
}


void loop()
{
  Serial.println("Loop started");
  Serial.print("Wifi status: ");
  Serial.println(WiFi.status());
   Serial.print("Start ssid:");
    Serial.println(ssid);
  
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(ssid);
    Serial.println(WiFi.SSID().c_str() );
    if (DEBUG_SW) Serial.println("Not Connected");
    
   /* if( connected_once == true){
      Serial.println("Reconnecting");
        WiFi.disconnect();
        delay(1100); //custom

        WiFi.begin(ssid, pass);
    //WiFi.reconnect();
    }
    else{*/
      Serial.println("Re-attempting to connect");
      //WiFi.reconnect();
       WiFi.disconnect();
        delay(500); //custom
        WiFi.begin(ssid, pass);
         delay(1200); //custom
    //  }
  }
  else
  {
    if (DEBUG_SW) Serial.println(" Connected");
    //Blynk.run();
  }
 delay(400); //custom

}

如果你现在观察图像,你会注意到即使提供相同的ssid,esp也无法连接到wifi,它仍然无法连接。

根据我的理解,这很奇怪。

请建议我在这里受到严重打击。

问候, 沙里克

【问题讨论】:

    标签: arduino esp32


    【解决方案1】:

    我意识到问题出在这行 ork 可用,然后使用 Blynk 控制引脚。

        if (WiFi.status() == WL_CONNECTED)
       {
          Serial.println( "connected once");
        connected_once = true;
       }
    
    

    这在某种程度上导致了内存问题。

    我还在循环函数中添加了 while 循环,并带有 10 秒超时计数器以重新连接。

           while(WiFi.status() != WL_CONNECTED)
          {
        delay(1000);
             ct=ct +1000;
        if(ct >11000){
        break;
        }
        
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多