WiFiManager: Config Portal fails but Auto Connect works

Basic Infos

wifiManager.setTimeout(120); if (!wifiManager.startConfigPortal(“OnDemandAP”))

Hardware

WiFimanager Branch/Release:

  • [x ] Master
  • Development

Esp8266/Esp32:

  • [x ] ESP8266
  • ESP32

Hardware: ESP-12e, esp01, esp25

  • ESP01
  • ESP12 E/F/S (nodemcu, wemos, feather)
  • Other

ESP Core Version: 2.4.0, staging

  • 2.3.0
  • [x ] 2.4.0
  • staging (master/dev)

Description

If you setup the on demand config portal it will fail to connect to the wifi but changing to auto connect and it will connect just fine.
Problem description

Settings in IDE

Module: NodeMcu, Wemos D1

Additional libraries:

Sketch

#include <FS.h> //this needs to be first, or it all crashes and burns…

#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino

//needed for library #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager #include <WiFi.h> #include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson

//define your default values here, if there are different values in config.json, they are overwritten. char mqtt_server[40]; char mqtt_port[6] = “8080”; char blynk_token[34] = “YOUR_BLYNK_TOKEN”;

IPAddress server(74,125,115,105); // Google

// Initialize the client library WiFiClient client;

//flag for saving data bool shouldSaveConfig = false;

//callback notifying us of the need to save config void saveConfigCallback() { Serial.println(“Should save config”); shouldSaveConfig = true; }

void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println();

//clean FS, for testing //SPIFFS.format();

//read configuration from FS json Serial.println(“mounting FS…”);

if (SPIFFS.begin()) { Serial.println(“mounted file system”); if (SPIFFS.exists(“/config.json”)) { //file exists, reading and loading Serial.println(“reading config file”); File configFile = SPIFFS.open(“/config.json”, “r”); if (configFile) { Serial.println(“opened config file”); size_t size = configFile.size(); // Allocate a buffer to store contents of the file. std::unique_ptr<char[]> buf(new char[size]);

    configFile.readBytes(buf.get(), size);
    StaticJsonDocument<500> jsonBuffer;
    auto error = deserializeJson(jsonBuffer, buf.get());
    if (error)
    {
      Serial.print(F("deserializeJson() failed with code "));
      Serial.println(error.c_str());
      return;
    }
    else
    {
      Serial.println(F("deserializeJson() successful:"));

      serializeJsonPretty(jsonBuffer, Serial);
      Serial.println();

      strcpy(mqtt_server, jsonBuffer["mqtt_server"]);
      strcpy(mqtt_port, jsonBuffer["mqtt_port"]);
      strcpy(blynk_token, jsonBuffer["blynk_token"]);
     }
    configFile.close();
  }
}

} else { Serial.println(“failed to mount FS”); } //end read

// The extra parameters to be configured (can be either global or just in the setup) // After connecting, parameter.getValue() will get you the configured value // id/name placeholder/prompt default length WiFiManagerParameter custom_mqtt_server(“server”, “mqtt server”, mqtt_server, 40); WiFiManagerParameter custom_mqtt_port(“port”, “mqtt port”, mqtt_port, 6); WiFiManagerParameter custom_blynk_token(“blynk”, “blynk token”, blynk_token, 32);

//WiFiManager //Local intialization. Once its business is done, there is no need to keep it around WiFiManager wifiManager; //wifiManager.resetSettings();

//set config save notify callback wifiManager.setSaveConfigCallback(saveConfigCallback);

//set static ip //wifiManager.setSTAStaticIPConfig(IPAddress(10, 0, 1, 99), IPAddress(10, 0, 1, 1), IPAddress(255, 255, 255, 0));

//add all your parameters here wifiManager.addParameter(&custom_mqtt_server); wifiManager.addParameter(&custom_mqtt_port); wifiManager.addParameter(&custom_blynk_token);

//reset settings - for testing //wifiManager.resetSettings();

//set minimu quality of signal so it ignores AP’s under that quality //defaults to 8% //wifiManager.setMinimumSignalQuality();

//sets timeout until configuration portal gets turned off //useful to make it all retry or go to sleep //in seconds //wifiManager.setTimeout(120);

//fetches ssid and pass and tries to connect //if it does not connect it starts an access point with the specified name //here “AutoConnectAP” //and goes into a blocking loop awaiting configuration wifiManager.setTimeout(120); if (!wifiManager.startConfigPortal(“OnDemandAP”)) //if (!wifiManager.autoConnect(“OnDemandAP”)) { Serial.println(“failed to connect and hit timeout”); delay(3000); //reset and try again, or maybe put it to deep sleep ESP.reset(); delay(5000); }

while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect delay(1000); Serial.print(“.”); }

//if you get here you have connected to the WiFi Serial.println(“connected…yeey 😃”);

//read updated parameters strcpy(mqtt_server, custom_mqtt_server.getValue()); strcpy(mqtt_port, custom_mqtt_port.getValue()); strcpy(blynk_token, custom_blynk_token.getValue());

//save the custom parameters to FS if (shouldSaveConfig) { Serial.println(“saving config”);

StaticJsonDocument<500> jsonBuffer;
jsonBuffer["mqtt_server"] = mqtt_server;
jsonBuffer["mqtt_port"] = mqtt_port;
jsonBuffer["blynk_token"] = blynk_token;


File configFile = SPIFFS.open("/config.json", "w");
if (!configFile)
{
  Serial.println("failed to open config file for writing");
}

serializeJson(jsonBuffer, Serial);
Serial.println();
serializeJson(jsonBuffer, configFile);
configFile.close();
//end save

}

Serial.println(“local ip”); Serial.println(WiFi.localIP()); Serial.println(“Connected to wifi”); Serial.println(“\nStarting connection…”); // if you get a connection, report back via serial: if (client.connect(server, 80)) { Serial.println(“connected”); // Make a HTTP request: client.println(“GET /search?q=arduino HTTP/1.0”); client.println(); } else { Serial.println(“Failed…”); } }

void loop() { // put your main code here, to run repeatedly: }


mounting FS...
mounted file system
reading config file
opened config file
deserializeJson() successful:
{
  "mqtt_server": "192.168.0.99",
  "mqtt_port": "8080",
  "blynk_token": "1A"
}
*WM: Adding parameter
*WM: server
*WM: Adding parameter
*WM: port
*WM: Adding parameter
*WM: blynk
*WM:
*WM: Configuring access point... 
*WM: OnDemandAP
*WM: AP IP address: 
*WM: 192.168.4.1
*WM: HTTP server started
failed to connect and hit timeout

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1392, room 16
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld

messages here


About this issue

Most upvoted comments

I also suggest you use the development branch now