# Blynk Connects then Disconnects

Hello,
I am doing a project involving multiple coin cell Motors in a specific vibration pattern which strength is controlled via Blynk. For some reason, when I connect to Blynk, it says “Connecting…” for a while, then says can’t connect, but then when I go out but then back into the bluetooth connect, it is connected. However, when I try to run it, it says the device is offline. Does anyone have any suggestions on how to fix this? Here is my code:

``````//to communicate with Blynk app
#include <BlynkSimpleSerialBLE.h>

/************************** Global Variables *********************************/
// Question: How many motors can the battery power to still get strong vibrations?
// Want to make it so it only powers about 3-4 motors at the same time but rapid changes which motors vibrate

//Motor pin assignments
#define tl 5  //Top left motor is on pin 5
#define tr 6  //Top right motor is on pin 6
#define tp 7  // Top motor on pin 7
#define bm 8 // Top motor is on pin 8
#define bl 10 //Bottom left motor is on pin 10
#define br 11 //Bottom right motor is on pin 11

//Motor Pair Variables
int ma1 = tl;  //Motor1 for pair a
int ma2 = bl; //Motor2 for pair a
int ma3 = tp; // Motor 3 for pair a
int mb1 = tr;  //Motor1 for pair b
int mb2 = br; //Motor2 for pair b
int mb3 = bm; // Motor 3 for pair a

//Input Variables
int v = 0; //Vibration strength
int t = 300; //Time between alternations

// Want the timing of the switching of motor states to be every 300 milliseconds. Don't know if that means t should equal this or t1 shold equal this
int m = 1; //Motor alternation mode
int p = 0; //On/Off for watch vibration

//Vibration Variables
int motorState = 0;   //Decides which motor pair to turn on/off
unsigned long t1; //Used to determine time between alternations

//Authentification code to connect to blynk
char auth[] = "sNeJOFbTJaQR3TS2OnnOw_prhAYrvTbw";

void setup()
{
// BLE Setup
Serial.begin(115200); //Initializes serial communications
Blynk.begin(Serial, auth); //Initializes Blynk start-up protocol

//Pin Setup
pinMode(tl,OUTPUT); //Set top left motor as an output
pinMode(tr,OUTPUT); //Set top right motor as an output
pinMode(tp, OUTPUT);  // Set top motor as an output
pinMode(bl,OUTPUT); //Set bottom left motor as an output
pinMode(br,OUTPUT); //Set bottom right motor as an output
pinMode(bm, OUTPUT); // Set as outpit

}

void loop()
{
//Get Inputs
Blynk.run();

//Assign Motors
assignMotors();

//Vibration Logic
if(p && Blynk.connected()){
vibrate();
}else{
stopVibrate();
p = 0;
}
}

//Method that chooses which motors alternate. Depending on what value is stored in m,
//which is determined by the value sent from the Blynk app, there will be different
//motor pairs assigned.

// This is where motor pairs (6) comes in
void assignMotors() {

//Left and Right
if(m == 1){
//Left Motors
ma1 = tl;
ma2 = bl;
mb3 = bm;

//Right Motors
mb1 = tr;
mb2 = br;
ma3 = tp;
}

}

// Figure out the timing of the vibrations and just make it constant
// Want to have two options: timing constant but also one that doesnt alternate vibrations and they are just always constant

//Method that turns on the motors. After t milliseconds of time have passed, it switches
//which motor pair is on and which is off.
void vibrate(){
if(millis()-t1 > t){
switchMotors(); //Switch motor vibration
t1 = millis(); //Reset time counter after the 7 patterns have been done
}
}

//This method switches which motor pair is vibrating. This is done using seven states.
void switchMotors(){
if(motorState == 0){
//Turn motor pair A on and B off
analogWrite(ma1,v);
analogWrite(ma2,v);
analogWrite(ma3,v);
analogWrite(mb1,0);
analogWrite(mb2,0);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 1)
{
//Turn motor pair A off and B on
analogWrite(ma1,0);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,v);
analogWrite(mb2,v);
analogWrite(mb3,v);

motorState = motorState + 1;
}
else if(motorState == 2) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,v);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,0);

motorState = motorState + 1;
}

else if(motorState == 3) {
analogWrite(ma1,0);
analogWrite(ma2,v);
analogWrite(ma3,0);
analogWrite(mb1,v);
analogWrite(mb2,0);
analogWrite(mb3,v);

motorState = motorState + 1;
}
else if(motorState == 4) {
analogWrite(ma1,v);
analogWrite(ma2,v);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 5) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,v);
analogWrite(mb1,v);
analogWrite(mb2,0);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 6) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,v);

motorState = 0;
}
}

//This method turns off all the motors.
void stopVibrate(){
//Turn off all motors
analogWrite(ma1,0);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,0);
analogWrite(mb3,0);
}

/************* BLYNK LIBRARY METHODS *************************/
//These methods are called whenever a button is pressed or
//a slider is moved on the app. When Blynk sends a value to
//the Arduino, that value is stored in a variable depending
//on which slider/button is pressed.

//Assign V0 to v
BLYNK_WRITE(V0)
{
v = param.asInt();
}

//Assign V1 to t
BLYNK_WRITE(V1)
{
t = param.asInt();
}

//Assign V2 to m
BLYNK_WRITE(V2){
m = param.asInt();
}

//Assign V3 to p
BLYNK_WRITE(V3){
p = param.asInt();
}
``````

Hey there, check this out
https://docs.blynk.io/en/legacy-platform/legacy-articles/keep-your-void-loop-clean

2 Likes

Ok, thank you for this. I changed my code, so now it looks like this:

``````//to communicate with Blynk app
#include <BlynkSimpleSerialBLE.h>

