Go Down

Topic: Identificar cuando no recibo datos seriales desde modulo BT (Read 1 time) previous topic - next topic

Airduino

Saludos a todos.

Les cuento...
Estoy embarcado en hacer un tanque radiocontrolado por Bluetooth desde un smartphone con android.
Actualmente lo tengo funcionando, con una aplicacion que encontre en la Playstore y la programacion que desarrolle...Pero mantengo un problema desde el principio que no he podido solucionar.

Resulta que a traves de un modulo BT (HC-06) recibo datos seriales por los pines 2 y 3, el arduino va ejecutando las funciones programadas en base a numeros que recibe via BT. (cuando no se le envia ninguna instruccion, la aplicacion del smartphone por defecto envia "ceros", en la programacion el "0" significa que debe estar detenido)

Mi problema viene a que cuando pierdo conectivdad bluetooth (por distancia generalmente) el tanque sigue ejecutando la ultima instruccion recibida... casi siempre " hacia adelante".

La idea, es implementar codigo dentro del que ya tengo para que el arduino "sepa" cuando no recibe datos desde el modulo BT y pueda detener el tanque y hacer parpadear las luces que tiene conectadas hasta que pueda emparejar nuevamente el modulo BT con mi telefono, ahi deberia seguir corriendo el programa normalmente.

Espero me puedan ayudar.

Aqui les dejo el codigo que estoy utilizando.

Code: [Select]


#include <SoftwareSerial.h>
char rec;
SoftwareSerial blue(2,3);  

int E1 = 16;  
int M1 = 17;  
int E2 = 18;  
int M2 = 19;  

int LUZ =13;

void setup(){
 
pinMode(E1, OUTPUT);  // CONFIGURACION DE PIN COMO SALIDA.
pinMode(M1, OUTPUT);  // CONFIGURACION DE PIN COMO SALIDA.
pinMode(E2, OUTPUT);  // CONFIGURACION DE PIN COMO SALIDA.
pinMode(M2, OUTPUT);  // CONFIGURACION DE PIN COMO SALIDA.

pinMode (LUZ, OUTPUT);  // CONFIGURACION DE PIN COMO SALIDA.

digitalWrite (E1, LOW);  // ASIGNACION DE ESTADO BAJO AL PIN (PULL DOWN).
digitalWrite (M1, LOW);  // ASIGNACION DE ESTADO BAJO AL PIN (PULL DOWN).
digitalWrite (E2, LOW);  // ASIGNACION DE ESTADO BAJO AL PIN (PULL DOWN).
digitalWrite (M2, LOW);  // ASIGNACION DE ESTADO BAJO AL PIN (PULL DOWN).

digitalWrite (LUZ, LOW); // ASIGNACION DE ESTADO BAJO AL PIN (PULL DOWN).
 
 

 blue.begin(9600);  // SETEO DE VELOCIDAD DE COMUNICACION SERIAL CON MODULO BT.
 delay(100);  // RETRASO PARA EL PROXIMO COMANDO.
}



void loop() {
 
if(blue.available()){
rec=blue.read();

switch(rec){
     
case '0': // TODO DETENIDO Y/O APAGADO (EXCEPTO LAS LUCES).
digitalWrite(E1,LOW);  // ASIGNA ESTADO BAJO AL PIN.
digitalWrite(M1,LOW);  // ASIGNA ESTADO BAJO AL PIN.
digitalWrite(E2,LOW);  // ASIGNA ESTADO BAJO AL PIN.
digitalWrite(M2,LOW);  // ASIGNA ESTADO BAJO AL PIN.

/* digitalWrite(LUZ,LOW);  // ASIGNA ESTADO BAJO AL PIN.*/
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.
       
       
   
case '1':  // ADELANTE.
digitalWrite(E1,HIGH);  //ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M1,LOW);  // ASIGNA ESTADO BAJO AL PIN.
digitalWrite(E2,HIGH);  //ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M2,LOW);  // ASIGNA ESTADO BAJO AL PIN.
delay (10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  //SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.
       
       
case '2':  // ATRAS.
digitalWrite(E1,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M1,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(E2,HIGH);  // ASIGNA ESTADO ALTO AL PIN
digitalWrite(M2,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.
     
       
case '3':  // GIRAR A LA IZQUIERDA.
digitalWrite(E1,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M1,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(E2,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M2,LOW);  // ASIGNA ESTADO BAJO AL PIN.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.
     
     
case '4':  // GIRAR A LA DERECHA.
digitalWrite(E1,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M1,LOW);  // ASIGNA ESTADO BAJO AL PIN.
digitalWrite(E2,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
digitalWrite(M2,HIGH);  // ASIGNA ESTADO ALTO AL PIN.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.
     
       
case '5':  // ENCIENDE LUCES.
digitalWrite(LUZ, HIGH);  // ASIGNA ESTADO ALTO AL PIN.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE" SEA VALIDA.


case '6':  // APAGA LUCES.
digitalWrite(LUZ,LOW);  // ASIGNA ESTADO BAJO AL PIN.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
break;  // SE DETIENE Y REPITE HASTA AQUI MIENTRAS LA SENTENCIA "CASE"SEA VALIDA.

                 
       
       
default:  // EL PROGRAMA REALIZA ESTA ACCION SIEMPRE QUE NINGUNA SENTENCIA "CASE" SEA VALIDA.
delay(10);  // RETRASO PARA EL SIGUIENTE COMANDO.
rec = 0 ;

   }
 }
}


Naruto128

proba esto:  teoricamente te dice si esta abierto el puerto, osea
hace lo que quieras hacer, mientras este conectado el puerto.


while (Serial) {


}

Go Up