見出し画像

【ESP32プログラム】WiFiに繋げてみよう!①ルータに繋げる方法


ESP32にてWiFiを使う方法は大きく2つあります。
1つはWiFiでルータに接続する方法で、もう1つはESP32自体がアクセスポイントになる方法です。本記事ではESP32のWiFiを使ってルータに接続する方法を紹介します。接続したルータがインターネットに繋がっていれば、そこからESP32をインターネットに参加させ、外部から制御を受けたり、ESP32で取得したセンサデータを外部から参照したり、データベースに保存したりすることができるようになります。

本記事では図1に示すようなシステムを作成します。
パソコンやスマートフォンからルータを介してESP32のLEDをON/OFFできるようにします。
パソコンやスマートフォンから指示はESP32のIPアドレスにブラウザを使ってアクセスすることで、WEBページ上のON/OFFボタンを押すことで切り替えるようにします。

図1 ルーター経由での接続

図2にESP32のLED回路を示します。
GPIO23をON/OFFさせることでLEDを点灯させたり、消灯させたりします。

図2 結線図

プログラム

それではプログラムを紹介します。
実際のプログラムを読んでもらえれば理解できると思いますが、ポイントだけ述べておきます。
ESP32でWiFiを使うには「WiFi.h」ライブラリをインクルードします。
そして、ルータに接続するため、ルータのSSIDとパスワードをプログラム上に記載しておきます。
パソコンやスマートフォンからESP32にアクセスするためにESP32のIPアドレスを取得する必要がありますので、シリアルモニタにIPアドレスを表示させるプログラムも作成します。
また、パソコンやスマートフォンからアクセスするWEBページのHTMLもプログラム上に作っておく必要があります。

#include <WiFi.h>

// WiFiの設定
const char* ssid = "WiFiのSSID"; // 各自のルータのSSIDを記入
const char* password = "WiFiのパスワード"; // 各自のルータのパスワードを記入

// サーバーの設定
WiFiServer server(80);
String header; // HTTPリクエストのヘッダー

// LEDピンの設定
const int ledPin = 23;
bool ledState = LOW;

void setup() {
  // シリアルモニタの初期化
  Serial.begin(115200);
  
  // LEDピンを出力モードに設定
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);

  // WiFi接続
  Serial.println("WiFiに接続中...");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\nWiFiに接続完了!");
  Serial.println("IPアドレス: ");
  Serial.println(WiFi.localIP());

  // サーバーを開始
  server.begin();
}

void loop() {
  WiFiClient client = server.available(); // クライアント接続の確認
  
  if (client) { // クライアントが接続した場合
    Serial.println("クライアントが接続しました");
    String currentLine = ""; // 現在の受信行を保存

    while (client.connected()) {
      if (client.available()) { // データが利用可能か確認
        char c = client.read();
        header += c;
        Serial.write(c);

        // 行が終わった場合
        if (c == '\n') {
          // HTTPリクエストの終了を確認
          if (currentLine.length() == 0) {
            // リクエストに応じてLEDを制御
            if (header.indexOf("GET /LED_ON") >= 0) {
              Serial.println("LED ON");
              ledState = HIGH;
              digitalWrite(ledPin, ledState);
            } else if (header.indexOf("GET /LED_OFF") >= 0) {
              Serial.println("LED OFF");
              ledState = LOW;
              digitalWrite(ledPin, ledState);
            }

            // HTTPレスポンスを送信
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            // HTMLを生成
            client.println("<!DOCTYPE html><html>");
            client.println("<head><title>ESP32 LED Control</title></head>");
            client.println("<body>");
            client.println("<h1>ESP32 LED Control</h1>");
            client.println("<p>LED is currently " + String(ledState ? "ON" : "OFF") + "</p>");
            client.println("<p><a href=\"/LED_ON\">Turn ON</a></p>");
            client.println("<p><a href=\"/LED_OFF\">Turn OFF</a></p>");
            client.println("</body></html>");

            // HTTPリクエストの処理終了
            break;
          } else { 
            currentLine = ""; // 次の行に進む
          }
        } else if (c != '\r') {
          currentLine += c; // 受信した行を追加
        }
      }
    }

    // クライアントを切断
    client.stop();
    Serial.println("クライアントを切断しました");
    
    // ヘッダーのリセット
    header = "";
  }
}

実行してみよう

それではプログラムをコンパイルしてESP32 へ書き込みます。
そして、シリアルモニタを起動するとESP32のIPアドレスが表示されます。
例えば、シリアルモニタには「192.168.0.xxx」というIPアドレスが表示されます。
このIPアドレスをパソコン等に入っているブラウザでアドレスを
「http://192.168.0.xxx/」とすると以下のWEBページが表示されます。

ブラウザの表示(http://192.168.0.***/)

WEBページにはLEDの状態、すなわち点灯もしくは消灯状態が出ています。
その状態表示の下には、「Turn ON」と「Turn OFF」があり、その部分を押すことでLEDを点灯したり、消灯したりすることができます。

購入部品

最新情報「電子工作お買い物一覧」の記事を参照ください。
リンク切対応や代替部品の紹介もしています。


いいなと思ったら応援しよう!