Blynk + WiFiManager

Hello, first time posting here so I hope I’m not breaking any rules but I can’t find the answer to what I’m doing.

I have my NodeMCU setup to control a Garage Door through Blynk and I’m wanting to expand it so I can load a few different NodeMCU’s and give them to family/friends. What I want to do is use WiFiManager to input the Blynk Auth Token and Wifi Credentials to connect. Right now this is what I have and my Serial monitor prompts me with the Blynk splash and says “Connecting to My SSID” but thats as far as it gets.

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

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

    #include <BlynkSimpleEsp8266.h>

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

    #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 blynk_token[34] = "Enter Blynk Token"

    //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(9600);
      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);
            DynamicJsonBuffer jsonBuffer;
            JsonObject& json = jsonBuffer.parseObject(buf.get());
            json.printTo(Serial);
            if (json.success()) {
              Serial.println("\nparsed json");
    
              //strcpy(mqtt_server, json["mqtt_server"]);
              //strcpy(mqtt_port, json["mqtt_port"]);
              strcpy(blynk_token, json["blynk_token"]);
    
            } else {
              Serial.println("failed to load json config");
            }
          }
        }
      } 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, 33);

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

      //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.autoConnect("GarageDoor");
      if (!wifiManager.autoConnect("AutoConnectAP", "password")) {
        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);
      }

      //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");
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.createObject();
        //json["mqtt_server"] = mqtt_server;
        //json["mqtt_port"] = mqtt_port;
        json["blynk_token"] = blynk_token;

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

        json.printTo(Serial);
        json.printTo(configFile);
        configFile.close();
        //end save
      }

      Serial.println("local ip");
      Serial.println(WiFi.localIP());
      Blynk.config(blynk_token);
      Blynk.begin(blynk_token, WiFi.SSID().c_str(), WiFi.psk().c_str());
    }

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

And this is what I get in Serial Monitor

*WM: Connecting to new AP
*WM: Connecting as wifi client...
*WM: Connection result: 
*WM: 3
Should save config
*WM: 
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Already connected. Bailing out.
*WM: IP Address:
*WM: 192.168.0.117
connected...yeey :)
saving config
{"blynk_token":"REMOVED"}local ip
192.168.0.117
[130666] 
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ v0.4.10 on NodeMCU

[130818] Connecting to Chill Point

This is essentially the code taken right from github, but it is not working as intended. All I’m looking to do is use WiFimanager to use saved credentials on startup(Auth, SSID, Pass) after setting them on the first boot. It works to log into the WiFi and enter in the credentials and then connects but seems to stall when it gets to the Blynk side of things. Any ideas would be helpful!

1 Like

Hello here is my basic code for dht22:

/*
    Value Display widget attached to V5
    Value Display widget attached to V6
 *************************************************************/

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>  
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
//char auth[] = "";
char blynk_token[] = "token_number";

// Your WiFi credentials.
// Set password to "" for open networks.
//char ssid[] = "wifi_name";
//char pass[] = "wifi_pass";

#define DHTPIN 2          // What digital pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11     // DHT 11
#define DHTTYPE DHT22   // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21   // DHT 21, AM2301

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;

// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void sendSensor()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite(V5, h);
  Blynk.virtualWrite(V6, t);
}

void setup()
{
  // Debug console
  Serial.begin(115200);
// wifi
  WiFiManager wifiManager;
  wifiManager.autoConnect("AutoConnectAP", "ronin");
  Serial.println("baglanti tamam :)");
   WiFiManagerParameter custom_blynk_token("Blynk", "blynk token", blynk_token, 33);
   wifiManager.addParameter(&custom_blynk_token);
   wifiManager.autoConnect("Blynk");
    Blynk.config(custom_blynk_token.getValue());
  // wifi endz

//  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);

  dht.begin();

  // Setup a function to be called every second
  timer.setInterval(2000L, sendSensor);
}

void loop()
{
  Blynk.run();
  timer.run();
}

i asked before community and users said ok for ap mode and if you wanna see here is the link for github page which one im using

2 Likes

There are a lot of WiFiManager threads on this forum, but it still took me a little while to figure out a similar problem last week, so I’m going to be kinder than RTFM.

Your problem might be because Blynk.begin(...), wifiManager.autoConnect("GarageDoor"), and !wifiManager.autoConnect("AutoConnectAP", "password") are all trying to connect to WiFi. The first autoconnect is unnecessary as it is triggered in the very next line (with error handling). On the Blynk side, no need to connect to WiFi, so replace

 Blynk.begin(blynk_token, WiFi.SSID().c_str(), WiFi.psk().c_str());

with the (untested) code below. The important part is to use Blynk.connect() instead of Blynk.begin(...). I haven’t flashed a sketch that uses it yet, but someone will slap my hand if it’s wrong.

//Connect to blink using an already-open internet connection and preset configuration
if(!Blynk.connect()) {
   Serial.println("Blynk connection timed out.");
   //handling code (reset esp?)
}
1 Like

Wow… I seriously overcomplicated this problem… Thank you for the help!!

My 2 cents for what its worth:

As @ThisIsntFunny said, remove

wifiManager.autoConnect("GarageDoor");

Aslo remove

Serial.println("local ip");
Serial.println(WiFi.localIP());
Blynk.config(blynk_token);
Blynk.begin(blynk_token, WiFi.SSID().c_str(), WiFi.psk().c_str());

and replace with

Blynk.config(blynk_token);
bool result = Blynk.connect(180);

if (result != true)
{
  Serial.println("BLYNK Connection Fail");
  wifiManager.resetSettings();
  ESP.reset();
  delay (5000);
}
else
{
  Serial.println("BLYNK Connected");
}

Also Change

WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 33);

with

WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

Hopefully that gets it working.

2 Likes

So it seems to be working on initial startup, but when/if the connection drops and it tries to reconnect it isn’t applying the auth token properly and I get an invalid auth token response? any ideas?

What solution did you use. Please post your updated code.

Sorry I guess that would be helpful.

char blynk_token[] = token_number;

void setup() {
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial.begin(9600); // Starts the serial communication
  WiFiManager wifiManager;
  //wifiManager.resetSettings();
  WiFiManagerParameter custom_blynk_token("Blynk", "blynk token", blynk_token, 34);
  wifiManager.addParameter(&custom_blynk_token);
  wifiManager.autoConnect("GarageDoor");
  Serial.println(custom_blynk_token.getValue());
  Blynk.config(custom_blynk_token.getValue());
}

I am not familiar with doing it that way. Maybe try using the technique I provided. Otherwise you will have to wait for assistance from @Ronin.

The code from @Ronin will not store the token after a power failure or reset. The original code you posted using SPIFFS and JSON is – albeit a bit overkill – for this purpose. The token is stored in the flash memory using SPIFFS and tokenized using JSON. Theoretically you can use SPIFFS to store and retrieve only the Blynk token in the config file and remove all of the JSON stuff.

I am storing multiple parameters for a future local server and plan to use JSON elsewhere, so there is low overhead to me using it here.

2 Likes

I tried the other solution and it works perfectly, with storing the value and everything. Thank you very much all of you. This was a learning opportunity for me!

Can you share your code?

You already have a topic asking this… not need to reopen old topics.