勝手な電子工作・・

勝手なオリジナル電子工作に関する記事を書きます

手軽なWiFi信号スキャナー(今時役立つかも)

f:id:a-tomi:20210504204502j:plain

WiFi信号スキャナーをM5スタックで作ったのでご紹介します。

昨年来、住宅地の多くで近隣のWiFiネットワークが混みあってきているのではないかなと勝手に思います。この測定器はすぐできるうえ表示も見やすいのではないかと・・(自画自賛^^)

作った経緯:居間のテレビにつないである小型PCのWiFi通信が、最近ずいぶん遅くなった事に気づきました。ひょっとすると・・と、接続を802.11g(2.4GHz)から 802.11a(5GHz)に変更しました。ルーターから結構遠いので子機(アンテナ)もロッド4本のものに交換しました。これで通信が見違えるほど高速で快適になりました。遅くなっていた原因は、このところのテレワーク急増で付近の2.4GHz帯が混み出したためではないかな・・と考えついたわけでした。

比較的よく飛ぶ2.4GHz帯ですがBluetoothにも邪魔されやすいため、我が家では周辺装置も有線接続にしていますから、きっと周囲からの影響かなと考えたわけです。そこで、すぐでき操作も簡単、ポケットにいれて持ち歩ける測定器を作ったわけでした。

これを試してビックリ。近隣に意外に多くのWiFiルーターが林立しています! 1年前の何倍も多い感じです。PCで行う普段の作業はイーサネット接続なので、気づかなかっただけと思いますが。これでみると日付や時間帯によって登場するルーターの顔ぶれが少し違うようなのも不思議。スマホからのテザリングは見当たりませんので、ひょっとすると不使用時にルーター電源をオフにする方がおられるのでしょうかね?

当地は住宅の特別な密集地でもないのに、冒頭の写真のように20個のWiFiネットワークがひしめき合っています。表示は信号の強さ(dBm=デシベルミリワット)とそのSSIDで、右側にe-cと表示してあるのは各WiFiの暗号化タイプ(Encryption Type)と使用中のチャネル(Channel)番号です。続きの2ページ目を表示すると次です。

f:id:a-tomi:20210504205512j:plain

チャネル11に多く集まっているのは少し不思議なのですが、機種による特徴もありそうですね。

使っているM5スタックは、Espressif社のWiFi&Bluetooth付きマイコンESP32に、LCDやボタン3つ等をつけて大きさ約5cmの正方形に纏め、専用ライブラリーが使えるラクチンなマイコンです。数か月前に秋月電子で3500円で購入したM5 Stack Basicなのですが、今オンラインで覗いて見ると4500円ほどに値上がりしたようです。

さて、プログラムも他のマイコンよりは簡単です。Arduino-IDEで次のように作成しました。

/****************************************************
 * WiFi signal scanner for M5 Stack Basic           *
 *  Initial Version 00 5/4,2021 (c)Akira Tominaga   *
 *  Function:                                       *
 *    Scan 802.11 b/g/n WiFi networks and           *
 *    Show dBm,SSID, Encrypt.type, & channel number.*
 *  Input/Output:                                   *
 *    No external devices.                          *
 *  Revisions:                                      *
 *    (No new versions yet)                         *
 ****************************************************/
#include "M5Stack.h"
#include "WiFi.h"
uint8_t nNW;    		// number of networks
uint8_t nN;     		// NW sequence number

void setup() { // ***** Arduino setup() *****
  M5.begin();
  M5.Lcd.setTextSize(2);
  WiFi.mode(WIFI_STA);  	// station mode
  WiFi.disconnect();    	// clear connections
  delay(100);
}

void loop() { // ***** Arduino loop() *****
#define numL 13        		// # of lines per page
  M5.Lcd.fillScreen(BLACK);    	// clear screen
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setCursor(50, 100);
  M5.Lcd.println("Scanning..");
  nNW = WiFi.scanNetworks();
  if (nNW == 0) { 		// if no network
    M5.Lcd.setCursor(50, 100);
    M5.Lcd.println("No WiFi found");
  } else {      		// if WiFi found
    uint8_t nPages = nNW / numL + 1; // # of pages
    uint8_t lastPlines = nNW % numL; // last page lines
    if (lastPlines == 0) {	// if 0 in last page
      nPages--;			// adjust nPages
    }
    for (uint8_t page = 0; page < nPages; page++) {
      // *** draw page header
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setTextColor(GREEN);
      M5.Lcd.setCursor(0, 0);
      M5.Lcd.print("dBm  ");   // dB mW
      M5.Lcd.print(nNW);       // number of networks
      M5.Lcd.print(" SSIDs page");
      M5.Lcd.print(page + 1);  // page number
      M5.Lcd.print("/");
      M5.Lcd.print(nPages);    // total number of pages
      M5.Lcd.println(" e-c");  // encrypt.type & channel
      // *** draw page body
      if (page == nPages - 1) { // if last page
        for ( nN = page * numL; nN < nNW; nN++) {
          listNW();
        }
      } else {
        for ( nN = page * numL; nN < (page + 1)*numL; nN++) {
          listNW();
        }
      }
      delay(10);
      if (page < nPages - 1) {
        M5.Lcd.setTextColor(GREEN);
        M5.Lcd.println("Button A for next page");
      }
      if (page >= nPages - 1) break;
      while (M5.BtnA.read() == 0) {} // wait A button
    }
  }
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setCursor(0, 224);
  M5.Lcd.println("     Button B to re-scan");
  while (M5.BtnB.read() == 0) {} // wait B button
}

/***********************************************
  User defined function(s)
***********************************************/
// *** listNW() *** list-up detected SSIDs ***
void listNW(void) {
  int8_t dBm = WiFi.RSSI(nN);
  M5.Lcd.setTextColor(WHITE);    // default White
  if (dBm > -50) {	   	 // if strong,
    M5.Lcd.setTextColor(ORANGE); // then Orange
  } else if (dBm > -85) {      // if medium,
    M5.Lcd.setTextColor(YELLOW); // then Yellow
  }
  M5.Lcd.print(dBm); 		// dB milliWatt
  M5.Lcd.print(" ");
  String ss = WiFi.SSID(nN);	// SSID name
  uint8_t sspadlen = 18 - ss.length();
  String space = "             ";
  ss.concat(space.substring(0, sspadlen));
  M5.Lcd.print(ss);		// show SSID
  M5.Lcd.print(WiFi.encryptionType(nN));
  M5.Lcd.print("-");
  M5.Lcd.println(WiFi.channel(nN));
}
// *** end of program

 

M5 Stackは二次電池も内蔵して小さく、ポケットに収まるので持ち歩き使用にも便利ですね。

f:id:a-tomi:20210504205859j:plain

なお、信号強度のdBm(デシベルミリワット)の説明は次の記事の中に書きましたので、もし必要な方はご参照ください。

かんたんにできるWiFi信号レベル表示器(テレワークに便利) - 勝手な電子工作・・

 

今回はごく簡単なご紹介でしたが、皆様のお役に立てば幸いです。

 

©2021 Akira Tominaga, All rights reserved.