I am in the process of migrating my ongoing project to 2.0. I am running 3 Wemos D1 mini clones having used wifi provisioning and Edgent. They are in the same template and uploads are working with Blynk.air. My issue is that they do not re connect after internet loss. Here is what it shows on the serial moniotor.
[58848] RUNNING => CONNECTING_NET
[58848] Connecting to WiFi: NETGEAR83
[88852] CONNECTING_NET => ERROR
The bare bones Edgent does re connect automatically. I guess my next step would be to strip down my sketch and see if I can isolate what causes the issue but I figured I’d post to see if there are some simple things I could try first. The Edgent sketch is a little above my ability level as far as trying to tweak the reconnect function. Any help or input would be greatly appreciated.
// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "xxxxxxx"
#define BLYNK_DEVICE_NAME "Plant Monitoring"
#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG
#define APP_DEBUG
// Uncomment your board, or configure a custom board in Settings.h
//#define USE_SPARKFUN_BLYNK_BOARD
//#define USE_NODE_MCU_BOARD
//#define USE_WITTY_CLOUD_BOARD
#define USE_WEMOS_D1_MINI
#include "BlynkEdgent.h"
#include <WidgetRTC.h>
bool LongHold1=false;
bool LongHold2=false;
bool ButtonPressed1=false;
bool ButtonPressed2=false;
int ButtonTimer1;
int ButtonTimer2;
int pumpPin[5];
int moistureThreshP[5];
int pumpRunTime[5];
int rawRead[5];
int sensorReadMap[5];
int sensorPowerPin[5];
int virtualGraphPin[5];
int virtualRawReadDataPin[5];
int j;
int i;
int k;
String my_h;
String my_m;
String my_s;
String my_D;
String my_M;
String my_Y;
String Weekday;
String Time;
String date1;
BlynkTimer myTimer;
WidgetRTC rtc;
WidgetTerminal terminal(V12);
WidgetLED greenLed1(V52);WidgetLED redLed1(V53);
WidgetLED greenLed2(V57);WidgetLED redLed2(V56);
void setup()
{
Serial.begin(9600);
delay(100);
BlynkEdgent.begin();
myTimer.setTimeout(3600001L,[](){}); //sacrificial timer for timer bug
myTimer.setInterval(10003L, GetTime); // display clock every 10 seconds
myTimer.setInterval((1000L*60L*5L)+17L,sensorRead); //timer for regular reading of moisture level to show on level displays
myTimer.setInterval((1000L*60L*30L)+49L,checkMoisture); //timer to check moisture for watering
pumpPin[1]=D1; //pump pins
pumpPin[2]=D2;
pumpPin[3]=D3;
pumpPin[4]=D3;
sensorPowerPin[1]=D5; //sensor power pins
sensorPowerPin[2]=D6;
sensorPowerPin[3]=D7;
sensorPowerPin[4]=D8;
virtualGraphPin[1]=V0; //virtual pins for moisture level graph in app
virtualGraphPin[2]=V1;
virtualGraphPin[3]=V2;
virtualGraphPin[4]=V3;
virtualRawReadDataPin[1] = V8;
virtualRawReadDataPin[2] = V9;
virtualRawReadDataPin[3] = V8;
virtualRawReadDataPin[4] = V8;
pinMode(A0,INPUT);
pinMode(pumpPin[1],OUTPUT);
pinMode(pumpPin[2],OUTPUT);
pinMode(pumpPin[3],OUTPUT);
pinMode(pumpPin[4],OUTPUT);
pinMode(sensorPowerPin[1],OUTPUT);
pinMode(sensorPowerPin[2],OUTPUT);
pinMode(sensorPowerPin[3],OUTPUT);
pinMode(sensorPowerPin[4],OUTPUT);
}
void loop() {
BlynkEdgent.run();
myTimer.run();
}
void sensorRead(){
digitalWrite(D5,LOW);
digitalWrite(D6,LOW);
delay(500);
Blynk.run();
for (i=1; i<=2; i=i+1){
digitalWrite(sensorPowerPin[i],HIGH);
delay(500);
rawRead[i]=analogRead(A0);
if (i==1){sensorReadMap[i] = map(rawRead[i],415, 266, 1, 100);}
if (i==2){sensorReadMap[i] = map(rawRead[i],415, 266, 1, 100);}
if (i==3){sensorReadMap[i] = map(rawRead[i],769, 209, 1, 100);}
if (i==4){sensorReadMap[i] = map(rawRead[i],769, 380, 1, 100);}
Serial.print(i);Serial.print(" raw read = ");Serial.println(rawRead[i]);
Serial.print("mapped read = ");Serial.println(sensorReadMap[i]);
digitalWrite(sensorPowerPin[i],LOW);
delay(500);
terminal.print(i); terminal.print(" raw read = "); terminal.println(rawRead[i]);
terminal.print("mapped read = ");terminal.println(sensorReadMap[i]);
terminal.flush();
Blynk.run();
Blynk.virtualWrite(virtualGraphPin[i],sensorReadMap[i]);
Blynk.virtualWrite(virtualRawReadDataPin[i],rawRead[i]);
}
}
void checkMoisture(){
Serial.println(" CHECKING MOISTURE !!!");
terminal.println(" Watering Check: ");
date1 = (my_M + " " + my_D + " " + my_Y);
terminal.print(date1);
terminal.print(" ");
terminal.println(Time);
terminal.flush();
for(j = 1; j<=2; j=j+1){
Serial.print("moist. read of plant ");Serial.print(j);Serial.print(" = ");Serial.print(sensorReadMap[j]);Serial.print(" moist. thresh = ");Serial.println(moistureThreshP[j]);
/*terminal.print("moisture plant ");terminal.print(j);terminal.print(" = ");terminal.print(sensorReadMap[j]);terminal.print(" threshold = ");terminal.println(moistureThreshP[j]);terminal.flush();*/
if (sensorReadMap[j]<=moistureThreshP[j] && j==1){pumpOn1();}
if (sensorReadMap[j]<=moistureThreshP[j] && j==2){pumpOn2();}
//if (sensorReadMap[j]<=moistureThreshP[j] && j==3){pumpOn3();}
//if (sensorReadMap[j]<=moistureThreshP[j] && j==4){pumpOn4();}
}
}
//Pump 1 ON/OFF functions
void pumpOn1(){
digitalWrite(pumpPin[1],HIGH);
Blynk.virtualWrite(V2,2); //Pump state toggle manual pump on notification
Serial.print("Pump 1 on");Serial.print(" RunTime= ");Serial.println(pumpRunTime[1]);
terminal.print("P1 on for ");terminal.println(pumpRunTime[1]);terminal.flush();
myTimer.setTimeout(pumpRunTime[1]*1000L,pumpOff1);
}
void pumpOff1(){
Serial.println("pump 1 off");
terminal.println("");terminal.flush();
terminal.print("P1 off ");terminal.flush();
digitalWrite(pumpPin[1],LOW);
Blynk.virtualWrite(V2,0); //Pump state toggle for notification
}
//Pump 2 ON/OFF functions
void pumpOn2(){
digitalWrite(pumpPin[2],HIGH);
Blynk.virtualWrite(V3,2); //Pump state toggle for notification
Serial.print("Pump 2 on");Serial.print(" RunTime= ");Serial.println(pumpRunTime[2]);
terminal.print("P2 on for ");terminal.println(pumpRunTime[2]);terminal.flush();
myTimer.setTimeout(pumpRunTime[2]*1000L,pumpOff2);
}
void pumpOff2(){
Serial.println("pump 2 off");
terminal.print("P2 off ");terminal.flush();
digitalWrite(pumpPin[2],LOW);
Blynk.virtualWrite(V3,0); //Pump state toggle for notification
}
/**************** LOCK UNLOCK 1**************/
BLYNK_WRITE(V50) { // button to be held down to activate
if (param.asInt() and !LongHold1 ) {
ButtonTimer1 = myTimer.setTimeout(1541, LongHoldDetect1); // press 2 sec
ButtonPressed1 = true;
// Button has been released
} else {
ButtonPressed1 = false; // Reset press flag
if (param.asInt()==1) {
digitalWrite(D1,HIGH);
Blynk.virtualWrite(V2,1);} //Pump state toggle for notification
else {digitalWrite(D1,LOW);
Blynk.virtualWrite(V2,0);} //Pump state toggle for notification
// If the long hold function wasn't called, it's a short press.
if (!LongHold1) {
myTimer.deleteTimer(ButtonTimer1); // Kill the long hold timer if it hasn't been activated.
// Reset the long press flag
LongHold1 = false;
greenLed1.off();
redLed1.on();
}
}
}
BLYNK_WRITE(V51) { // Reset button
if (param.asInt()) {
if (LongHold1 = true) {
ButtonPressed1 = false;
LongHold1 = false;
greenLed1.off();
redLed1.on();
}
}
}
/**************** LOCK UNLOCK 2**************/
BLYNK_WRITE(V54) { // button to be held down to activate
if (param.asInt() and !LongHold2 ) {
ButtonTimer2 = myTimer.setTimeout(1537, LongHoldDetect2); // press 2 sec
ButtonPressed2 = true;
// Button has been released
} else {
ButtonPressed2 = false; // Reset press flag
if (param.asInt()==1) {
digitalWrite(D2,HIGH);
Blynk.virtualWrite(V3,1);} //Pump state toggle for notification
else {
digitalWrite(D2,LOW);
Blynk.virtualWrite(V3,0);} //Pump state toggle for notification
// If the long hold function wasn't called, it's a short press.
if (!LongHold2) {
myTimer.deleteTimer(ButtonTimer2); // Kill the long hold timer if it hasn't been activated.
// Reset the long press flag
LongHold2 = false;
greenLed2.off();
redLed2.on();
}
}
}
BLYNK_WRITE(V55) { // Reset button
if (param.asInt()) {
if (LongHold2 = true) {
ButtonPressed2 = false;
LongHold2 = false;
greenLed2.off();
redLed2.on();
}
}
}
// Checks for long press condition on SETTINGS button
void LongHoldDetect1() {
// If the button is still depressed, it's a long hold
if (ButtonPressed1) {
LongHold1 = true;
greenLed1.on();
redLed1.off();
}
}
// Checks for long press condition on SETTINGS button
void LongHoldDetect2() {
// If the button is still depressed, it's a long hold
if (ButtonPressed2) {
LongHold2 = true;
greenLed2.on();
redLed2.off();
}
}
void GetTime() {
my_h = MyPrintDigits(hour());
my_m = MyPrintDigits(minute());
my_s = MyPrintDigits(second());
my_D = MyPrintDigits(day());
my_M = MyPrintDigits(month());
my_Y = MyPrintDigits(year());
/////////////////////////////////////// Clock /////////////////////////////////////
String Weekday = dayAsString(weekday());
Blynk.virtualWrite(V20, Weekday + " " + my_M + " " + my_D + " " + my_Y);
Time = my_h + ":" + my_m + ":" + my_s;
Blynk.virtualWrite(V21, Time);
}
///////////////////////////////////// MyPrintDigits /////////////////////////////////////
String MyPrintDigits(int digits) {
String new_digits = "";
if (digits < 10) new_digits += "0";
new_digits += String(digits);
return new_digits;
}
///////////////////////////////////// Day of the week /////////////////////////////////////
String dayAsString(int day) {
switch (day) {
case 1: return "Sunday";
case 2: return "Monday";
case 3: return "Tuesday";
case 4: return "Wednesday";
case 5: return "Thursday";
case 6: return "Friday";
case 7: return "Saturday";
}
}
BLYNK_CONNECTED() {
Blynk.sendInternal("rtc", "sync"); //request current local time for device
Blynk.syncVirtual(V0);
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);
Blynk.syncVirtual(V3);
Blynk.syncVirtual(V4);
Blynk.syncVirtual(V5);
Blynk.syncVirtual(V6);
Blynk.syncVirtual(V7);
Blynk.syncVirtual(V8);
Blynk.syncVirtual(V9);
Blynk.syncVirtual(V12);
Blynk.syncVirtual(V20);
Blynk.syncVirtual(V21);
Blynk.syncVirtual(V22);
Blynk.syncVirtual(V23);
Blynk.syncVirtual(V50);
Blynk.syncVirtual(V51);
Blynk.syncVirtual(V52);
Blynk.syncVirtual(V53);
Blynk.syncVirtual(V54);
Blynk.syncVirtual(V55);
Blynk.syncVirtual(V56);
Blynk.syncVirtual(V57);
}
BLYNK_WRITE(V4) {moistureThreshP[1] = param.asInt();} //gets moisture threshold level P1 from app
BLYNK_WRITE(V6) {moistureThreshP[2] = param.asInt();}
BLYNK_WRITE(V8) {moistureThreshP[3] = param.asInt();}
BLYNK_WRITE(V10) {moistureThreshP[4] = param.asInt();}
BLYNK_WRITE(V5) {pumpRunTime[1] = param.asInt();} //gets pump runtime from app
BLYNK_WRITE(V7) {pumpRunTime[2] = param.asInt();}
BLYNK_WRITE(V9) {pumpRunTime[3] = param.asInt();}
BLYNK_WRITE(V11) {pumpRunTime[4] = param.asInt();}
BLYNK_WRITE(V22) {param.asString();} //gets plant names from app
BLYNK_WRITE(V23) {param.asString();}