Hi! this is my whole code:
#define BLYNK_PRINT Serial
#define BLYNK_DEBUG
#define BLYNK_MAX_READBYTES 1024
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
char ssid[] = "Iphone";
char pass[] = "*******";
SoftwareSerial EspSerial(2,3); // RX, TX
// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600
ESP8266 wifi(&EspSerial);
char auth[] = "****************************";//token de la app Blynk
SimpleTimer timer2;//Definicion del temporizador
WidgetLCD lcd(V2);//asignación del pin virtual 2
int value; //variable que almacena la lectura analógica raw
int position; //posicion del potenciometro en tanto por ciento
int ej;//valor del ejercicio escogido (1,2,3,4 ó 5)
int contador = 0;//el contador que inicializa los mensajes en LCD
int valorMin = 140;//valores de comparacion con la posicion actual
int valorMax = 0;//valores de comparacion con la posicion actual
int bolaVal;//posicion del interruptor de bola
int repeticiones = 30;//repeticiones del ejercicio
int timerID;//ID del temporizador que llama a la funcion leedatos
String cadena;
/****************************FUNCIÓN QUE LEE LOS DATOS ANALÓGICOS/DIGITALES DE LOS SENSORES*******************************/
void leedatos()
{
const int analogPin = A0;//variable que almacena el valor del potenciometro
bolaVal = digitalRead(2); //lee del interruptor bola
value = analogRead(A0); // realizar la lectura analógica raw
position = round(map(value, 0, 1023, 0, 140)); // convertir a porcentaje el potencimetro
Blynk.virtualWrite(V5, position);//escribe en la aplicacion en el widget SUPERCHART
switch (ej)//llama a el ejercicio correspondiente
{
case 1: ejercicio1();//comprobaciones del ej 1
cadena=cadena+position+",";//actualiza la cadena
break;
case 2: ejercicio2();//comprobaciones del ej 2
cadena=cadena+position+",";
break;
case 3: ejercicio3();//comprobaciones del ej 3
cadena=cadena+position+",";
break;
case 4: ejercicio4();//comprobaciones del ej 4
cadena=cadena+position+",";
break;
case 5: ejercicio5();//comprobaciones del ej 5
cadena=cadena+position+",";
break;
default:
lcd.clear();
lcd.print(0,0,"escoge un ejercicio");
delay(1000);
break;
}
}
/*********************************FUNCION DE BOTON START/STOP********************************************************/
BLYNK_WRITE(V3)
{
if (param.asInt() == 1)//El boton en la aplicación está a 1
{
timer2.disable(timerID);//deshabilita el temporizador que llama a Leedatos
lcd.clear();//Borra LCD
lcd.print(0, 0, "has salido del ejercicio");//Imprime en LCD
delay(3000);
}
else
{
timer2.enable(timerID);//habilita el temporizador que llama a leedatos
lcd.clear();//borra de LCD
lcd.print(0, 0, "empieza el ejercicio");//Imprime en LCD
delay(3000);
}
}
/*****************************FUNCION QUE HACE LAS COMPROBACIONES DEL EJERCICIO 1********************************/
void ejercicio1()//Sentada flexiona y estira la rodilla al máximo
{
valorMax = max(position, valorMax);//Actualiza el valor máximo recogido
valorMin = min(position, valorMin);//Actualiza el valor mínimo recogido
contador++;//Aumenta el contador para la escritura en LCD
if (valorMax < 130)//comprobacion para ver si NO flexiona la rodilla
{
if (contador >= 40)//si el contador llega a 40 que escriba en LCD
{
lcd.clear();
lcd.print(0, 0, "Flexiona mas la rodilla");
contador = 0;//Se restauran los valores
valorMin = 140;//Se restauran los valores
valorMax = 0;//Se restauran los valores
}
}
else if (valorMin > 10)//comprobabcion para ver si NO estira la rodilla
{
if (contador >= 40)//si el contador llega a 40 que escriba en LCD
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else //si consigue cumplir los ángulos correctos
{
if(valorMin <10 && valorMax > 130)
{
lcd.clear();
lcd.print(0, 0, "Sigue asi");
valorMin = 140;
valorMax = 0;
repeticiones--;//se disminuye una repeticion de la serie
Blynk.virtualWrite(V4, repeticiones);//se imprime en la aplicación en el widjet de DISPLAY
if (repeticiones <= 0)//si termina con las repeticiones
{
lcd.clear();
lcd.print(0, 0, "Enhorabuena, has terminado el ej");//termina el ejercicio (imprime lcd)
Blynk.virtualWrite(V3, 1);//pone el boton a STOP y para de leer datos
Blynk.email("isabeljg15@gmail.com", "Nombre del paciente", "Ejercicio 1: "+cadena);
cadena="";
}
}
}
}
/*****************************FUNCION QUE HACE LAS COMPROBACIONES DEL EJERCICIO 2********************************/
void ejercicio2()//Sentadilla contra la pared
{
valorMax = max(position, valorMax);
valorMin = min(position, valorMin);
contador++;
if (valorMax < 90)//comprobabcion de flexión
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Flexiona mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (valorMin > 10)//comprobabción de estiramiento
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else
{
if(valorMin <10 && valorMax > 90)//comprobacion de movimiento correcto
{
lcd.clear();
lcd.print(0, 0, "Sigue asi");
valorMin = 140;
valorMax = 0;
repeticiones--;//disminuye una repetición
Blynk.virtualWrite(V4, repeticiones);//escribe en el widget de DISPLAY
if (repeticiones <= 0)//termina el ejercicio
{
lcd.clear();
lcd.print(0, 0, "Enhorabuena, has terminado el ej");
Blynk.virtualWrite(V3, 1);//para de leer y pone la app en STOP
Blynk.email("isabeljg15@gmail.com", "Nombre del paciente", "Ejercicio 2: "+cadena);
cadena="";
}
}
}
}
/*****************************FUNCION QUE HACE LAS COMPROBACIONES DEL EJERCICIO 3********************************/
void ejercicio3()//tumbada llevar la rodilla al pecho flexionando
{
valorMax = max(position, valorMax);
valorMin = min(position, valorMin);
contador++;
if (valorMax < 130)//comparativa de flexión
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Flexiona mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (valorMin > 10)//comparativa de estiramiento
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (position > 130 && bolaVal == LOW)//comparativa de la rodilla al pecho
{
if (contador >= 5)
{
lcd.clear();
lcd.print(0, 0, "lleva la rodilla al pecho");
contador = 0;
}
}
else//se realiza correctamente el ejercicio
{
if(valorMin <10 && valorMax > 130)
{
lcd.clear();
lcd.print(0, 0, "Sigue asi");
valorMin = 140;
valorMax = 0;
repeticiones--;//disminuye una repetición
Blynk.virtualWrite(V4, repeticiones);//escribe en el widget de DISPLAY las repeticiones que quedan
if (repeticiones <= 0)//termina el ejercicio
{
lcd.clear();
lcd.print(0, 0, "Enhorabuena, has terminado el ej");
Blynk.virtualWrite(V3, 1);
Blynk.email("isabeljg15@gmail.com", "Nombre del paciente", "Ejercicio 3: "+cadena);
cadena="";
}
}
}
}
/*****************************FUNCION QUE HACE LAS COMPROBACIONES DEL EJERCICIO 4********************************/
void ejercicio4()//boca abajo flexionar y estirar
{
valorMax = max(position, valorMax);
valorMin = min(position, valorMin);
contador++;
if (valorMax < 130)//comprobación de flexión
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Flexiona mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (valorMin > 10)//comparación de estiramiento
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (bolaVal == LOW)//comprobar posicion del cuerpo(boca abajo/boca arriba)
{
if (contador >= 5)
{
lcd.clear();
lcd.print(0, 0, "colocate tumbado boca abajo");
contador = 0;
}
}
else//realiza correctaente el ejercicio
{
if(valorMin <10 && valorMax > 130)
{
lcd.clear();
lcd.print(0, 0, "Sigue asi");
valorMin = 140;
valorMax = 0;
repeticiones--;
Blynk.virtualWrite(V4, repeticiones);
if (repeticiones <= 0)
{
lcd.clear();
lcd.print(0, 0, "Enhorabuena, has terminado el ej");
Blynk.virtualWrite(V3, 1);
Blynk.email("isabeljg15@gmail.com", "Nombre del paciente", "Ejercicio 4: "+cadena);
cadena="";
}
}
}
}
/*****************************FUNCION QUE HACE LAS COMPROBACIONES DEL EJERCICIO 5********************************/
void ejercicio5()//Levantar la pierna estirada
{
valorMax = max(position, valorMax);
valorMin = min(position, valorMin);
contador++;
if (valorMax > 20)//comprobar que no flexiona la rodilla
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else if (valorMin > 10)//comparar que estira lo suficiente la rodilla
{
if (contador >= 40)
{
lcd.clear();
lcd.print(0, 0, "Estira mas la rodilla");
contador = 0;
valorMin = 140;
valorMax = 0;
}
}
else
{
if(valorMin <10 && valorMax <30&&bolaVal == HIGH)//realiza correctamente el ejercicio
{
lcd.clear();
lcd.print(0, 0, "Sigue asi");
valorMin = 140;
valorMax = 0;
repeticiones--;//disminuye una repeticion
Blynk.virtualWrite(V4, repeticiones);//imprime en DISPLAY las repeticiones que quedan
if (repeticiones <= 0)//termina el ejercicio
{
lcd.clear();
lcd.print(0, 0, "Enhorabuena, has terminado el ej");
Blynk.virtualWrite(V3, 1);
Blynk.email("isabeljg15@gmail.com", "Nombre del paciente", "Ejercicio 5: "+cadena);
cadena="";
}
}
}
}
/*********************************FUNCION DEL MENU DESPLEGABLE EN LA APP*****************************************/
BLYNK_WRITE(V0)
{
ej = param.asInt();//Lee el ejercicio escogido
switch (param.asInt())
{
case 1://se elige el ejercicio 1
Blynk.virtualWrite(V1, 1); //se cambia la imagen 1 en el widget de IMAGE GALERY
repeticiones=30;
cadena="";
lcd.clear();
lcd.print(0, 0, "Has elegido ejercicio 1");
delay(2000);
break;
case 2://se elige el ejercicio 2
Blynk.virtualWrite(V1, 2); //se cambia la imagen 2
repeticiones=30;
cadena="";
lcd.clear();
lcd.print(0, 0, "Has elegido ejercicio 2");
delay(2000);
break;
case 3://se elige el ejercicio 3
Blynk.virtualWrite(V1, 3); //se cambia la imagen 3
repeticiones=30;
cadena="";
lcd.clear();
lcd.print(0, 0, "Has elegido ejercicio 3");
delay(2000);
break;
case 4://se elige el ejercicio 4
Blynk.virtualWrite(V1, 4); //se cambia la imagen 4
repeticiones=30;
cadena="";
lcd.clear();
lcd.print(0, 0, "Has elegido ejercicio 4");
delay(2000);
break;
case 5://se elige el ejercicio 5
Blynk.virtualWrite(V1, 5); //se cambia la imagen 5
repeticiones=30;
cadena="";
lcd.clear();
lcd.print(0, 0, "Has elegido ejercicio 5");
delay(2000);
break;
default:
lcd.clear();
lcd.print(0, 0, "no se elije nada");
}
}
/*******************************FUNCION DE INICIALIZACION*************************/
void setup()
{
// Inicializamos
Serial.begin(9600);//baudios a los que trabaja arduino
EspSerial.begin(ESP8266_BAUD);
Serial.println("llega1");
delay(10);
Serial.println("llega1");
Blynk.begin(auth, wifi, ssid, pass);
Serial.println("llega2");
Serial.println("Waiting for connections...");
timerID= timer2.setInterval(250L, leedatos);//inicializacion del timer de leedatos cada 250ms
Blynk.syncAll();//sincroniza la aplicacion blynk todos los pines virtuales
}
/****************************FUNCION BUCLE PRINCIPAL*****************************/
void loop()
{
Blynk.run();//Ejecuta la App Blynk
timer2.run();//Ejecuta el temporizador
}
´´
And this is the serial monitor:
![photo5843828611877023934|375x500](upload://cLKEGDwZnLV13eFniVDUTJpUIPi.jpeg)