Escoger una variable de un wifi scan

Hola!

Estoy haciendo un programa para que un robot autónomo detecte redes wifi y vaya hacia ellas. Soy nueva en esto del arduino y voy bastante perdida.

Básicamente lo que me encuentro es que necesito escoger una wifi del escáner hecho. Me interesa los valores del escáner de solo una de las wifis que detecta. Se que se tiene que hacer algo con "val".

Necesito poder comparar los dos valores de un wifi en concreto para decirle al robot donde tiene que ir. Para hacerlo tengo que saber el valor del primero y después ya compararlo.

¿Alguien sabe como se podria hacer?

Muchas gracias

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Moderador:
Bienvenido al Foro Arduino en Español.
Por favor, lee las Normas del foro.
Tu publicación fue movida porque lo hiciste usando español en el foro en inglés. Mucho mas cuidado para la próxima.

Debes contextualizar mejor tu problema.
Se entiende que quieres hacer pero no dices que piensas usar.
Un MKR1XXX, un ESP?
Necesitas algo que lea las WIFI, hay programas que scanean y te dan el RSSI o sea la calidad de la WIFI recibida.
Ir hacia ella es un tema, que requiere investigación. o no.
Mi primer enfoque simple sería.

  1. Escaneo las WIFIs y determino una por calidad de señal. Entonces
  2. Me muevo a otro sitio y vuelvo a hacerlo. Si la calidad baja es que me alejé, si sube es porque me acerco.
  3. hago esto hasta llegar a cierto punto que no pueda mejorarlo.
    Es simple pero tal vez funcione.

Si perdón, uso una ESP32. Tengo el programa hecho de detectar las redes wifis. Lo que necesito es el valor para cuando me alejo, pueda comparar. No se como escribir el valor en el codigo y usarlo despues.

Este es un tema duplicado en español de Pick a value from a wifi scan and use it after to compare - #13 by UKHeliBob

¿Quieres continuar en inglés o español? No puedes continuar en ambos

Cual es el programa, el que viene en el IDE?
Supongamos que fuera este

#include "WiFi.h"

void setup()
{
    Serial.begin(115200);

    // Set WiFi to station mode and disconnect from an AP if it was previously connected
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);

    Serial.println("Setup done");
}

void loop()
{
    Serial.println("scan start");

    // WiFi.scanNetworks will return the number of networks found
    int n = WiFi.scanNetworks();
    Serial.println("scan done");
    if (n == 0) {
        Serial.println("no networks found");
    } else {
        Serial.print(n);
        Serial.println(" networks found");
        for (int i = 0; i < n; ++i) {
            // Print SSID and RSSI for each network found
            Serial.print(i + 1);
            Serial.print(": ");
            Serial.print(WiFi.SSID(i));
            Serial.print(" (");
            Serial.print(WiFi.RSSI(i));
            Serial.print(")");
            Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
            delay(10);
        }
    }
    Serial.println("");

    // Wait a bit before scanning again
    delay(5000);
}

esta línea tiene tu respuesta, dice la calidad de la señal recibida por cada AP

           Serial.print(WiFi.RSSI(i));

Entonces con un valor por ejemplo asi

int val = WiFi.RSSI(i);

y sabiendo el i porque tienes un loop asi que el i corresponde a un elemento a mostrar.
Con eso puedes actuar.

el programa es este, el que me has dicho.

No es solo el valor el que me interesa, también el nombre de la red wifi. porque de todas solo me interesa una, con su valor.
He visto la funicón del string, puede estar relacionado?

la i representa que es cero

Solo tienes que observar esto
Por alguna razón pone i+1 en el monitor serie pero entonces el 0 es mostrado como 1 pero para tu programación debes tomar el valor escaneado -1.
WiFi.RSSI(i) tiene la calidad de la señal y WiFi.SSID(i) tiene el nombre de la Wifi.
si la elegida fuera la 5 y eso ves en el monitor serie, en realidad tu debes usar i=4

Gracias. Otro apunte es que no se en que numero es la red que quiero, se el nombre pero variaria la posición en el escaner.

Pongamos este escáner. Yo quiero MOVISTAR_561C, pero se que no está quieta. Quiero decir, el valor no siempre sera la cuarta red quizás es la quinta o segunda.

Solo lo que necesito es buscar del scaner una red en concreto, saber y guardar la señal para poder hacer otro escáner y comparar los valores de la señal.

Okay, si ese fuera el caso, quedémosnos con lo que selecciones primero y eso lo guardamos y luego vamos a comparar cada SSID con la seleccionada y cuando tengamos una coincidencia tomamos el RSSI te parece?

si, justamente es el paso que me interesa primero. Como puedo del escáner, extraer solo los datos de una red y su señal.

ya te lo respondí en el post#9
Avancemos porque nada mejor que ponerse a trabajar en algo y ver con qué problemas te encuentras.
Dime como vas a elegir que WIFI usarás, mas alla que sea MOVISTAR_561C, lo decides por teclado, con el celular, ojo como respondes porque implica trabajo extra una u otra respuesta.

La wifi seria mi movil, compartiendo datos., la de iPhone de Nina. Lo pondría en un lugar fijo así que el robot lo tendría que buscar.

