ESP32を家のwifiに繋いでみる。ついでにwifiスキャンも。

Arduino/ESP32ESP32,wifi,スキャン

ブレッドボードが届きましたが、ESP32ボードとブレッドボードだけではまだまだ何も出来ない感じですので、、

ひとまず周辺を整えていこうかと。

そんなわけでまずはESP32に乗っているwifiを使って家のネットワークに参加してみます。

ESP32のwifiライブラリを見ながらちょこっとだけ動かしてみて感じを掴むます。

ざっくりとサンプルを眺めた感じ、WiFi.hをインクルードしておけば大体の機能が使えそうな悪寒。

とりあえず適当に書き進めてみます。

#include <Arduino.h>
// WiFiライブラリをインクルード
#include <WiFi.h>

// 接続先のSSIDとパスワードを設定
// https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiSTA.cpp
//  31文字まで
const char *WIFI_SSID = "XXXXXXXXX-G";
//const char* WIFI_SSID = "XXXXXXXXX-A";    // not support 5Ghz at ESP32...
//  64文字まで
const char *WIFI_PASS = "ZZZZZZZZZZ";

// インスタンス生成
WiFiClass wifi;

void setup()
{
    // put your setup code here, to run once:
    // シリアル通信を開始
    Serial.begin(115200);

    Serial.println("ファームウェアを起動しています。");
    // ちょっと待つ
    delay(3000);

    // 既に接続中なら一旦切る
    //  オートコネクトが有効な場合にはbeginした時に前回設定で再接続してしまう為、いったん切断する
    if (wifi.isConnected())
    {
        Serial.println("既存のコネクションを切断しています。");
        wifi.disconnect();
        delay(3000);
    }

    // wifiモードを設定 ステーションモード
    wifi.mode(WIFI_STA);
    wifi.setAutoConnect(false);

    // wifi通信開始
    //  see WiFiSTAClass https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiSTA.h
    wifi.begin(WIFI_SSID, WIFI_PASS);
    Serial.println("接続中・・・");
    delay(6000); // 6秒待ち

    // 繋がるまでループ
    while (wifi.status() != WL_CONNECTED)
    {
        // 繋がらなかったら
        if (wifi.status() == WL_CONNECT_FAILED)
        {
            Serial.println("wifiに繋がりませんでした。設定を再度確認してください。");
            Serial.println(" Note:ESP32 will Not supported at IEEE 802.11a.");
            Serial.print("SSID:");
            Serial.println(WIFI_SSID);
            Serial.print("Password:");
            Serial.println(WIFI_PASS);
            Serial.print("\n\n");
        }
        Serial.println("接続中・・・ しばらくお待ちください。");
        Serial.println();
        delay(6000);
    }

    Serial.println("ネットワークに接続しました。");
    Serial.println("IP address: ");
    Serial.println(wifi.localIP());
    Serial.println("GW address: ");
    Serial.println(wifi.gatewayIP());
    Serial.println("DNS address: ");
    Serial.println(wifi.dnsIP());
    Serial.println("");
}

void loop()
{
    // put your main code here, to run repeatedly:
    //  お約束
    Serial.println("Hello ESP32! with wifi connection.");

    // wifiのスキャンもしてみる
    int16_t scan_res = wifi.scanNetworks();
    if (scan_res == 0)
        Serial.println("wifi が見つかりませんでした。");
    else
    {
        // 発見したwifiAPを表示
        Serial.print(scan_res);
        Serial.println(" 個の wifi SSID が見つかりました。");
        for (int i = 0; i < scan_res; ++i)
        {
            // SSIDとRSSIをprint
            Serial.print(i + 1);
            Serial.print(":");
            Serial.print(wifi.SSID(i));
            Serial.print("(RSSI:");
            Serial.print(wifi.RSSI(i));
            Serial.print(" dBm)");
            Serial.println("");
        }
    }
    delay(10000);
}

我が家のSSIDとパスフレーズは伏せてあります。

テストするまでESP32は IEEE802.11a に対応しているものと思い込んでおりましたが、どうやら非対応の様で、、残念でした

ついでにwifiのAPを探してみました。

これをコンパイルして、、

ひっそりとVSCodeにしているのは内緒です

しかしこの程度のプログラムで容量を 47.8% も使ってしまっています。

printでunicodeを大量に書いているからでしょうか。

ちゃんと書く時はもっと節約しないとあっという間に容量オーバーですね・・・

しかしコメントとプリント文は癖みたいなもので、なかなか減らすのは難しく

というわけでコンパイルも通りましたのでESP32に転送して動作を確認してみます。

な~んにもエラーが出ないのも不気味ですが

シリアルモニタを立ち上げて・・・

ウチにあるwifiのSSIDは3つ、その内接続中のものは拾わない様ですね。

このためスキャンに現れるのは残りの2つです。

尚、一回目のスキャンでは、我が家のwifi以外のお外から紛れ込んだ様です・・・

ご近所様かな?

ESP-IDFには結構詳細なドキュメントがあるのですが、Arduino core for the ESP32 はリファレンスというリファレンスが見つからないのですが、、

Gitで公開されているライブラリのソースがArduino的に簡潔ですので、ざっくりと眺めるだけで何となく使えそうです。

固定IPでの接続も簡単に出来そうな悪寒。

無線APにもなれるっぽいですので、今度気が向いたら試してみます。