スマホからLEDを光らせてみよう!
えっ、そんなことできんの?って思うかもしれませんが、できます。
そう、ESP32ならね。
動作原理
ESP32は、Wi-Fiを使って通信することができます。
今回はその機能を使って、Wi-Fiでの通信によってLEDを光らせたり消したりしてみます。
そのためにまずはESP32上でWebサーバーを建てたいと思います。
ESP32上でWebサーバーを建てる
まずは下記コードでESP32上でWebサーバーを建ててみましょう。
#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を起動してみましょう。
あ、もちろん SSID と PASSWORD は自分の環境に合わせてくださいね。
書き込んだら、シリアルモニターを開いてみましょう。
Wi-Fiの設定が正常に行われていれば、IPアドレスが表示されると思います。
じゃあブラウザで開いてみましょう...!
おぉ...
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の処理が行われないので注意してください。
httpHandleRoot
とhttpHandleNotFound
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-Type
がtext/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を光らせてみます!!!
-
あえて区別化するためにこの言い方をしましたが、HTTPサーバーはここではWebサーバーと同じ意味です。何と区別したかというとHTTPSサーバーではデフォルトは
443
番ポートを使用するためです。 ↩