Haber, lo que me gustaria hacer es que un robot vaya hacia una senyal wifi (iPhone de Nina) y que a medida que vaya avanzando la señal sea menor. Para hacer esto me interesa la red y señal, y esta para poder comprarla con la primera señal. Se harían varios escáners.

lo que a mi me interesa solo es la señal de iPhone de Nina varias veces para después compararlos y poder decirle si va en dirección correcta o que gire. En si las otras no me importan.

Bueno a ver si te comprendo, no vas a elegir una WIFI, le pondras al sketch que busque tu WIFI Iphone de Nina
Okay.
Hagamos eso entonces, en un momento te paso un primer enfoque a ver como funciona.

#include "WiFi.h"
struct sigoRed {
    String ssid;
    int rssi;
    byte i;
};

sigoRed red = {"iPhone de: Nina",0,0}; // ajusta esto para que se corresponda exactamente con tu SSID

void scaneo_ssid(sigoRed tmp) {
    int n = WiFi.scanNetworks();
    for (int i = 0; i < n; ++i) {
        // Print SSID and RSSI for each network found
        if (tmp.ssid == WiFi.SSID(i)) {
            red.rssi = WiFi.RSSI(i);
            red.i = i;
            // Serial.print(i + 1);
            // Serial.print(": ");
            // Serial.print(WiFi.SSID(i));
            // Serial.print(" (");
            // Serial.print(WiFi.RSSI(i));
            // Serial.print(")");
            // Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
            //Serial.print(WiFi.SSID(i));
            //Serial.printf(" nivel : %d\n", WiFi.RSSI(i));
        }
        delay(10);
    }
   
}

void setup()
{
    Serial.begin(115200);

    // Set WiFi to station mode and disconnect from an AP if it was previously connected
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);

    Serial.println("Setup done");
}

void loop()
{
    //Serial.println("scan start");

    // WiFi.scanNetworks will return the number of networks found
    int n = WiFi.scanNetworks();
    scaneo_ssid(red);
    Serial.print(red.ssid);
    Serial.printf(" nivel : %d\n", red.rssi);
    // Wait a bit before scanning again
    delay(1000);
}

Esto es una estructura que ayuda a llevar todo junto

struct sigoRed {
    String ssid;
    int rssi;
    byte i;
};

imagina un tipo de variable que posee el ssid, el rssi o sea la calidad de la señal y el i que le corresponde, ahora me doy cuenta que el i no tiene importancia.

Lo demás es fácil de entender. Mismo programa solo que lo puse todo con miras a ver donde esta tu SSID y no importan las demas. Luego lo voy a mejorar para que aborte en cuanto lo encuentre para que sea mas rápido.

1 Like

Hola! Lo acabo de provar y la verdad que hace lo que yo quiero.
El siguiente paso seria guardar el valor de la señal para poderlo usar después para comparar.

Bueno, como el objetivo es hacer un robot que vaya hacia tu celular, supongo que ahora dejaría esta parte y me concentraría en algo como mover el robot adelante/atras/derecha/izquierda/parar.
La pregunta es cómo vas a buscar la WIFI? No estoy seguro de la direccionalidad asi que deberías pensar en alguna estrategia que no es la de evitar un obstáculo, sino la de ir hacia el precisamente.
Imagina el problema. Mientras te muevas en un radio RSSI estarás recibiendo mas o menos el mismo valor, asi que eso no te sirve para mover el robot.
Si te sirve Adelante/Atras, incluso girar, para moverte hacia adelante buscando la mejor señal. Si en ese movimiento tus valores decaen quiere decir que te estas alejando del celular, si aumentan te estas acercando.
Crea entonces un sketch con los controles de motor de tu robot y luego veremos como integrar los códigos.
No uses delay() en ningún caso. El delay() del ejemplo es porque estamos haciendo una prueba sin tomar decisiones.

ya tengo los programas de ir hacia delante y girar, no pongo los pins por privacidad no?:


void setup() {
  
  Serial.begin (9600);
  //configuración
  pinMode (enableA, OUTPUT);
  pinMode (motorA1, OUTPUT);
  pinMode (motorA2, OUTPUT);  
  
  pinMode (enableB, OUTPUT);
  pinMode (motorB1, OUTPUT);
  pinMode (motorB2, OUTPUT);  
  
}
void loop() {
  //activamos motor A

  digitalWrite (motorA1, LOW);
  digitalWrite (motorA2, LOW);
  digitalWrite (motorB1, LOW);
  digitalWrite (motorB2, LOW);
  delay (1000);
  
  //Endavant

  digitalWrite (motorA1, LOW);
  digitalWrite (motorA2, HIGH);
  digitalWrite (motorB1, HIGH);
  digitalWrite (motorB2, LOW);
  //Durante 3 segundos
  delay (3000);

  //stop
  digitalWrite (enableA, LOW);
  digitalWrite (enableB, LOW);
  delay (3000);
}

Yo pensava que a partir de la senyal recibida, guardarla y después compararla con otro valor del siguiente scáner. Después hacer dos if, uno que el valor último es mas grande que el primero, seguir recto. Y si es al revés, girar para canviar la ruta.

Recuerda tener siempre el wifi con buena cobertura, para que llegue bien al arduino o sino vas a necesitar un amplificador de wifi para que no haya problemas al realizar la conexión.

1 Like