0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

○○作ってみない?Advent Calendar 2023

Day 6

マイコン使って「IoT機器でも作ってみない?」2日目

Last updated at Posted at 2023-12-05

スマホからLEDを光らせてみよう!

えっ、そんなことできんの?って思うかもしれませんが、できます。
そう、ESP32ならね。

動作原理

ESP32は、Wi-Fiを使って通信することができます。
今回はその機能を使って、Wi-Fiでの通信によってLEDを光らせたり消したりしてみます。
そのためにまずはESP32上でWebサーバーを建てたいと思います。

ESP32上でWebサーバーを建てる

まずは下記コードでESP32上でWebサーバーを建ててみましょう。

main.ino
#include <WiFi.h>
#include <WebServer.h>

WebServer server(80);

const char* ssid = "SSID";
const char* password = "PASSWORD";

void setup() {
  // Serial Initialize
  Serial.begin(115200);
  Serial.println("Serial init");

  // WiFi Initialize
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // WebServer Initialize
  server.on("/", httpHandleRoot);
  server.onNotFound(httpHandleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void httpHandleRoot() {
  server.send(200, "text/html", "<h1>ESP32 Web Server</h1><div>" + (String)(millis() / 1000) + " seconds elapsed since ESP32 was started.</div>");
}

void httpHandleNotFound() {
  server.send(404, "text/html", "<h1>404 Not Found</h1>");
}

これを書き込んで、ESP32を起動してみましょう。
あ、もちろん SSIDPASSWORD は自分の環境に合わせてくださいね。

書き込んだら、シリアルモニターを開いてみましょう。
Wi-Fiの設定が正常に行われていれば、IPアドレスが表示されると思います。

じゃあブラウザで開いてみましょう...!

おぉ...

IMG_4550.png

4 seconds elapsed since ESP32 was started.(ESP32が起動してから4秒経過)と表示されていますね。
これはさっきのvoid httpHandleRoot()で書いた文字が表示されていますね!

ちょっと解説

setup

#include <WiFi.h>
#include <WebServer.h>

WebServer server(80);

const char* ssid = "SSID";
const char* password = "PASSWORD";

まずは、WiFiとWebServerのライブラリをインクルードしています。

そして、WebServerのインスタンスを生成しています。
server(80)80はポート番号です。HTTPサーバー1はデフォルトで80番ポートを使用します。

そして最後に接続するWi-FiのSSIDとパスワードを設定しています。

setup

// WiFi Initialize
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
  Serial.print(".");
  delay(500);
}
Serial.println();
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());

// WebServer Initialize
server.on("/", httpHandleRoot);
server.onNotFound(httpHandleNotFound);
server.begin();
Serial.println("HTTP server started");

まずはWi-Fiを初期化しています。
WiFi.begin(ssid, password)でWi-Fiを初期化しています。(多分接続もしてる)
そしてwhile (WiFi.status() != WL_CONNECTED)でWi-Fiの接続状態を確認しています。
WL_CONNECTEDはWi-Fiが接続されている状態を表しており、Wi-Fiが接続されるまでwhileの中の処理を繰り返します。

そして、Wi-Fiが接続されたらWiFi.localIP()でIPアドレスを取得し、シリアルモニターに表示しています。

次にWebServerを初期化しています。
server.on("/", httpHandleRoot)/というパスにアクセスされたときにhttpHandleRootという関数を呼び出すように設定しています。
server.onNotFound(httpHandleNotFound)で存在しないパスにアクセスされたときにhttpHandleNotFoundという関数を呼び出すように設定しています。
そしてserver.begin()でWebServerを起動しています。

loop

server.handleClient();

loopではserver.handleClient()を呼び出しています。
これはWebServerの処理を行うための関数です。
これを呼び出さないとWebServerの処理が行われないので注意してください。

httpHandleRoothttpHandleNotFound

void httpHandleRoot() {
  server.send(200, "text/html", "<h1>ESP32 Web Server</h1><div>" + (String)(millis() / 1000) + " seconds elapsed since ESP32 was started.</div>");
}

void httpHandleNotFound() {
  server.send(404, "text/html", "<h1>404 Not Found</h1>");
}

これらはserver.onで設定した関数ですね。
httpHandleRoot/というパスにアクセスされたときに呼び出されます。
httpHandleNotFoundは存在しないパスにアクセスされたときに呼び出されます。

server.sendはWebServerからレスポンスを返すための関数です。
server.send(200, "text/html", "<h1>ESP32 ... started.</div>");は、ステータスコード200(OK)、Content-Typetext/html<h1>ESP32 ... started.</div>という文字列をレスポンスとして返すという意味です。

<h1>ESP32 ... started.</div>

これにはHTMLが使用されています。
HTMLについて知らない人はこのアドベントカレンダーの1日目の記事から見直してください。

今回、秒数表示をするのに(String)(millis() / 1000)という式を使っています。

まず、"A" + "B"とすると"AB"という文字列になります。
これは2つの文字を結合しているからです。

次に、(String)(millis() / 1000)ですが、millis()はArduinoの起動からの経過時間をミリ秒で返します。
なので、millis() / 1000は秒数を返します。(え、なんで?こうだからだよ

そして、(String)String型に変換するためのキャストです。(キャストを知らない?これが参考になるよ
String型はArduinoにおいて文字列を表す型です。
そのため、3つの文字を結合できて、起動してからの秒数を表示できるってわけ。

ちょっと解説終わり

というわけで、ESP32上でWebサーバーを建てることができました。

じゃあスマホからLEDを...え、時間?

そうです、時間がないので今回はここまでです。
次回は!!!ちゃんと!!!スマホからLEDを光らせてみます!!!

  1. あえて区別化するためにこの言い方をしましたが、HTTPサーバーはここではWebサーバーと同じ意味です。何と区別したかというとHTTPSサーバーではデフォルトは443番ポートを使用するためです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?