Ayuda conectividad Bluetooth

Buenas, veréis tengo un modulo bluetooth HC-06 conectado al arduino y comunicando con una app de android creada con AppInventor y lo que quiero es saber si hay alguna forma de que se detecte cuando se ha perdido la conexión del modulo bluetooth desde arduino o la app, pero principalmente desde arduino.

He leído varias cosas y he probado con if(!Serial) pero no sirve, no se si tendría que mandar cada x tiempo quizás un comando AT para que me devolviese OK o no y si es así como se haría?

O si tenéis alguna otra solución os lo agradecería.

Un saludo y gracias de antemano.

Haciendo una rápida búsqueda, leo que solo enviando AT, verifica la conexión de los dispositivos

Por lo tanto si envías AT y recibes OK, es porque ambos dispositivos están conectados.

desde arduino sería algo como

Serial.write('AT');
if(Serial.read() == 'OK'){
   Serial.println("Dispositivos conectados");
}

gepd:
Haciendo una rápida búsqueda, leo que solo enviando AT, verifica la conexión de los dispositivos

Por lo tanto si envías AT y recibes OK, es porque ambos dispositivos están conectados.

desde arduino sería algo como

Serial.write('AT');

if(Serial.read() == ‘OK’){
  Serial.println(“Dispositivos conectados”);
}

Gracias por la contestación, pero yo lo que querría seria monitorizar en todo momento si la conexión sigue de forma que cuando no este disponible actué de una determinada forma el arduino.
Ademas no debería guardar almacenar el Serial.read primero en una variable ya que son mas de un carácter?
Y para enviar los comandos no debería usar sendATcommand? Es lo que utiliza un código de gps que estoy utilizando para la configuración del gps y a la vez almacena la respuesta, es decir, por ejemplo:

answer = sendATcommand(“AT+CGPSINFO”,"+CGPSINFO:",1000);

Espero que podais ayudarme.

Un saludo.

Enviar comandos AT no te sirve ,los hc-06 solo estan en modo AT si no estan vinculados con ningun dispositivo.desconozco como funciona app inventor, yo uso basic4android y la libreria que te ofrece este lenguaje ofrece metodos para saber si la conexion se ha perdido o no desde android.del lado arduino ,lo unico que se me ocurre es que vayas mandando mensajes cada cierto tiempo,y si no hay respuesta del dispositivo android ,suponer que no esta disponible.

Cada disponisitivo es particular.
Probate lo que sugirió gepd?

Crea una función que te devuelva 1 o 0 en función de lo que te indicó gepd

bool BTconectado() {
Serial.write('AT');
if (Serial.read() == 'OK'){
return true
}
else
return false;
}

Ahora esto es algo que funciona para el BT de Arduino.
Que te informe que le pasa al BT de Android es imposible si no tienes enlace.
Conformate con ver desde el lado Arduino.

jose:
Enviar comandos AT no te sirve ,los hc-06 solo estan en modo AT si no estan vinculados con ningun dispositivo.desconozco como funciona app inventor, yo uso basic4android y la libreria que te ofrece este lenguaje ofrece metodos para saber si la conexion se ha perdido o no desde android.del lado arduino ,lo unico que se me ocurre es que vayas mandando mensajes cada cierto tiempo,y si no hay respuesta del dispositivo android ,suponer que no esta disponible.

Me podrías informar algo sobre basic4android?

Por cierto, con HC-05 si podría ?

surbyte:
Cada disponisitivo es particular.
Probate lo que sugirió gepd?

Crea una función que te devuelva 1 o 0 en función de lo que te indicó gepd

bool BTconectado() {
Serial.write('AT');
if (Serial.read() == 'OK'){
return true
}
else
return false;
}

Ahora esto es algo que funciona para el BT de Arduino.
Que te informe que le pasa al BT de Android es imposible si no tienes enlace.
Conformate con ver desde el lado Arduino.

Gracias por la respuesta, la función que escribes es la misma que me puso el primer compañero, pero como dice el otro compañero, el HC-06 no puede enviar comandos AT una vez es iniciado, por lo que la función que me dices no me sirve.

Gracias igualmente por la ayuda.

Aqui hay una version de prueba:

Aqui manuales (en ingles):
http://www.basic4ppc.com/android/documentation.html
Con el Hc-05 si ,pero para introducir comandos at tienes que tener el pin wakeup o key (segun el fabricante) en HIGH o 5v justo en el momento de encender el bluetooth ,por lo que cada vez que quieras mandar un comando AT tendrias que poner a LOW el pin de alimentacion ,poner en HIGH el pin de wakeup o key y en HIGH otra vez la alimentacion,perdiendo la conexion con el android de mientras mandas el comando AT.........todo un engorro ,veo mas factible la opcion de mandar mensajes.

Creo que habría otra forma de comprobarlo, no sé si es la mejor opción, pero es lo que se me ocurre.
Como no puedes enviar comandos AT, puedes simular esa función

Desde Arduino o viceversa, envías un carácter, una letra, una palabra, etc, y luego el dispositivo al que se le preguntó responde, con un OK (o cualquier otra respuesta) si esto lo hace constantemente cada x periodo de tiempo, entonces sabrás si los dispositivos aún están conectados, si luego de un tiempo e intentos que determines no hay respuesta, entonces la conexión se ha perdido.

jose:
Aqui hay una version de prueba:
B4A – The simple way to develop native Android apps
Aqui manuales (en ingles):
B4A Documentation
Con el Hc-05 si ,pero para introducir comandos at tienes que tener el pin wakeup o key (segun el fabricante) en HIGH o 5v justo en el momento de encender el bluetooth ,por lo que cada vez que quieras mandar un comando AT tendrias que poner a LOW el pin de alimentacion ,poner en HIGH el pin de wakeup o key y en HIGH otra vez la alimentacion,perdiendo la conexion con el android de mientras mandas el comando AT.........todo un engorro ,veo mas factible la opcion de mandar mensajes.

Y como harías lo de los mensajes?
Lo he estado pensando y no se me ocurre, código arduino quiero decir.

gepd:
Creo que habría otra forma de comprobarlo, no sé si es la mejor opción, pero es lo que se me ocurre.
Como no puedes enviar comandos AT, puedes simular esa función

Desde Arduino o viceversa, envías un carácter, una letra, una palabra, etc, y luego el dispositivo al que se le preguntó responde, con un OK (o cualquier otra respuesta) si esto lo hace constantemente cada x periodo de tiempo, entonces sabrás si los dispositivos aún están conectados, si luego de un tiempo e intentos que determines no hay respuesta, entonces la conexión se ha perdido.

Tienes alguna idea de código ?

Has trabajado alguna vez con app inventor?

Tienes que implementar lo que gepd te aconseja.
Envias "hi" y si el Android lee "hi" responde "ok"
Cada dispositivo enviará un comando exclusivo asi sabrás cuando no hay conexión.
Eso lo haces usando elpuerto serial donde este conectado el BT y modificando el programa en el Android para que conteste "OK"cuando lea "hi".

Alguna ayuda?

Jose46:
Alguna ayuda?

Te lo ha puesto Surbyte arriba.......
Mira una manera de hacerlo es aprovechar el timer de app inventor,que es un objeto al cual le puedes programar un tiempo y un codigo a ejecutar cuando se cumpla dicho tiempo: Temporizador para Android (App Inventor) .Puedes programar un timer para que por ejemplo cada 3 segundos envie una 'c' de conectado al arduino ,y en el arduino detectar esa 'c' y contar el tiempo
que pasa hasta que recibe la siguiente,si ese tiempo pasa de 4 segundos,para dar un poco de margen,pues tu lo detectas y haces lo que creas oportuno.Mira este codigo,si lo compilas y enciendes el serial monitor veras que a los 4 segundos salta un mensaje,pero si antes de los 4 segundos vas introduciendo la letra c ,no salta:

unsigned long recibido;
const int MAXIMO = 4000; // Tiempo maximo sin recibir la 'c' del mobil
void setup(){
  Serial.begin(9600);
  
}
void loop(){
  if (Serial.available()){
    char letra = Serial.read();
    if (letra == 'c'){
       recibido = millis();
    }  
  } 
  if ( millis() - recibido > MAXIMO){
    Serial.println("Desconectado"); 
  }  
}