Need Help:- Issue with My code,

Hi,

I am new to Blynk and facing issue with below code, I have Elecrow automatic plant watering kit and tried to integrate code with Blynk. Hardware side I am using Arduino UNO with ESP8266. My issue is, it connects initially and immediately it disconnects. But same thing if I try with only Blynk sketch it is stable. Can anyone please help me to correct the below code.

#include <Blynk.h>
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

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

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

#define EspSerial Serial
#define ESP8266_BAUD 115200
ESP8266 wifi(&EspSerial);

// set all moisture sensors PIN ID
int moisture1 = A0;
int moisture2 = A1;
int moisture3 = A2;
int moisture4 = A3;

// declare moisture values
int moisture1_value = 0;
int moisture2_value = 0;
int moisture3_value = 0;
int moisture4_value = 0;

// set water relays
int relay1 = 3;
int relay2 = 4;
int relay3 = 5;
int relay4 = 6;

// set water pump
int pump = 2;


void setup()
{
      Serial.begin(9600);
  delay(10);

  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);

  // Debug console
  
    // declare relay as output
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  // declare pump as output
  pinMode(pump, OUTPUT);
   
}

void loop()
{

Blynk.run();
 // read the value from the moisture sensors:
 moisture1_value = analogRead(moisture1);
 moisture2_value = analogRead(moisture2);
 moisture3_value = analogRead(moisture3);
 moisture4_value = analogRead(moisture4);
 
 // check which plant need water
 // and open the switch for that specific plant
 
 if(moisture1_value<=450){
  digitalWrite(relay1, HIGH);
 }
 if(moisture2_value<=450){
 digitalWrite(relay2, HIGH);
 }
 if(moisture3_value<=450){
 digitalWrite(relay3, HIGH);
 }
 if(moisture4_value<=450){
 digitalWrite(relay4, HIGH);
 }
 
 digitalWrite(pump, HIGH);
 digitalWrite(relay1, HIGH);
 delay(500);
 digitalWrite(relay2, HIGH);
 delay(500);
 digitalWrite(relay3, HIGH);
 delay(500);
 digitalWrite(relay4, HIGH);
 delay(500);
 digitalWrite(relay1, LOW);
 delay(500);
 digitalWrite(relay2, LOW);
 delay(500);
 digitalWrite(relay3, LOW);
 delay(500);
 digitalWrite(relay4, LOW);
 digitalWrite(pump, LOW);
 delay(500);
 
 // make sure there is at least one plant that needs water
// if there is, open the motor
 if(moisture1_value<=450 || moisture2_value<=450 || moisture3_value<=450 || moisture4_value<=450){
   digitalWrite(pump, HIGH);
 }
 
 // let it water the plant for 5 seconds
 delay(5000);
 
 // turn the pump off
 digitalWrite(pump, LOW);
 
 // go each switch and turn them off
 digitalWrite(relay1, LOW);
 digitalWrite(relay2, LOW);
 digitalWrite(relay3, LOW);
 digitalWrite(relay4, LOW);
 
//  wait 5 minutes and repeat the process
 Serial.println(moisture1_value);
 delay(10000);
 delay(300000);
}

Just keep your loop clean

Thanks Erfan, Is it possible to help me with code

Read this:

Then try implementing the concepts and post your code if you have any issues.

Pete.

I have changed the code but still facing same issue

#include <Blynk.h>
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

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

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

// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial

// or Software Serial on Uno, Nano...
//#include <SoftwareSerial.h>
//SoftwareSerial EspSerial(2, 3); // RX, TX

// Your ESP8266 baud rate:
#define ESP8266_BAUD 115200
ESP8266 wifi(&EspSerial);

// set all moisture sensors PIN ID
int moisture1 = A0;
int moisture2 = A1;
int moisture3 = A2;
int moisture4 = A3;
int moisture5 = A4;
int moisture6 = A5;
int moisture7 = A6;

