NodeMCU en español
NodeMCU - Juan Antonio Villalpando
-- Tutorial de NodeMCU en español --
Volver al índice del tutorial NodeMCU
____________________________
62.- NodeMCU obtiene un listado de los WiFi próximos.
- Con nuestro NodeMCU vamos a obtener un listado de los WiFi cercanos y su potencia. El listado lo veremos en el Serial Monitor.
- Para este código no es necesario conectar nada especial al NodeMCU. Simplemente conectamos el NodeMCU al ordenador y cargamos el código.
- Consultamos el Herramientas / Monitor Serie.
___________________________________________________
1.- Código para obtener un listado de WiFi cercanos y su potencia.
NodeMCU_wifi_cercano.ino |
// Juan A. Villalpando
// KIO4.COM
// Listado de WiFi cercanos.
#include "ESP8266WiFi.h"
void setup() {
Serial.begin(115200);
// Pone el WiFi en modo estación y lo desconecta por si estuviera conectado.
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(2000);
Serial.println("Ahora desconectado.");
}
void loop() {
Serial.println("Localizando redes WiFi cercanas.");
int n = WiFi.scanNetworks();// Localiza WiFis
Serial.println("Completado.");
if (n == 0)
Serial.println("No se ha encontrado ninguna red.");
else
{
Serial.print(n);
Serial.println(" Redes WiFi encontradas");
for (int i = 0; i < n; ++i)
{
// Nombre de red (SSID) y potencia (RSSI).
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(" dBm)");
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
delay(10);
}
}
Serial.println("");
// Nueva búsqueda después de 5 segundos.
delay(5000);
}
|
___________________________________________________
2.- ¿Qué es RSSI?
- Es el indicador de fuerza de la señal recibida (RSSI por las siglas del inglés Received Signal Strength Indicator ). RSSI en la Wikipedia.
- Si una señal tiene un RSSI de -50 dBm, qué potencia tiene.
- El dBm indica la potencia en decibelios referido a 1 mW.
- Para pasarlo a Watios sería
10^(-50/10) * 10^(-3) = 10 nW
___________________________________________________
3.- Obtención de la configuración de red.
- La MAC obtenida del Router se obtiene mediante dos algoritmos pero no coincide con la verdadera.
NodeMCU_wifi_red.ino |
// Juan A. Villalpando.
// KIO4.COM
// Información de la red.
#include <ESP8266WiFi.h>
const char* ssid = "Tu_nombre_de_red_wifi";
const char* password = "La_clave_de_tu_red_wifi";
uint8* mac = WiFi.BSSID(); // MAC del Router
void setup() {
Serial.begin(115200);
delay(10);
// Conecta a la red wifi.
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Conectado con WiFi.");
// Esta es la IP
Serial.print("Esta es la IP asignada al NodeMCU: ");
Serial.print("http://");
Serial.println(WiFi.localIP());
// Máscara de red
IPAddress subnet = WiFi.subnetMask();
Serial.print("Máscara de red: ");
Serial.println(subnet);
// Puerta de enlace (Router):
IPAddress gateway = WiFi.gatewayIP();
Serial.print("Puerta de enlace: ");
Serial.println(gateway);
// Nombre de la red conectada (SSID):
Serial.print("Nombre de la red (SSID): ");
Serial.println(WiFi.SSID());
// MAC del NodeMCU
Serial.print("Esta es la MAC del NodeMCU: ");
byte mac[6];
WiFi.macAddress(mac);
Serial.print(mac[5], HEX);
Serial.print(":");
Serial.print(mac[4], HEX);
Serial.print(":");
Serial.print(mac[3], HEX);
Serial.print(":");
Serial.print(mac[2], HEX);
Serial.print(":");
Serial.print(mac[1], HEX);
Serial.print(":");
Serial.println(mac[0], HEX);
// Fuerza de la señal recibida.
long rssi = WiFi.RSSI();
Serial.print("Fuerza de la senal recibida (RSSI): ");
Serial.print(rssi);
Serial.println(" dBm");
// MAC del Router al que está conectado el NodeMCU
uint8* macr = WiFi.BSSID();
char mac_router[20];
sprintf(mac_router, "%02X:%02X:%02X:%02X:%02X:%02X", macr[5], macr[4], macr[3], macr[2], macr[1], macr[0]);
Serial.print("Esta es la MAC del Router: ");
Serial.println(mac_router);
byte bssid[6];
Serial.print("Esta es la MAC del Router: ");
Serial.print(macr[5],HEX);
Serial.print(":");
Serial.print(macr[4],HEX);
Serial.print(":");
Serial.print(macr[3],HEX);
Serial.print(":");
Serial.print(macr[2],HEX);
Serial.print(":");
Serial.print(macr[1],HEX);
Serial.print(":");
Serial.println(macr[0],HEX);
}
void loop() {
}
|
___________________________________________________
4.- Comprobar si está en funcionamiento.
- No funciona este intento de conexión automática.
void loop() {
////////////////////////////////////////////////////////////
////////////////////// COMPRUEBA SI HA PERDIDO LA CONEXION
if(WiFi.status() != 3){
// Conecta a la red wifi.
Serial.println();
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Conectado con WiFi.");
// Inicio del Servidor web.
server.begin();
Serial.println("Servidor web iniciado.");
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
Serial.println(WiFi.status());
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
- Si está en funcionamiento el WiFi.status = 3
WL_CONNECTED = 3
typedef enum { WL_NO_SHIELD = 255,
// for compatibility with WiFi Shield library
WL_IDLE_STATUS = 0, WL_NO_SSID_AVAIL = 1, WL_SCAN_COMPLETED = 2, WL_CONNECTED = 3, WL_CONNECT_FAILED = 4, WL_CONNECTION_LOST = 5, WL_DISCONNECTED = 6
} wl_status_t;
_____________________________________________
- Reinicio de NodeMcu desde código. Reset.
ESP.reset();
o bien
ESP.restart();
https://github.com/esp8266/Arduino/issues/1722
ESP.reset() is a hard reset and can leave some of the registers in the old state which can lead to problems, its more or less like the reset button on the PC.
ESP.restart() tells the SDK to reboot, so its a more clean reboot, use this one if possible.
________________________________
|