/************************** Global Variables *********************************/
// Question: How many motors can the battery power to still get strong vibrations?
// Want to make it so it only powers about 3-4 motors at the same time but rapid changes which motors vibrate

//Motor pin assignments
#define tl 5  //Top left motor is on pin 5
#define tr 6  //Top right motor is on pin 6
#define tp 7  // Top motor on pin 7
#define bm 8 // Top motor is on pin 8
#define bl 10 //Bottom left motor is on pin 10
#define br 11 //Bottom right motor is on pin 11
BlynkTimer timer; // Announcing the timer

//Motor Pair Variables
int ma1 = tl;  //Motor1 for pair a
int ma2 = bl; //Motor2 for pair a
int ma3 = tp; // Motor 3 for pair a
int mb1 = tr;  //Motor1 for pair b
int mb2 = br; //Motor2 for pair b
int mb3 = bm; // Motor 3 for pair a

//Input Variables
int v = 0; //Vibration strength
int t = 0; //Time between alternations
// Want the timing of the switching of motor states to be every 300 milliseconds. Don't know if that means t should equal this or t1 shold equal this
int m = 1; //Motor alternation mode
int p = 0; //On/Off for watch vibration

//Vibration Variables
int motorState = 0;   //Decides which motor pair to turn on/off
unsigned long t1; //Used to determine time between alternations

//Authentification code to connect to blynk
char auth[] = "sNeJOFbTJaQR3TS2OnnOw_prhAYrvTbw";

void setup()
{
// BLE Setup
Serial.begin(115200); //Initializes serial communications
Blynk.begin(Serial, auth); //Initializes Blynk start-up protocol

//Pin Setup
pinMode(tl,OUTPUT); //Set top left motor as an output
pinMode(tr,OUTPUT); //Set top right motor as an output
pinMode(tp, OUTPUT);  // Set top motor as an output
pinMode(bl,OUTPUT); //Set bottom left motor as an output
pinMode(br,OUTPUT); //Set bottom right motor as an output
pinMode(bm, OUTPUT); // Set as outpit

// Declare function should run every 1000 milliseconds
timer.setInterval(1000L, assignMotors); // should I use switchMotors?
}

void loop()
{
//Get Inputs
Blynk.run();
timer.run(); // run timer every second

//Vibration Logic
if(p && Blynk.connected()){
vibrate();
}else{
stopVibrate();
p = 0;
}
}

//Method that chooses which motors alternate. Depending on what value is stored in m,
//which is determined by the value sent from the Blynk app, there will be different
//motor pairs assigned.

// This is where motor pairs (6) comes in
void assignMotors() {

//Left and Right
if(m == 1){
//Left Motors
ma1 = tl;
ma2 = bl;
mb3 = bm;

//Right Motors
mb1 = tr;
mb2 = br;
ma3 = tp;
}

}

// Figure out the timing of the vibrations and just make it constant
// Want to have two options: timing constant but also one that doesnt alternate vibrations and they are just always constant

//Method that turns on the motors. After t milliseconds of time have passed, it switches
//which motor pair is on and which is off.
void vibrate(){
if(millis()-t1 > t){
switchMotors(); //Switch motor vibration
t1 = millis(); //Reset time counter after the 7 patterns have been done
}
}

//This method switches which motor pair is vibrating. This is done using seven states.
void switchMotors(){
if(motorState == 0){
//Turn motor pair A on and B off
analogWrite(ma1,v);
analogWrite(ma2,v);
analogWrite(ma3,v);
analogWrite(mb1,0);
analogWrite(mb2,0);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 1)
{
//Turn motor pair A off and B on
analogWrite(ma1,0);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,v);
analogWrite(mb2,v);
analogWrite(mb3,v);

motorState = motorState + 1;
}
else if(motorState == 2) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,v);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,0);

motorState = motorState + 1;
}

else if(motorState == 3) {
analogWrite(ma1,0);
analogWrite(ma2,v);
analogWrite(ma3,0);
analogWrite(mb1,v);
analogWrite(mb2,0);
analogWrite(mb3,v);

motorState = motorState + 1;
}
else if(motorState == 4) {
analogWrite(ma1,v);
analogWrite(ma2,v);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 5) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,v);
analogWrite(mb1,v);
analogWrite(mb2,0);
analogWrite(mb3,0);

motorState = motorState + 1;
}
else if(motorState == 6) {
analogWrite(ma1,v);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,v);
analogWrite(mb3,v);

motorState = 0;
}
}

//This method turns off all the motors.
void stopVibrate(){
//Turn off all motors
analogWrite(ma1,0);
analogWrite(ma2,0);
analogWrite(ma3,0);
analogWrite(mb1,0);
analogWrite(mb2,0);
analogWrite(mb3,0);
}

/************* BLYNK LIBRARY METHODS *************************/
//These methods are called whenever a button is pressed or
//a slider is moved on the app. When Blynk sends a value to
//the Arduino, that value is stored in a variable depending
//on which slider/button is pressed.

//Assign V0 to v
BLYNK_WRITE(V0)
{
v = param.asInt();
}

//Assign V1 to t
BLYNK_WRITE(V1)
{
t = param.asInt();
}

//Assign V2 to m
BLYNK_WRITE(V2){
m = param.asInt();
}

//Assign V3 to p
BLYNK_WRITE(V3){
p = param.asInt();
}
``````

It still is having the same problem of connecting, it connects, then when I press play on the Blynk it says it is offline. I am really inexperienced with Blynk and Arduino, so if anyone knows how to alter the code that would be a big help.

Your void loop should look like this

``````void loop()
{
Blynk.run();
timer.run();
}
``````