// declare moisture values
int moisture1_value = 0;
int moisture2_value = 0;
int moisture3_value = 0;
int moisture4_value = 0;

// set water relays
int relay1 = 3;
int relay2 = 4;
int relay3 = 5;
int relay4 = 6;
BlynkTimer timer;
// set water pump
int pump = 2;
int x = 0;

void waterPlant(int x) 
{
Serial.print("Opening: ");
Serial.print(x);
//Open valve x ==> x will contain value of correct relay[1-4]
digitalWrite(x, HIGH);
//We wait 0.5 seconds before opening pump so we are sure valve is open. This will prevent the pump from pushing water to a closed valve and risking the tubes to leak or wose, break loose.
delay(500);
//Open pump for 3 seconds
digitalWrite(pump, HIGH);
delay(10000);
//close pump
digitalWrite(pump, LOW);
delay(500);
digitalWrite(x, LOW);
//Make sure all valves are closed again.
closeAll();
}



void setup()
{
  Serial.begin(9600);
  delay(10);

  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);
  Blynk.begin(auth, wifi, ssid, pass);
 timer.setInterval(1000L, sensorDataSend); //timer will run every sec
   // declare relay as output
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
// declare pump as output
pinMode(pump, OUTPUT);
// declare the ledPin as an OUTPUT:
Serial.begin(9600);
}

void loop()
{
Blynk.run();
timer.run();        // run timer every second
checkMoisture();
}

// check which plant need water

// and open the switch for that specific plant

void checkMoisture() {
if (analogRead(moisture1) <= 550) {
waterPlant(relay1);
}
if (analogRead(moisture2) <= 550) {
waterPlant(relay2);
}
if (analogRead(moisture3) <= 550) {
waterPlant(relay3);
}
if (analogRead(moisture4) <= 550) {
waterPlant(relay4);
}
delay(120000);
if (analogRead(moisture1) <= 450 || analogRead(moisture2) <= 450 || analogRead(moisture3) <= 450 || analogRead(moisture4) <= 450) {
checkMoisture();
}
else {
closeAll();
}
}

// turn pump & valves off just to be sure.

void closeAll() 
{
Serial.println("closing pump + valves!");
digitalWrite(pump, LOW);
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
}


void sensorDataSend()
{
  int sensorValue0 = analogRead(A0);         // reading sensor from analog pin
  Blynk.virtualWrite(V5, sensorValue0);  // sending sensor value to Blynk app
    int sensorValue1 = analogRead(A1);         // reading sensor from analog pin
  Blynk.virtualWrite(V6, sensorValue1); 
      int sensorValue2 = analogRead(A2);         // reading sensor from analog pin
  Blynk.virtualWrite(V7, sensorValue2); 
       int sensorValue3 = analogRead(A3);         // reading sensor from analog pin
  Blynk.virtualWrite(V8, sensorValue3); 
  int sensorValue4 = analogRead(A4);         // reading sensor from analog pin
  Blynk.virtualWrite(V9, sensorValue4); 
  int sensorValue5 = analogRead(A5);         // reading sensor from analog pin
  Blynk.virtualWrite(V10, sensorValue5); 
}

don’t formatting your sketch with ‘’’’
use `

:joy:

1 Like

Keep at it!

Put the check moisture on a timer yet.

Also go through your code and clean it up. At a glance you are defining and try to reset the baud at two different rates.

1 Like

I’ve fixed your code formatting.

You’re still calling this function every single time your void loop executes.

And using delays.

Pete.

1 Like
void loop() {
 Blynk.run();
 timer.run(); // run timer
}
1 Like

Should not use delay() functions that just stops the entire code there for the delay period

1 Like

1st add a timer

timer.setInterval(1000L, sensorDataSend); //timer will run every sec
timer.setInterval(12000L, checkMoisture); //timer will run every 12 sec

2nd
delete delay 12000

3 Rd
clean your loop
{
Blynk.run();
timer.run();
}

2 Likes