I was trying this code to run stepper motors and print Blynk app joystick's X and Y coordinates. But the code is only getting the joystick values once. But it works fine when I use if condition instead of while(). I needed while condition to run stepper motors continuously but with if condition they turn off and on very quickly decrease the speed of stepper motors.
Please help me deal this situation
Code
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <AccelStepper.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "LRTCZUnCI06P-pqh5rlPXRbuOUgQ_uGH";
AccelStepper stepper_1(1,D2,D1);
AccelStepper stepper_2(1,D5,D6);
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Airtel_7599998800";
char pass[] = "air71454";
int prev_x = 0;
int prev_y = 0;
BLYNK_WRITE(V1) {
int x = param[0].asInt();
int y = param[1].asInt();
// Do something with x and y
Serial.print("X = ");
Serial.print(x);
Serial.print("; Y = ");
Serial.println(y);
MoveControls(x , y);
}
void setup()
{
// Debug console
Serial.begin(9600);
stepper_1.setAcceleration(1000);
stepper_2.setAcceleration(1000);
Blynk.begin(auth, ssid, pass);
// You can also specify server:
//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
// ESP.wdtDisable();
// ESP.wdtEnable(WDTO_8S);
}
void loop()
{// ESP.wdtFeed();
Blynk.run();
// Serial.println("A");
}
void MoveControls(int x, int y) {
///////////////////////////////////////////Move Forward////////////////////////////////////////////////////
if(y >= 150 && x <= 150 && x >= -150){
stepper_1.enableOutputs();
stepper_2.enableOutputs();
stepper_1.setMaxSpeed(1000);
stepper_2.setMaxSpeed(1000);
stepper_1.move(1000);
stepper_2.move(1000);
while(x != prev_x && y != prev_y){
stepper_1.run();
stepper_2.run();
Blynk.syncVirtual(V1);
Blynk.run();
Serial.print("X = ");
Serial.print(x);
Serial.print("; Y = ");
Serial.println(y);
}
prev_x = x;
prev_y = y;
}
///////////////////////////////////////////Neutral Zone////////////////////////////////////////////////////
if(y <= 150 && x <= 150 && x >= -150 && y >= -150){
stepper_1.disableOutputs();
stepper_2.disableOutputs();
prev_x = x;
prev_y = y;
}
yield();
}
This is that while loop
while(x != prev_x && y != prev_y){
stepper_1.run();
stepper_2.run();
Blynk.syncVirtual(V1);
Blynk.run();
Serial.print("X = ");
Serial.print(x);
Serial.print("; Y = ");
Serial.println(y);
}
prev_x = x;
prev_y = y;
}
I know that the code is very much wrong and doesn't make much sense but I need to fix only the Blynk.syncVirtual() issue.
I also tried to add Blynk.run() after Blynk.syncVirtual() because someone told in Blynk Community to do that https://community.blynk.cc/t/blynk-syncvirtual-doesnt-work-as-expected/40047/4