@matias2k I have a similar problem, I live in China (although I’m British) and the blynk-cloud.com ping value is typically 300ms and can be 2000ms+ at peak times. I am also using NodeMCU’s and I have found, thanks to @Gunner and @Costas, that some form of connection management is essential otherwise everything grinds to a halt.
The other thing suggested by @vshymanskyy is that in this situation you need to increase the BLYNK_TIMEOUT_MS value and decrease the BLYNK_HEARTBEAT value, the default timeout is 3000ms and I’ve increased it to 4500ms, the default heartbeat is 10 seconds and I’ve decreased it to 5 seconds. These values work good for me.
#ifndef BLYNK_TIMEOUT_MS
#define BLYNK_TIMEOUT_MS 4500UL // Blynk config default 3000UL
#endif
#ifndef BLYNK_HEARTBEAT
#define BLYNK_HEARTBEAT 5 // Blynk config default 10
#endif
@Gunner has given you a suggested connection management routine but the one I’m using is from @Costas.
/* NoBlynkBlock.ino by Costas for https://community.blynk.cc/t/blynk-is-blocking-if-internet-is-down/16809
will recover from server or router going down
*/
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char ssid[] = "xxx";
char pass[] = "xxx";
char auth[] = "xxx";
char server[] = "blynk-cloud.com";
BlynkTimer timer;
unsigned int myServerTimeout = 3500; // 3.5s server connection timeout (SCT)
unsigned int myWiFiTimeout = 3200; // 3.2s WiFi connection timeout (WCT)
unsigned int functionInterval = 7500; // 7.5s function call frequency (FCF)
unsigned int blynkInterval = 25000; // 25.0s check server frequency (CSF)
void setup()
{
Serial.begin(115200);
Serial.println();
if(WiFi.status() == 6){
Serial.println("\tWiFi not connected yet.");
}
timer.setInterval(functionInterval, myfunction);// run some function at intervals per functionInterval
timer.setInterval(blynkInterval, checkBlynk); // check connection to server per blynkInterval
unsigned long startWiFi = millis();
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED){
delay(500);
if(millis() > startWiFi + myWiFiTimeout){
Serial.println("\tCheck the WiFi router. ");
break;
}
}
Blynk.config(auth, server);
checkBlynk();
}
void myfunction(){
Serial.println("\tLook, no Blynk block.");
if(WiFi.status()== 3){
Serial.println("\tWiFi still connected.");
}
if(Blynk.connected()){
Blynk.virtualWrite(V11, millis() / 1000);
}
}
void checkBlynk() {
if (WiFi.status() == WL_CONNECTED)
{
unsigned long startConnecting = millis();
while(!Blynk.connected()){
Blynk.connect();
if(millis() > startConnecting + myServerTimeout){
Serial.print("Unable to connect to server. ");
break;
}
}
}
if (WiFi.status() != 3) {
Serial.print("\tNo WiFi. ");
}
Serial.printf("\tChecking again in %is.\n", blynkInterval / 1000);
Serial.println();
}
void loop()
{
if (Blynk.connected()) {Blynk.run();}
timer.run();
}
I live in hope that one day Blynk will have a Cloud Server in China and the Great Firewall of China will no longer be a problem!
EDIT: If you use the above connection management routine from Costas and increase the BLYNK_TIMEOUT_MS to 4500UL then you will need to increase the myServerTimeout to 5000UL.
Richard