O circuito permanece verificando as redes WiFi disponíveis e, quando encontrar redes abertas efetua a conexão na que estiver com o melhor sinal.
Quando já conectado, continua verificando se existem redes abertas com um melhor sinal e, caso exista, faz a conexão na nova rede.
Para esse projeto foi utilizado o ESP32 e as informações de conexões de rede são exibidas através da comunicação serial. O led da placa sinaliza quando o circuito está conectado no wifi.
O circuito exibe todas as redes WiFi encontradas. Quanto mais próximo de zero estiver o valor do sinal, melhor sua força. As redes que estiverem com um asterisco (*) são seguras, protegidas por senha.
Neste novo exemplo não foram encontradas nenhuma rede aberta disponível.
Segue o código fonte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /*--------------------------------------------------------- Programa : WIFI SCAN OPEN NETWORKS - ESP32 Autor : Fellipe Couto [ http://www.efeitonerd.com.br ] Data : 03/08/2019 ---------------------------------------------------------*/ #include <WiFi.h> //Biblioteca para utilização do WiFi #define LED_BUILTIN 2 //Led no GPIO 2 no ESP32 String wifiConnected = ""; //Variável para controle do nome da rede conectada /*--- SETUP ---*/ void setup() { Serial.begin(115200); //Inicializa a comunicação serial com taxa de transmissão de 115200 baud rate pinMode(LED_BUILTIN, OUTPUT); //Configura o pino do led } /*--- LOOP PRINCIPAL ---*/ void loop() { //Retorna o nome da rede aberta com melhor sinal String ssid = wifiScanOpenNet(); if (ssid != "" && ssid != wifiConnected) { //Se retornou nome de rede wifi e a rede for diferente da atual, tenta a conexão wifiConnect(ssid); } else if (ssid != "" && ssid == wifiConnected) { //Se retornou nome de rede wifi e a rede for igual a atual, permanece conectado Serial.println("Ja conectado na rede!\n"); } else if (ssid == "" || WiFi.status() != WL_CONNECTED) { //Se não retornou nome de rede wifi ou o status da conexão estiver diferente de conectado WiFi.disconnect(); wifiConnected = ""; digitalWrite(LED_BUILTIN, LOW); } delay(20000); } /*--- VERIFICA REDES WIFI ABERTAS ---*/ String wifiScanOpenNet() { Serial.println("Procurando redes WiFi..."); int countWifi = WiFi.scanNetworks(); //Retorna a quantidade de redes wifi disponíveis int openWifi = 0; //Variável para contar quantas redes abertas foram encontradas String ssid = ""; //Exibe as redes wifi encontradas if (countWifi > 0) { Serial.println(String(countWifi) + " redes encontradas.\n"); delay(500); for (int i = 0; i < countWifi; ++i) { Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(") "); if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN) { Serial.println("*"); } else { Serial.println(); openWifi++; } } } else { Serial.println("Nenhuma rede encontrada."); return ssid; } delay(2000); //Exibe os dados da rede wifi aberta com melhor sinal if (openWifi > 0) { for (int i = 0; i < countWifi; ++i) { if (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) { Serial.println("\nRede aberta com melhor sinal:"); Serial.print("SSID: "); Serial.print(WiFi.SSID(i)); Serial.print("\t\tSINAL: "); Serial.print(WiFi.RSSI(i)); Serial.print("\t\tCANAL: "); Serial.println(WiFi.channel(i)); Serial.println(); ssid = WiFi.SSID(i); break; //Finaliza o loop } } } else { Serial.println("\nNenhuma rede aberta encontrada.\n"); } delay(2000); return ssid; } /*--- EFETUA CONEXÃO COM REDE WIFI ---*/ void wifiConnect(String ssid) { char wifiSSID[50]; ssid.toCharArray(wifiSSID, 50); WiFi.disconnect(); //Fecha conexão aberta WiFi.begin(wifiSSID); //Efetua a conexão com a rede wifi Serial.print("Conectando no WiFi " + ssid + "."); int times = 0; while (WiFi.status() != WL_CONNECTED) { Serial.print("."); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); times++; if (times == 250) break; //Mantém aguardando conexão por 15 segundos delay(100); } if (WiFi.status() == WL_CONNECTED) { wifiConnected = ssid; Serial.println("\nWiFi conectado!\n"); digitalWrite(LED_BUILTIN, HIGH); } else { wifiConnected = ""; Serial.println("\nNao foi possivel conectar.\n"); digitalWrite(LED_BUILTIN, LOW); } } |
Nenhum comentário:
Postar um comentário