Melhor canal para o WiFi da sua casa: o Arduino e o ESP8266 indicam
Um Arduino e um ESP8266 analisam as redes WiFi B/G visíveis, indicam os canais menos congestionados e em qual deles configurar o seu roteador.
Se você mora em um local com muitas redes WiFi de vizinhos visíveis, você já notou que a qualidade da sua conexão varia em determinados dias e horários? Uma das razões comuns para isso é o congestionamento dos canais WiFi, e hoje veremos uma forma de usar um Arduino com módulo WiFi para diagnosticar a situação e resolvê-la.
Esse congestionamento ocorre porque a maior parte dos equipamentos WiFi já vendidos neste século usam um mesmo conjunto de 11 canais de transmissão alocados na faixa dos 2,4GHz1.
Essa faixa ao redor dos 2,4GHz é internacionalmente reservada para uso de equipamentos industriais, científicos e médicos, e foi adotada pelos padrões WiFi B e G, que até recentemente eram os mais avançados disponíveis no mercado doméstico. Ela também é usada – nem sempre para conexões – por uma variedade de outros equipamentos que você pode ter na sua casa, incluindo fornos de microondas, telefones sem fio, NFC, Bluetooth WPAN e até lâmpadas.
Com só 11 canais, a possibilidade de colisões já é grande – mas o fato de os canais serem sobrepostos entre si a aumenta ainda mais.
O fato de você e seus vizinhos usarem esses mesmos 11 canais sem combinarem entre si faz com que seja frequente o choque entre 2 ou mais redes configuradas para usar um mesmo canal. Como as transmissões de cada uma delas são capazes de chegar até o espaço da rede do vizinho, elas competem entre si, com redução do desempenho e do alcance de todas.
Para piorar o cenário, os 11 canais não são completamente isolados entre si: cada um deles sobrepõe parcialmente 2 canais adjacentes para cada lado. Veja o exemplo do canal 6, no diagrama abaixo – para a esquerda ele sobrepõe (bastante) o canal 5 e (pouco) o canal 4; para a direita, o mesmo acontece com os canais 7 e 8:
Ainda na imagem acima, note que o único conjunto de 3 canais que não se sobrepõem entre si são os 3 marcados em vermelho: canal 1, canal 6 e canal 11. Quando a alocação de canais se concentra nesses 3, é possível obter configurações melhores de isolamento para todos.
O uso do canal não é o único elemento do congestionamento: é necessário considerar a intensidade de cada sinal, expressa na forma de um número (geralmente) negativo cuja unidade é o dBm2. Para a escala de potências oficialmente aceitas para redes WiFi residenciais, o sinal mais forte definido na norma é de 100 µW e corresponde a -10dBm, e sinais abaixo de 100 pW (ou −70 dBm) são considerados fracos.
Uma referência típica para as barrinhas de sinal que você vê no ícone da rede WiFi no seu computador é:
- acima de -50dBm: pleno, 4 barrinhas
- entre -50 e -60dBm: bom, 3 barrinhas
- entre -60 e -70dBm: suficiente, 2 barrinhas
- -70dBm ou menos: fraco, 1 barrinha
Como a potência do sinal é expressa em dBm, que é uma unidade exponencial, cuidados especiais precisam ser tomados nas comparações. Para aplicações como a nossa, muitos aplicativos no mercado convencionam tratar a faixa entre -95dBm e -35dBm como se fosse linear, e isso gera comparações suficientemente precisas para avaliações de canais e posicionamento de roteadores domésticos3. No programa a seguir eu usei uma aproximação logarítmica grosseira4, que dá um resultado um pouco melhor para os casos que eu testei, mas o mero tratamento linear não teria prejudicado as conclusões.
O que veremos neste artigo trata do congestionamento de canais WiFi B/G, mas há outros congestionamentos que você pode querer observar.
Antes de continuar, 2 alertas:
- se você tem um roteador com suporte ao padrão WiFi N, e os seus aparelhos domésticos também são compatíveis com WiFi N, dê preferência a usar esse padrão ;-) O WiFi N usa uma faixa de frequência mais ampla, com menos sobreposição e geralmente bem menos congestionada.
- Tudo o que vimos acima e veremos a seguir é específico sobre a interferência entre redes WiFi, que costuma ser contínua e mais intensa. Mas, como já vimos, outras classes de aparelhos (telefone sem fio, microondas, etc.) também podem ocupar essa mesma faixa quando em uso, e essas interferências não serão medidas ou consideradas usando a técnica aqui descrita.
Como o ESP8266 descreve o ambiente WiFi
Já vimos, no artigo anterior “ESP8266 do jeito simples”, como o Arduino pode enviar ao ESP8266 o comando AT+CWLAP
para que ele responda com uma lista das redes WiFi que ele identificar no momento.
A resposta seria algo como o quadro a seguir:
AT+CWLAP
+CWLAP:(3,"iPad",-75,"ae:cf:5c:98:f2:fa",1)
+CWLAP:(4,"netvirtua304",-88,"28:be:9b:97:3b:b4",1)
+CWLAP:(4,"NetVirtua 404",-92,"e0:ce:c3:dc:50:68",1)
+CWLAP:(4,"Ana-fln",-88,"f8:d1:11:ad:dd:be",1)
+CWLAP:(4,"Wendhausen",-92,"00:1a:3f:8f:87:36",4)
+CWLAP:(3,"RCTEL-BGA2-32585541",-92,"00:27:22:2c:2b:3e",5)
+CWLAP:(4,"CARLSSON",-51,"00:37:b7:3e:b2:e1",9)
+CWLAP:(3,"casablanca",-39,"90:84:0d:dc:f2:31",11)
+CWLAP:(4,"netvirtua22-303",-67,"8c:04:ff:7e:34:a5",11)
+CWLAP:(3,"anafln",-91,"00:1d:d5:e3:94:10",11)
OK
Note que cada linha da resposta começa com +CWLAP:
e é seguida por uma lista entre parênteses.
Além de informar canal e intensidade de sinal, o ESP8266 também exibe o nome, endereço e tipo de criptografia da rede.
Os 5 elementos dessa lista são:
- Segurança: o tipo de criptografia da rede, sendo 1 para WEP, 2 para WPA e 3 para WPA2. O valor 0 indica que a rede não é criptografada.
- SSID: O nome da rede, apresentado entre aspas.
- Potência: O nível do sinal, em dBm.
- MAC: O endereço de rede físico do equipamento.
- Canal: O canal (1 a 11) adotado por aquela rede.
Como você pode notar, os elementos relevantes para a nossa análise são o 3 e o 5: a potência com que o sinal foi detectado pelo ESP8266, e o canal em que esse sinal está sendo transmitido.
Já sabemos que cada canal sobrepõe 4 canais adjacentes (2 para cada lado), e que a ocupação de cada canal em um dado local está relacionada ao nível com que cada sinal chega a esse local.
O programa
Como vimos acima, com os dados de potência de recepção e canal de cada uma das redes visíveis em um dado local, podemos fazer uma distribuição entre os 11 canais e inferir quais estão menos ou mais ocupados, bem como escolher – dentro dos limites dessa inferência – qual o mais disponível para uso.
Também já vimos que há vantagens em preferir o uso dos canais 1, 6 e 11, razão pela qual a escolha acima pode se limitar a esses 3.
O programa a seguir roda no Arduino e busca a lista de canais em um ESP8266 (a montagem física está descrita mais abaixo), fazendo o cálculo e mostrando em um display LCD comum a ocupação de cada canal e a indicação de uso. Você pode levar esse circuito a cada ambiente da sua casa e identificar a situação naquele ambiente5, e a partir daí fazer uma escolha bem informada sobre qual o canal no qual melhor pode configurar seu roteador WiFi B ou G6.
O programa está colorizado para facilitar a explicação que vem a seguir.
const byte CH_PD=5;
const byte RST=6;
int canais[12];
int quantnets=0;
int nivelmax=0;
#include <SoftwareSerial.h>
SoftwareSerial monitorSerial(A1, A0); // RX, TX
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
boolean aguardaResposta(const char *sucesso, unsigned long limite=7000) {
char resp[90];
unsigned long chegada=millis();
unsigned long tempo;
boolean continuar=true;
boolean timeout=false;
int contaChars=0;
while (continuar) {
if (Serial.available()) {
resp[contaChars] = Serial.read();
contaChars++;
monitorSerial.print(resp[contaChars-1]);
if (resp[contaChars-1]==10) { // LF, fim da linha recebida
if (contaChars>1) {
resp[contaChars-2]='