If you use the blocking Blynk.begin() in your setup() function and the board can’t connect to WiFi / Blynk server, the loop() function will never be executed. Therefore, anything you put there forever won’t run.
There have many discussions about this, you’d better do some more research on this blocking Blynk.begin() and non blocking Blynk.config() + Blynk.connect().
The following code, modified from original code, will show you how to use those functions, and will possibly fix your problems. It also cleans up the loop() and automatically connects / reconnects WiFi and Blynk whenever necessary, in setup() as well as in runtime loop().
#define USE_BLYNK_WM 0 // https://github.com/khoih-prog/Blynk_WM
#include <ArduinoOTA.h>
#if USE_BLYNK_WM
#include <BlynkSimpleEsp8266_WM.h>
#else
#include <BlynkSimpleEsp8266.h>
#endif
//#include <SimpleTimer.h>
#include <ModbusMaster.h>
#include <ESP8266WiFi.h>
#include "settingsPZEM.h"
#include <SoftwareSerial.h> // ( NODEMCU ESP8266 )
SoftwareSerial pzem(D5,D6); // (RX,TX) connect to TX,RX of PZEM for NodeMCU
//SoftwareSerial pzem(D7,D8); // (RX,TX) connect to TX,RX of PZEM
#include <ModbusMaster.h>
ModbusMaster node;
SimpleTimer timer;
#if !USE_BLYNK_WM
//WiFi data
char ssid[] = "****"; //WiFi Credential
char pass[] = "****"; //WiFi Password
char server[] = "****"; //Blynk local server IP address
int port = 8080; //Blynk local port
#define AUTH "****" //PZEM-004v3 Auth code for Blynk Local Server
#endif
int timerTask1;
double U_PR, I_PR, P_PR, PPR, PR_F, PR_PF, PR_alarm;
uint8_t result; uint16_t data[6];
#define UPDATE_INTERVAL_MS 5000
// Use 0 or 1 when you don't need to debug with many messages
#define DEBUG_LOOP 2
#define MODBUS_ID 1
void updateBlynk()
{
getPZEM();
Blynk.virtualWrite(vPIN_VOLTAGE, U_PR);
Blynk.virtualWrite(vPIN_CURRENT_USAGE, I_PR);
Blynk.virtualWrite(vPIN_ACTIVE_POWER, P_PR);
Blynk.virtualWrite(vPIN_ACTIVE_ENERGY, PPR);
Blynk.virtualWrite(vPIN_FREQUENCY, PR_F);
Blynk.virtualWrite(vPIN_POWER_FACTOR, PR_PF);
Blynk.virtualWrite(vPIN_OVER_POWER_ALARM, PR_alarm);
}
uint8_t getPZEM()
{
result = node.readInputRegisters(0x0000, 10);
if (result == node.ku8MBSuccess)
{
U_PR = (node.getResponseBuffer(0x00)/10.0f);
I_PR = (node.getResponseBuffer(0x01)/1000.000f);
P_PR = (node.getResponseBuffer(0x03)/10.0f);
PPR = (node.getResponseBuffer(0x05)/1000.0f);
PR_F = (node.getResponseBuffer(0x07)/10.0f);
PR_PF = (node.getResponseBuffer(0x08)/100.0f);
PR_alarm = (node.getResponseBuffer(0x09));
#if (DEBUG_LOOP > 0)
Serial.print("U_PR: "); Serial.println(U_PR); // V
Serial.print("I_PR: "); Serial.println(I_PR,3); // A
Serial.print("P_PR: "); Serial.println(P_PR); // W
Serial.print("PPR: "); Serial.println(PPR,3); // kWh
Serial.print("PR_F: "); Serial.println(PR_F); // Hz
Serial.print("PR_PF: "); Serial.println(PR_PF);
Serial.print("PR_alarm: "); Serial.println(PR_alarm,0);
Serial.println("====================================================");
#endif
}
#if (DEBUG_LOOP > 0)
else
Serial.println("PZEM: can't get data");
#endif
return result;
}
// Use this to avoid being blocked here if no WiFi
void connectWiFi(const char* ssid, const char* pass)
{
#if (DEBUG_LOOP > 0)
Serial.println("Connecting to " + String(ssid));
#endif
WiFi.mode(WIFI_STA);
if (pass && strlen(pass))
{
WiFi.begin(ssid, pass);
} else
{
WiFi.begin(ssid);
}
int i = 0;
while ((i++ < 30) && (WiFi.status() != WL_CONNECTED))
{
BlynkDelay(500);
}
#if (DEBUG_LOOP > 0)
if (WiFi.status() == WL_CONNECTED)
Serial.println("Connected to " + String(ssid));
else
Serial.println("Can't connect to " + String(ssid));
#endif
}
void connectWiFiAndBlynk()
{
if (WiFi.status() != WL_CONNECTED)
{
connectWiFi(ssid, pass);
}
else
{
#if (DEBUG_LOOP > 0)
Serial.println("Trying connecting to BlynkServer " + String(server));
#endif
Blynk.connect();
if (Blynk.connected())
{
#if (DEBUG_LOOP > 0)
Serial.println("Connected to BlynkServer " + String(server));
#endif
}
}
}
void setup()
{
Serial.begin(115200);
Serial.println("\nStart serial");
pzem.begin(9600);
Serial.println("Start PZEM serial");
node.begin(MODBUS_ID, pzem);
Serial.println("Start PZEM"); // 1 = ID MODBUS
#if USE_BLYNK_WM
Blynk.begin();
#else
// Use this to avoid being blocked here if no WiFi
//connectWiFi(ssid, pass);
Blynk.config(AUTH, server, port);
connectWiFiAndBlynk();
//Blynk.connect();
#endif
ArduinoOTA.setHostname(OTA_HOSTNAME);
ArduinoOTA.begin();
timerTask1 = timer.setInterval(UPDATE_INTERVAL_MS, updateBlynk);
}
void loop()
{
if (Blynk.connected())
{
Blynk.run();
}
else
{
connectWiFiAndBlynk();
}
ArduinoOTA.handle();
timer.run();
}