your sketch is very large and confusing (at least for me). i would recommend a different debug approach:
create a completely new sketch.
in this new sketch use ONLY the strictly necessary communication part of the code, and with simple timer create just a single "uptime" widget, which sends the hw uptime every second to your phone (use push). and see if it works stable for long time. something like this:
char auth = "xxxxxxxxxx";
Blynk.virtualWrite(V0, millis() / 1000);
yes, this is not for your hw, it is for ble. but you got the idea. try to do something such basic sketch. and see if it works. if you can't get a long uptime with this, it has no reason further complicate your code with irrelevant functions.
if it works, then try to add step by step a little extra functionality, until it begins to behave badly. just add some code, compile, and wait. if it works, ad some more. at the moment it begins to crash, you should look very closely what was added since the last stable version. the bug will be there...
also, other thing: i do not know your hw at all, but once i had a very similar problem, random crashes with arduino + enc28j60 ethernet module. after lots of debugging i just find out, that the power source was poor quality, and the fluctuations caused the ethernet module to crash (the code on the arduino worked ok). and since blynk keeps blocking if there is no internet connection, the whole hw becomes unresponsive. after i replaced the 3.3v source for the enc28j60 module, everything worked ok. i'm not telling this is the same problem as yours, just worth checking, if nothing else helps, to replace the power source.
1) hm, if i compile your sketch for arduino uno (your hw has the same atmega328, so it is basically the same) i've got this:
Sketch uses 26098 bytes (80%) of program storage space. Maximum is 32256 bytes.
Global variables use 1468 bytes (71%) of dynamic memory, leaving 580 bytes for local variables. Maximum is 2048 bytes.
the sketch size is not a problem, but 71% used by global variables is not very good! this CAN cause the random crashes, especially if you are using heap (i do not have the patience to check all your code for this, but you should!)
also, please read this excellent article about mcu memory architecture here:
if you read and understand all chapters, you should have a clear image what i'm trying to explain. also, there is a way to measure / monitor the free sram during runtime, to see if you are actually running out of ram. (if you upgrade to wemos d1 mini pro, as @Costas recommended, you can get rid about the flash / ram problems, because wemos has a lot
2) you should definitely upgrade to latest arduino ide
3) probably it has nothing to do with the current problem, but try to add L after the values bigger than 32000 in your simple timer functions: