Obtener el valor de la intensidad de la señal del módulo de Bluetooth.

Hola a toda la comunidad. Busco averiguar cómo hallar la intensidad de la señal de comunicación de un módulo de Bluetooth HC-05 con un dispositivo conectado a éste. Es que voy a hacer un sistema de control cerrado, el cual, le ordene al módulo de Bluetooth girar cuando la señal de comunicación de éste con un dispositivo conectado se debilite. Si la señal es débil, entonces la antena del módulo de Bluetooth HC-05 girará 90 grados. Si la señal es suficientemente alta, entonces no va a girar.

Por lo tanto, debo hallar una señal capaz de conectarse con Arduino que indique cuando la señal de comunicación del Bluetooth con el dispositivo se ha debilitado o se ha fortalecido, es decir, que esta señal esté en función de la cantidad de potencia de comunicación del Bluetooth con el dispositivo conectado. ¿Cuál sería? Muchas gracias por su atención.

Tengo un Arduino Nano.

1 Like

Espero que te ayude este post

En ese post aparecen las instrucciones que le tengo que dar al módulo de Bluetooth, pero en ninguna parte aparece algún código en el que pueda ver como enviar esos comandos al módulo HC-05. Comprendí que tengo que hallar los valores RSSI del módulo de Bluetooth que están en función de la potencia de su señal. Este post ilustra un código que debo poner para comunicarme con el módulo, pero no sé si sea el adecuado para lo que estoy buscando. El código es el siguiente:

char c = ' ';
byte AtmodePin = 2;
 
void setup()
{
    pinMode(AtmodePin, OUTPUT);
    digitalWrite(AtmodePin, LOW);
   
    Serial.begin(9600);
    Serial.println("Serial 0 ON");
 
    Serial1.begin(9600); 
    Serial.println("Serial 1 ON");
}
 
void loop()
{
    if (Serial1.available())
    { 
        c = Serial1.read();
        Serial.write(c);
    }
 
    if (Serial.available())
    {
        c =  Serial.read();

        if (c == '#')
        {
          digitalWrite(AtmodePin, HIGH);
          Serial.print("AT mode ON. $ zeby wyjsc");
        }

        else if (c == '

¿De esta forma se tienen que enviar los comandos al módulo de Bluetooth para después recibirlos en el mismo monitor Serie? Ahí tengo mi duda: no encuentro suficiente información en los foros ni en Google al respecto. Además copié ese código y, al querer compilarlo, el entorno no me dejó, sino que me escribió el mensaje de error siguiente:

Arduino:1.8.5 (Windows 10), Tarjeta:"Arduino Nano, ATmega328P"

C:\Users\jorge\Documents\Arduino\PotenciaDelBluetooth_ConUnSerial\PotenciaDelBluetooth_ConUnSerial.ino: In function 'void setup()':

PotenciaDelBluetooth_ConUnSerial:13: error: 'Serial1' was not declared in this scope

     Serial1.begin(9600); 

     ^

C:\Users\jorge\Documents\Arduino\PotenciaDelBluetooth_ConUnSerial\PotenciaDelBluetooth_ConUnSerial.ino: In function 'void loop()':

PotenciaDelBluetooth_ConUnSerial:19: error: 'Serial1' was not declared in this scope

     if (Serial1.available())

         ^

PotenciaDelBluetooth_ConUnSerial:38: error: 'Serial1' was not declared in this scope

           Serial1.print("AT+RESET\n\r");

           ^

PotenciaDelBluetooth_ConUnSerial:45: error: 'Serial1' was not declared in this scope

         Serial1.write(c); 

         ^

exit status 1
'Serial1' was not declared in this scope

¿Qué estaré haciendo mal? Encontré esta imagen proveniente de este post por si es de ayuda.

Gracias por su atención.

)
       {
         digitalWrite(AtmodePin, LOW);
         Serial1.print("AT+RESET\n\r");
         Serial.print("AT+RESET\n\r");
       }

else
       {
       Serial.write(c);
       Serial1.write(c);
       }
   }

}


¿De esta forma se tienen que enviar los comandos al módulo de Bluetooth para después recibirlos en el mismo monitor Serie? Ahí tengo mi duda: no encuentro suficiente información en los foros ni en Google al respecto. Además copié ese código y, al querer compilarlo, el entorno no me dejó, sino que me escribió el mensaje de error siguiente:

§DISCOURSE_HOISTED_CODE_1§


¿Qué estaré haciendo mal? Encontré esta imagen proveniente de [este post](https://forum.arduino.cc/index.php?topic=192696.msg2191862#msg2191862) por si es de ayuda.

![Get RSSI Signal Strength.jpg|805x652](upload://vVUc1CqYMGiHeG1JTki268nrH3s.jpeg) 

Gracias por su atención.

![Get RSSI Signal Strength.jpg|805x652](upload://vVUc1CqYMGiHeG1JTki268nrH3s.jpeg)

No te compila porque usas un nano con el código de un mega, para poder usar el monitor serial y comunicar con el modulo al mismo tiempo deberías usar softwareserial y adaptar el código.

Mi único HC-05 lo uso para actualizar código de un mega que esta en un falso techo por lo que no puedo hacer pruebas con el, siento no poder ayudarte.

En el código que envié veo que se usan dos rutas Seriales: Serial y Serial1. ¿Es necesario usar más de una? Es que busco enviar comandos al módulo de Bluetooth, y de ahí obtener las respuestas de éste.

Si quieres usar el monitor serie debes usar otro serial para comunicar el modulo, en el ejemplo usan un mega que tiene 4 serial, puedes usar software serial para crear uno nuevo y en vez de usar Serial1 puedes usar el tipico mySerial de los ejemplos o el nombre que tu le des con la libreria.

Ahora otra pregunta. ¿Cómo se conectan los dos puertos seriales al módulo de Bluetooth? Por ejemplo, yo puse el código siguiente:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);    // Rx es 2, Tx es 3

char c = ' ';
byte AtmodePin = 2;
 
void setup()
{
    pinMode(AtmodePin, OUTPUT);
    digitalWrite(AtmodePin, LOW);
   
    Serial.begin(9600);
    Serial.println("Serial 0 ON");
 
    mySerial.begin(9600); 
    Serial.println("Serial 1 ON");
}
 
void loop()
{
    if (mySerial.available())
    { 
        c = mySerial.read();
        Serial.write(c);
    }
 
    if (Serial.available())
    {
        c =  Serial.read();

        if (c == '#')
        {
          digitalWrite(AtmodePin, HIGH);
          Serial.print("AT mode ON. $ zeby wyjsc");
        }

        else if (c == '

Yo conecté el Rx del Arduino al Tx del Bluetooth, y el Tx del Arduino al Rx del Bluetooth. ¿Debería poner el otro Rx (pin 2) en el Tx del Bluetooth, y el otro Tx (pin 3) en el Rx del Bluetooth?)
        {
          digitalWrite(AtmodePin, LOW);
          mySerial.print("AT+RESET\n\r");
          Serial.print("AT+RESET\n\r");
        }

else
        {
        Serial.write(c);
        mySerial.write(c);
        }
    }
}


Yo conecté el Rx del Arduino al Tx del Bluetooth, y el Tx del Arduino al Rx del Bluetooth. ¿Debería poner el otro Rx (pin 2) en el Tx del Bluetooth, y el otro Tx (pin 3) en el Rx del Bluetooth?

Las conexiones son cruzadas como bien has hecho.
Debes asegurarte que estas en la misma velocidad de tu módulo BT que generalmente es 19200 baudios.
Si eso no funciona, entonces tendras que probar todas las velocidades 1 a 1 de forma paciente.

A los pines cruzados de RX y TX como explicas al comienzo recuerda que debes sumar GND y VCC. Algo obvio pero debo decirlo.

no entiendo que es ese comando previo

digitalWrite(AtmodePin, HIGH);

o

digitalWrite(AtmodePin, LOW);

eso no hace falta al menos qe recuerde.

Los comandos se obtienen con simples mensajes AT+ALGO no hace falta tocar ningún pin.

Estoy leyendo el post que te sugirieron para ver si ahi existe alguna mencion al respecto.

De acuerdo. Voy a poner los comandos para el módulo de Bluetooth. Pero, tengo una duda con respecto al código. Les muestro una parte de éste:

if (Serial.available())
    {
        c =  Serial.read();

        if (c == '#')
        {
          digitalWrite(AtmodePin, HIGH);
          Serial.print("AT mode ON. $ zeby wyjsc");
        }

        else if (c == '

Lo que no entiendo es para que sirve que se pongan "if(c == '#')" e "if(c == '$')", ¿es necesario que se pongan estas condicionales? ¿Para qué sirven?)
        {
          digitalWrite(AtmodePin, LOW);
          mySerial.print("AT+RESET\n\r");
          Serial.print("AT+RESET\n\r");
        }

else
        {
        Serial.write(c);
        mySerial.write(c);
        }
    }


Lo que no entiendo es para que sirve que se pongan "if(c == '#')" e "if(c == '$')", ¿es necesario que se pongan estas condicionales? ¿Para qué sirven?
digitalWrite(AtmodePin, HIGH);

Esto se usa para poner el modulo bluetooth en modo comandos AT, puede tener un botón o un pin dedicado (ENABLE o WAKUP) o el pin 34 del propio chip tiene que estar en HIGH.

if(c == '#')" e "if(c == '

Estos condicionales entiendo que los has copiado de algún ejemplo, son comandos propios para activar alguna función de tu código , por ejemplo activar o desactivar una luz)


Estos condicionales entiendo que los has copiado de algún ejemplo, son comandos propios para activar alguna función de tu código , por ejemplo activar o desactivar una luz

Vaya.. que molesto, respecto a lo que he visto siempre. Pero siempre se aprende.