ESP32のIoT授業計画:8週間で学ぶモノのインターネット
ESP32のIoT授業計画。8週間の計画表、学校のネットワークとテザリングの対処法、Wi-FiのWebサーバーのコード、セキュリティと倫理、8グループ分の材料リスト、最終課題のルーブリックを紹介します。
高校や職業教育でESP32のIoT授業計画を立てるときは、単元を4つの層に分けます。まずボードが周囲を感じ取り(GPIOとセンサー)、次にネットワークにつながり(Wi-Fi)、続いてデータを共有し(Webサーバー、HTTPクライアント、メッセージ)、最後に電池で動くことと身を守ることを学びます(ディープスリープとセキュリティ)。週2コマなら、この4つの層は8週間に無理なく収まります。ハードウェアに2週、ネットワークとサーバーに2週、データのやり取りに2週、電源とセキュリティに1週、そして最終プロジェクトの週です。単元の終わりに生徒が提出するのは、センサーを読み取り、その値をスマホで開くページに表示するか、何かが起きたときにスマホへメッセージを送り、電池の持続時間が計算されていて、パスワードがコードの中に丸見えになっていないデバイスです。
この記事は「ESP32の初回授業の計画」の続きです。セットアップ、ドライバ、BOOTボタン、最初のLEDはそちらで扱ったので、ここでは繰り返しません。ここで紹介するのは、週ごとの目標、BlueGraysの実際のプロジェクト、考え方、成果物をまとめた表、毎週80分の授業の骨組み、学校のネットワークがたいていESP32を受け入れない理由とその対処法、ICT担当者に聞く5つの質問、そのままコンパイルできるWi-FiのWebサーバーのコード、セキュリティと倫理、8グループ分の材料リスト、最終プロジェクトの評価基準です。例は次の前提で組み立てました。生徒は24人で、3人ずつ8グループに分かれ、授業は週2コマ(2 × 40分)です。クラスの条件が違う場合は、時間配分を比例させて調整してください。

単元のしくみ:感じ取る、つながる、共有する、節電する
モノのインターネット(IoT)の授業で教えるのはインターネットそのものではなく、デバイスがネットワーク上のほかのデバイスとどのように会話するかです。そのためには、まず測るものが必要です。Wi-Fiにはつながっても何も測らないボードには、ネットワーク上で伝えることがありません。だから最初の2週間はあえてWi-Fiを使いません。生徒はボタン、LDR、温湿度センサーを使い、ピンの選び方と読み取り間隔を固めます。3週目にボードがネットワークにつながり、4週目にはサーバーになり、5週目にはほかのサーバーにデータを要求するクライアントに変わり、6週目には出来事をメッセージで知らせます。7週目は、短いIoTワークショップの多くが飛ばしてしまう2つのテーマ、電池の持続時間とセキュリティに充てます。各層は前の層の上に積み上がるので、順番は変えないでください。Wi-Fiの週がうまくいかなかったら、次へ進む前に接続の問題を解決します。
ESP32で学ぶ8週間のIoT授業計画
表のプロジェクトはどれも、回路図、部品リスト、コードがそろった状態でBlueGraysに用意されています。最初の4週間のプロジェクトは、Wi-Fi接続とWebサーバーのプロジェクトも含めて完全に無料です。5週目以降に使うHTTPクライアント、Telegram、WebSocket、ディープスリープのプロジェクトはプレミアムです。つまり最初の1か月は、どの生徒もプレミアムを必要としません。プレミアムが必要になったときの対応は、この記事の最後にあります。
| 週 | 目標 | BlueGraysのプロジェクト | 考え方 | 成果物 |
|---|---|---|---|---|
| 1週目 | 入力を読み取り、出力を動かす | ESP32でボタンによるLED制御(押している間だけ点灯)、ESP32でボタンによるLED制御(トグル)(無料) | GPIO、INPUT_PULLUP、デジタル入出力、状態を表す変数 | ボタンでオン・オフを切り替えるLEDと、グループのピン配置図 |
| 2週目 | 周囲の環境を測る | ESP32とLDRモジュールで光の強さを読み取る、ESP32 DHT22温湿度計(LCDディスプレイ付き)(無料) | アナログ読み取り(12ビット、0〜4095)、ADC1とADC2、I2C、ライブラリ、読み取り間隔 | シリアルモニタに10回分の光の測定表、LCDに温度と湿度 |
| 3週目 | ボードをネットワークにつなぐ | ESP32 Wi-Fi STA接続(LCDディスプレイ付き)(無料) | Wi-Fiのステーション(STA)モード、SSID、IPアドレス、RSSI(dBm)、WiFi.status()、再接続 | IP、MACアドレス、電波の強さをネットワーク記録に書く |
| 4週目 | ボードをサーバーにする | ESP32非同期Webサーバー(LCDにIPアドレスを表示)(無料)とこの記事のコード | Webサーバー、HTTPのリクエストとレスポンス、ポート80、URLのパス(/、/on、/off) | スマホからLEDを切り替え、光の値を表示するページ |
| 5週目 | ボードをクライアントにする | ESP32 HTTPClient+天気API(LCD付き)、ESP32とNTPでインターネットから正確な時刻を取得(プレミアム) | HTTPクライアント、GETリクエスト、ステータスコード(200、404)、JSON、NTPによる時刻 | インターネットから取得した天気や時刻、隣のグループの測定値の読み取り |
| 6週目 | 出来事をメッセージで知らせる | ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)、ESP32 WebSocketカウンター(2つのボタン+LCD+Webリアルタイム表示)(プレミアム) | 通知、ボットのトークン、HTTPS、WebSocket、パブリッシュ/サブスクライブ(MQTT)の考え方 | 動きを検知するとスマホに届くメッセージ、または自動で更新されるページ |
| 7週目 | 電池で動かし、デバイスを守る | ESP32のディープスリープで節電(OLED + RTC RAMカウンター)(プレミアム) | ディープスリープ、ウェイクアップ要因、RTCメモリ、平均電流、パスワードを別ファイルで管理すること | 電池の持続時間の計算と、パスワードをsecrets.hに移したプロジェクト |
| 8週目 | 最終プロジェクト | グループが選ぶ。たとえばESP32 DHT22温湿度計(LCDディスプレイ付き)と4週目のWebページ | 考え方の組み合わせ、記録、発表 | 動作するデバイス、3分間の発表、ネットワーク記録 |
表について3つの注意点があります。1つ目に、アプリには既製のMQTTプロジェクトがありません。6週目はMQTTを考え方として黒板で説明し(デバイス同士は直接やり取りせず、仲介役のサーバーであるブローカーにトピック付きでメッセージを発行(パブリッシュ)し、関心のあるデバイスがそのトピックを購読(サブスクライブ)する)、実習はTelegramの通知とWebSocketのページで行います。Telegram側の詳細は「ESP32のTelegramボット」の記事にあります。2つ目に、4週目のAsync Web ServerのプロジェクトにはAsyncTCPとESPAsyncWebServerのライブラリが必要です。授業前にすべてのパソコンにインストールしておかないと、コンパイルが最初の行で止まります。3つ目に、5週目の隣のグループとの演習にはインターネットが要りません。グループAのESP32が、グループBが4週目に作ったサーバーの/degerというアドレスを読み取ります(degerはトルコ語で「値」)。学校にインターネット接続がなくても、この週は成り立ちます。
毎週の授業の骨組み:80分
毎週を同じ骨組みで進めると、生徒は新しい進め方に慣れることではなく、新しい考え方にエネルギーを使えます。2コマを続けて取れるなら以下の流れを1つのブロックとして、取れないなら40分ずつの2つに分けて使います。後者の場合は、1コマ目の終わりに回路を分解せず、組んだまま箱にしまいます。ネットワーク記録は、各グループが付ける1ページの記録です。日付、ボードのIPアドレス、MACアドレス、電波の強さ、出合ったエラーとその解決方法を書きます。3週目以降、デバッグの半分はこの記録を見ながら行います。
| 時間(分) | 段階 | 何をするか |
|---|---|---|
| 0–10 | ウォームアップ | 前週のまとめの質問について話し合い、グループはネットワーク記録を開き、箱を配る。 |
| 10–20 | 考え方 | その週の考え方を1つだけ黒板に図で示す。4週目なら、スマホ、ESP32、その間のリクエストとレスポンスの矢印。 |
| 20–30 | コードを読む | その週のプロジェクトをプロジェクターで映し、「コードを理解」タブの要約とステップごとの解説を一緒に読み、生徒が出力を予想する。 |
| 30–55 | 組み立てと書き込み | グループが回路を組み、コードを書き込み、シリアルモニタで最初の出力を確認する。3分以上つまずいているグループには、先生が予備のキットを渡す。 |
| 55–70 | 1つだけ変える | 各グループが1つだけ変更する:更新間隔、ページの文言、しきい値、スリープ時間など。変更内容はネットワーク記録に書く。 |
| 70–80 | まとめ | まとめの質問に書いて答え、回路を分解するか組んだまま箱にしまい、部品を数える。 |
学校のネットワークの現実:ESP32が学校のWi-Fiにつながらない理由
IoTの単元の多くは、コードではなくネットワークのせいでつまずきます。無印ESP32は2.4 GHz帯でしか動かないので、5 GHzだけで電波を出すアクセスポイントはまったく見えません。学校のネットワークは、家庭のネットワークのように共通のパスワード1つで接続するのではなく、ユーザー名とパスワードを使うエンタープライズ認証(WPA2-Enterprise)を使っていることがよくあります。ESP32はコードを追加すればこれに対応できますが、そのためには生徒や先生の個人アカウントのパスワードをコードに書く必要があり、授業では受け入れられません。ゲストネットワークでは、接続後にブラウザで承認ページ(キャプティブポータル)が開きます。画面もブラウザもないESP32はこのページを通過できず、つながっているように見えてもインターネットには出られません。事前に登録したMACアドレスのデバイスしか許可しない学校もあります。最後の落とし穴は、いちばん知られていないものです。ゲストネットワークでは、たいていデバイス同士が互いに切り離されています(クライアント分離)。この場合、ESP32はネットワークにつながってIPアドレスも表示しますが、同じネットワークのスマホからそのアドレスにアクセスできず、4週目のWebサーバーはいつまでも開きません。
| ネットワークの種類 | ESP32はつながるか | Webサーバーの週 | メモ |
|---|---|---|---|
| パスワード1つで接続する2.4 GHzのネットワーク(WPA2-PSK) | つながる | 使える | 家庭のネットワークと同じ。学校では生徒に開放されていることはまれ |
| 5 GHzだけで電波を出すネットワーク | つながらない(まったく見えない) | 使えない | ネットワークの一覧に出てこないときは、まず周波数帯を確認 |
| ユーザー名とパスワードを使うエンタープライズネットワーク(WPA2-Enterprise) | コードを追加すれば技術的には可能 | おすすめしない | 個人アカウントのパスワードをコードに書くことになる |
| 承認ページのあるゲストネットワーク(キャプティブポータル) | つながるがインターネットに出られない | たいてい使えない | ほとんどはクライアント分離もオンになっている |
| スマホのテザリング(インターネット共有) | つながる(2.4 GHzがオンなら) | 使える | 同時に接続できるデバイスの数に限りがある |
| 学校のネットワークにつながっていない、別の2.4 GHzルーター | つながる | いちばんおすすめ | インターネットが必要なら、接続方法をICT担当者と相談 |
対処法:スマホのテザリングか別のルーター
いちばん手っ取り早いのは、先生のスマホのテザリングです。iPhoneでは「インターネット共有」の設定で「互換性を優先」をオンにすると、電波が2.4 GHzに切り替わります。Androidではテザリングの設定で2.4 GHz帯を選びます。この方法ならインターネットにもつながりますが、スマホが同時に受け入れるデバイスの数には限りがあり、8グループに生徒のスマホも加わると、すぐに上限に達します。実用的なルールは次のとおりです。8台のESP32を先生のスマホにつないだ場合、ブラウザを開く8台の生徒のスマホを別のスマホにつないではいけません。スマホとESP32は同じネットワークにいる必要があるからです。そこで3週目と4週目は、1つのテザリングに4グループ、もう1つのテザリングに残りの4グループをつなぎ、各グループは1台のスマホでテストします。
この単元を毎年繰り返すなら、恒久的な対処法はこの授業専用の別の2.4 GHzルーターです。ルーターは学校のネットワークにつながなくても動きます。ESP32とスマホは同じローカルネットワーク上にあるので、3週目と4週目、そして隣のグループとの演習はインターネットなしでできます。インターネットが必要なのは5週目と6週目(天気、NTP、Telegram)だけです。この2週間はテザリングを使うか、ルーターを学校のネットワークにつなぐ方法をICT担当者と一緒に計画します。ネットワーク名とパスワードは学期ごとに変え、ルーターの管理者パスワードも初日に変更します。物理的なネットワークがまったくない場合は、アプリのWi-Fiプロジェクトのコードにある既定のネットワーク名がWokwi-GUESTなので、同じコードをブラウザで動くWokwiシミュレーターでこのネットワークを使って試せます。単元が始まる少なくとも2週間前に、ICT担当者に次の5つの質問をしてください。
- 学校に、2.4 GHzで電波を出し、共通のパスワード1つで接続するネットワーク(WPA2-PSK)はありますか?あれば、授業用のデバイスで使えますか?
- ゲストネットワークにキャプティブポータルとクライアント分離はありますか?同じネットワーク上の2台のデバイスは互いにアクセスできますか?
- デバイスをMACアドレスで事前に登録する必要はありますか?必要なら、9台のボードのリストをいつまでに提出すればよいですか?
- 実習室で、学校のネットワークにつながない別のルーターや、先生のスマホのテザリングを使うことは、学校のルールで認められていますか?
- 5週目と6週目にESP32がインターネットに接続する必要がある場合、ファイアウォールではどの接続が許可されていますか(Webサイト、時刻サーバー、メッセージサービス)?
コード:Wi-Fiにつながり、センサーの値をページに表示するESP32
以下のコードは4週目の中心となるもので、ESP32のボードパッケージに付属するWiFi.hとWebServer.hのライブラリだけを使うため、追加のライブラリは要りません。回路は2週目のままです。LDRモジュールのVCCピンを3V3に、GNDをGNDに、AOをGPIO34につなぎます。GPIO34はADC1にあるので、Wi-Fiがオンでも読み取れます。書き込む前に、AG_ADI(ネットワーク名)とAG_SIFRESI(パスワード)の2つのプレースホルダーを自分の2.4 GHzネットワークの情報に置き換えるか、7週目に行うように、この2行をsecrets.hという別ファイルに移します。コードはそのファイルが見つかれば、そちらを使います。
1// ESP32 Wi-Fi + web sunucu: LDR değerini tarayıcıda göster / ESP32 Wi-Fi + web server: show the LDR value in a browser
2#include <WiFi.h>
3#include <WebServer.h>
4
5// Ağ bilgileri: secrets.h varsa oradan gelir / Network credentials: taken from secrets.h if it exists
6#if __has_include("secrets.h")
7#include "secrets.h"
8#else
9const char* WIFI_SSID = "AG_ADI"; // 2,4 GHz ağın adı / Name of the 2.4 GHz network
10const char* WIFI_PASS = "AG_SIFRESI"; // Ağ şifresi / Network password
11#endif
12
13const int LDR_PIN = 34; // ADC1 pini, Wi-Fi açıkken de okunur / ADC1 pin, still readable while Wi-Fi is on
14
15WebServer server(80); // 80 numaralı portta web sunucu / Web server on port 80
16
17// Ana sayfa: ölçümü HTML olarak gönder / Home page: send the reading as HTML
18void handleRoot() {
19 int raw = analogRead(LDR_PIN); // 0-4095 ham değer / Raw value 0-4095
20 int percent = map(raw, 4095, 0, 0, 100); // Modülde ışık arttıkça değer düşer / On the module the value drops as light rises
21 String html = "<!DOCTYPE html><html><head><meta charset='utf-8'>";
22 html += "<meta name='viewport' content='width=device-width'>";
23 html += "<script>setTimeout(() => location.reload(), 5000);</script>"; // 5 saniyede bir yenile / Reload every 5 s
24 html += "<title>ESP32 Grup 1</title></head><body>";
25 html += "<h1>Isik: %" + String(percent) + "</h1>";
26 html += "<p>Ham deger: " + String(raw) + "</p>";
27 html += "<p>Sinyal: " + String(WiFi.RSSI()) + " dBm</p>";
28 html += "</body></html>";
29 server.send(200, "text/html", html); // 200 = istek başarılı / 200 = request OK
30}
31
32// Yalnız sayıyı döndüren adres / Address that returns only the number
33void handleValue() {
34 server.send(200, "text/plain", String(analogRead(LDR_PIN)));
35}
36
37void setup() {
38 Serial.begin(115200);
39 analogReadResolution(12); // 12 bit: 0-4095
40 WiFi.mode(WIFI_STA); // İstasyon modu: var olan ağa katıl / Station mode: join an existing network
41 WiFi.begin(WIFI_SSID, WIFI_PASS);
42 Serial.print("Baglaniliyor / Connecting");
43 unsigned long start = millis();
44 while (WiFi.status() != WL_CONNECTED && millis() - start < 20000) { // En fazla 20 sn bekle / Wait up to 20 s
45 delay(500);
46 Serial.print(".");
47 }
48 if (WiFi.status() != WL_CONNECTED) {
49 Serial.println("\nBaglanamadi, yeniden basliyor / No connection, restarting");
50 delay(2000);
51 ESP.restart();
52 }
53 Serial.print("\nIP: ");
54 Serial.println(WiFi.localIP()); // Telefonda bu adresi aç / Open this address on the phone
55 server.on("/", handleRoot); // Ana sayfa: IP/ / Home page: IP/
56 server.on("/deger", handleValue); // Yalnız sayı: IP/deger / Number only: IP/deger
57 server.begin();
58}
59
60void loop() {
61 server.handleClient(); // Gelen istekleri karşıla / Serve incoming requests
62}書き込んだら、シリアルモニタを115200ボーで開きます。点の表示が終わるとIPの行が現れます。たとえば192.168.43.57です。ESP32と同じネットワークにつないだスマホでブラウザを開き、このアドレスを入力します。ページには光の割合(%)、生の値、電波の強さが表示され、ページは5秒ごとに自動で再読み込みされます。LDRを手で覆うと割合が下がります。アドレスの末尾に/degerを付けると生の数値だけが返ってきます。5週目には、隣のグループのESP32がHTTPクライアントでまさにこのアドレスを読み取ります。ボードは20秒以内に接続できないと自動で再起動するので、生徒がフリーズしたと思い込むことはありません。いつまでも接続できない場合は、「ESP32がWi-Fiにつながらないとき」の記事でステータスコードの意味を確認してください。
セキュリティと倫理:飛ばしてはいけない週
IoTの授業では、セキュリティを別のスライド資料として教えるのではなく、生徒が自分のコードに加える変更として教えます。この単元の生徒は、すでに3か所で本物の秘密の情報を扱っています。Wi-Fiのパスワード、6週目のボットのトークン、そして自分たちで測ったデータです。7週目の後半を次の5つのテーマに充て、テーマごとに各グループのプロジェクトで具体的な変更を求めます。
- パスワードをコードに直接書かない:Wi-Fiのパスワードとボットのトークンはsecrets.hという別ファイルに移し、コードを共有したりスクリーンショットを撮ったりするときはそのファイルを外します。プロジェクターに映ったコードの1行で、部屋にいる全員がパスワードを知ることになります。
- 初期パスワードを変更する:ルーターの管理画面、ESP32自身のアクセスポイント(AP)モード、既製のサンプルコードにあるパスワードは、誰もが知っている値です。授業用ルーターのパスワードは初日に変更し、生徒にもプロジェクトにサンプルのパスワードを残さないよう求めます。
- ページはネットワーク上の全員に開かれている:この記事のWebサーバーにはログイン画面がありません。同じネットワークにいる人なら、アドレスを知っていれば誰でもページを開けますし、/onのアドレスがあるプロジェクトならLEDを切り替えることもできます。そのため授業でWeb経由で操作するのは、LED、ブザー、ディスプレイのような害のない出力だけにします。商用電源につながるリレーは、この単元では使いません。
- 個人データの収集:温度や光は個人データではありませんが、廊下を人が通った時刻を記録する人感センサーや、カメラ、マイクは個人データになりえます。最終プロジェクトのアイデアが人の動き、声、映像を記録するものなら、まずクラスで「誰が見るのか、どのくらいの期間保存するのか、許可は得たのか?」に答えさせます。
- 更新と責任:インターネットにつながるデバイスは、一度設定したら忘れてよいものではありません。単元の終わりに授業用ルーターの電源を切り、ボットのトークンを無効にし、ボードをリセットするところを生徒に見せ、デバイスの寿命全体を通して誰が責任を持つのかを話し合います。
材料リスト:1グループあたりと8グループ分
リストは生徒24人、3人ずつ8グループを想定しています。予備1セットを含めて9セットあれば十分です。部品の多くは最初の週に購入し、その後の週でも使い回します。たとえばLCDは2週目から5週目までの4つのプロジェクトで使います。はんだ付けは不要です。I2C LCDやOLEDのようなモジュールはオス・メスのジャンパーワイヤーでつなぎます。LDRモジュールの代わりにLDR単体を使う場合は、各グループに10 kΩの抵抗を1本加え、2週目に分圧回路を一緒に組みます。
| 材料 | 1グループあたり | クラス分(8グループ + 予備1) | 使う週 |
|---|---|---|---|
| ESP32 DevKit(30ピン、ESP32-WROOM-32) | 1 | 9 | 1〜8週目 |
| USBデータ通信用ケーブル(動作確認済み) | 1 | 11 | 1〜8週目 |
| ブレッドボード(830穴) | 2 | 18 | 1〜8週目 |
| 押しボタン | 2 | 18 | 1、6週目 |
| 5 mmのLEDと220 Ωの抵抗 | 3 + 3 | 30 + 30 | 1、3、4週目 |
| LDRモジュール(AO出力付き) | 1 | 9 | 2、4、5週目 |
| DHT22温湿度センサー | 1 | 9 | 2、8週目 |
| 16x2 I2C LCDディスプレイ | 1 | 9 | 2〜5週目 |
| 0.96インチSSD1306 OLEDディスプレイ(I2C) | 1 | 9 | 7週目 |
| PIRモーションセンサー(HC-SR501)とブザー | 1 + 1 | 9 + 9 | 6週目 |
| ジャンパーワイヤー(オス・オスとオス・メス) | 20 + 10 | 約180 + 90 | 1〜8週目 |
| 2.4 GHzのアクセスポイント(スマホのテザリングまたは別のルーター) | ― | テザリング2台分またはルーター1台 | 3〜8週目 |
| BlueGraysを入れたスマホまたはタブレット | 1 | 8 | 1〜8週目 |
評価:最終プロジェクトの評価基準
最終プロジェクトのルールはシンプルにします。センサー1つ、Wi-Fi接続1つ、共有の方法1つ(Webページかメッセージ)です。グループは6週目の終わりにアイデアを1文で書き、7週目に部品リストを作り、8週目の1コマ目で組み立て、2コマ目で3分ずつ発表します。採点は以下の6つの観点で行います。各観点1〜3点、合計18点です。ルーブリックの全体的な考え方、提出シート、ポートフォリオについては、「Arduinoプロジェクト評価のルーブリック」の記事のテンプレートをそのまま使えます。
| 観点 | 1:初歩 | 2:発展途上 | 3:到達 |
|---|---|---|---|
| センサーと回路 | 回路は組んだが、値が出ないか意味のない値 | 値は読み取れるが、ピンを選んだ理由を説明できない | 値を正しく読み取り、ADC1やデジタルピンを選んだ理由を説明できる |
| Wi-Fi接続 | 先生の助けがあるときだけつながる | つながるが、接続が切れるとデバイスが止まる | つながり、切れても再接続し、IPと電波の強さを記録している |
| データの共有 | データはシリアルモニタにあるだけ | ページやメッセージはあるが、手で更新したり送信したりする必要がある | ページが自動で更新されるか、出来事が起きるとメッセージが自動で送られる |
| 電源への意識 | デバイスがどれだけ電流を消費するか誰も知らない | 電池の持続時間を計算したが、スリープを考えていない | スリープと起動の間隔を入れて計算し、結果を解釈している |
| セキュリティと倫理 | パスワードがコードの中に丸見え | パスワードはsecrets.hにあるが、データについて話し合っていない | パスワードは別ファイルにあり、集めるデータと誰が見るかを文書にしている |
| 記録と発表 | ネットワーク記録が不完全で、発表は動作を見せるだけ | ネットワーク記録はあるが、出合ったエラーを説明していない | ネットワーク記録が完全で、発表でエラー1つとその解決方法を説明している |
毎週のまとめの質問と単元前のチェックリスト
- 1週目:INPUT_PULLUPに設定したピンで、ボタンを押している間digitalRead()は何を返しますか?それはなぜですか?
- 2週目:Wi-FiがオンのときにGPIO4につないだポテンショメーターを読み取れないのはなぜですか?どのピンを選ぶべきですか?
- 3週目:WiFi.status()が未接続を示しているとき、最初に確認する2つのことは何ですか?
- 4週目:ブラウザに入力したIPアドレスが、翌週には違っているかもしれないのはなぜですか?
- 5週目:今週のESP32はサーバーでしたか、クライアントでしたか?ステータスコード200と404は何を表していますか?
- 6週目:ボットのトークンがスクリーンショットに写り込んだらどうなりますか?MQTTでのブローカーの役割は何ですか?
- 7週目:同じ電池で、ESP32は常時動作なら数日、ディープスリープなら数か月動くことがあります。この違いを生むのは何ですか?
- 8週目:自分たちのデバイスはどんなデータを集め、誰が見られて、どのくらいの期間保存されますか?
- 単元の2週間前:ICT担当者に5つの質問をし、答えに応じてテザリングかルーターかを決める。
- 単元の2週間前:ボードを数え、各ボードのMACアドレスをラベルに書く(登録が必要ならリストをICT担当者に渡す)。
- 単元の1週間前:すべてのパソコンにESP32のボードパッケージと、DHT、LiquidCrystal I2C、AsyncTCP、ESPAsyncWebServerのライブラリをインストールし、ボード1台でテストする。
- 単元の1週間前:テザリングを2.4 GHzに設定し、ネットワーク名とパスワードを変更し、ESP32を1台つないでスマホからそのページを開く。
- 単元の1週間前:グループごとにネットワーク記録のページをコピーし、センサーとLCDをテストしてから箱に入れる。
- 5週目の前:プレミアムのプロジェクト用のコードを用意し、生徒のどの情報が共有されるかを伝える。
単元の中でのBlueGraysの使いどころ
- ESP32のプロジェクト:「発見」›「プロジェクト」の「絞り込み」でプラットフォームにESP32を選びます。Wi-Fi接続からディープスリープまで、約50件のESP32プロジェクトがあります。どのプロジェクトにも回路図、数量付きの部品リスト、コピーできるソースコードがあります。パソコンでコードを開くには「リンクをコピー」が便利です。
- 「コードを理解」:毎週20〜30分目はこのタブを使います。「このコードの働き」の要約、「ステップごとの解説」、「困ったときは」、「自分で試す」の課題です。最初の4週間のプロジェクトでは無料で、プレミアムのプロジェクトではプレミアムで利用できます。
- ピン配置ツール:「ピン配置」ツールでESP32のピンを選ぶと、その種類と注意点が表示されます。ADC2のピンを選ぶとWi-Fiがオンの間はアナログ読み取りができないこと、ADC1のピンを選ぶとWi-Fiがオンでも読み取れることが示されます。2週目にピンを選ぶとき、プロジェクターに映すのに最適です。ピン配置はプレミアムのツールです。
- 電池の持続時間ツール:「電池の持続時間」ツールで既製のプロファイル「ESP32・ディープスリープ」を選びます。電池の容量、動作中の電流と時間、スリープ中の電流と周期を入力すると、推定動作時間と平均電流が計算されます。7週目の「常時動作とスリープの比較」はこの画面で行います。このツールはプレミアムで、無料ユーザーは計算例を見られます。
- 教育者向けパッケージ:5週目からはプレミアムのプロジェクトが必要なので、グループごとに1つのアカウントをプレミアムにします。8グループと先生の分は、年額の10個パックでまかなえます。1回限りの支払いで自動更新はなく、生徒はカードを登録しません。各コードを誰が使ったかは「マイコード」で確認でき、コードを次の学期のグループに移行することもできます。5週目の1コマ目に配る30日間の1か月コードでは、最後の4週間をぎりぎりカバーするだけで、途中に休みが入ると足りなくなります。詳しくは「クラス向けプレミアムコード」の記事をご覧ください。
8週間が終わると、生徒の手元にあるのは動作するデバイスだけではありません。デバイスがネットワーク上でどう会話するのか、なぜつながらないのか、どれだけのエネルギーを使うのか、誰のデータを集めているのかを考える習慣が身についています。それこそが職業教育で求められているものです。各週のプロジェクト、回路図、「コードを理解」の解説を授業前に確認しておきたい場合は、BlueGraysアプリでESP32の絞り込みを開くだけです。
よくある質問
ESP32のIoTの授業は何週間かけるべきですか?
週2コマなら、センサーとWi-FiからWebサーバー、通知、ディープスリープまで、IoTの基本的な考え方を学ぶには8週間で十分です。週1コマしかない場合は、同じ計画を12〜14週間に延ばすか、5週目と6週目を1週にまとめます。最終プロジェクトには少なくとも丸1コマを充ててください。
学校のWi-FiがなくてもESP32のIoTの授業はできますか?
はい。ESP32とスマホが同じローカルネットワーク上にあれば、Webサーバーやデバイス間のリクエストにインターネットは要りません。先生のスマホの2.4 GHzのテザリングか、学校のネットワークにつながっていない別のルーターがあれば十分です。インターネットが必要なのは、天気、時刻、Telegramのような外部サービスを使うときだけです。
ESP32が学校のWi-Fiにつながらないのはなぜですか?
無印ESP32は2.4 GHzでしか動かないため、5 GHzだけで電波を出すネットワークはまったく表示されません。学校のネットワークでは、ユーザー名とパスワードを使うエンタープライズ認証やブラウザのキャプティブポータルがよく使われ、登録済みのMACアドレスしか許可しないところもあります。こうした場合は、テザリングか別のルーターを使うのがいちばん実用的です。
スマホからESP32のWebサーバーを開けないのはなぜですか?
いちばん多い原因は、スマホがESP32と同じネットワークにつながっていないことです。モバイルデータ通信や別のWi-Fiネットワークにつながっている可能性があります。2つ目の原因はゲストネットワークのクライアント分離で、同じネットワーク上のデバイス同士が互いにアクセスできません。スマホとESP32を同じテザリングにつないだ状態で、シリアルモニタに表示されたIPアドレスをもう一度試してください。
IoTの授業でMQTTを教える必要はありますか?
必須ではありませんが、考え方として説明しておくべきです。実際のIoTシステムの多くは、デバイスがブローカーを介してトピックごとにメッセージをやり取りするこのモデルを使っているからです。8週間の単元なら、まずHTTPでクライアントとサーバーの関係を固め、6週目にMQTTをパブリッシュ/サブスクライブの考え方として紹介すれば十分です。
BlueGraysのESP32プロジェクトは無料ですか?
一部は無料です。ボタン、LDR、DHT22、Wi-Fi接続、Async Web Serverなど、この計画の最初の4週間で使うプロジェクトは完全に無料です。HTTPクライアント、Telegram、WebSocket、ディープスリープのプロジェクトはプレミアムです。クラスで使う場合は、「プロフィール」画面の「教育者向けパッケージ」からまとめてコードを購入できます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

ESP32非同期Webサーバー(LCDにIPアドレスを表示)
このプロジェクトでは、ESP32を同じWi-Fiネットワーク上のスマートフォンやパソコンから操作できる非同期Webサーバーにします。ESPAsyncWebServerライブラリを使うと、従来のWebServer.hのように1つのリクエストで処理がブロックされず、複数のリクエストを同時に処理できます。ブラウザーでESP32のIPアドレスを開き、ON/OFFボタン(/onと/offのルート)を押すと、GPIO 5に接続したLEDを点灯・消灯できます。

ESP32でボタンによるLED制御(押している間だけ点灯)
ボタンを押している間はLEDが点灯し、離すと消灯します。ESP32のデジタル入力ピンと内蔵プルアップ抵抗の使い方を学びます。INPUT_PULLUPモードを使うため、外付け抵抗は不要です。

ESP32とLDRモジュールで光の強さを読み取る
LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

ESP32 DHT22温湿度計(LCDディスプレイ付き)
DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

ESP32 HTTPClient+天気API(LCD付き)
このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

ESP32のディープスリープで節電(OLED + RTC RAMカウンター)
ESP32のディープスリープモードは、CPUとほとんどの周辺機器を停止し、消費電流を約10 µAまで抑えます。電池で動くIoT機器に欠かせない機能です。このプロジェクトでは、タイマー(15秒)、外部ピン(EXT0、ボタンはGPIO 33)、タッチ(T0/GPIO 4)の3種類の復帰方法を使います。RTC_DATA_ATTRを付けた変数はディープスリープ中も保持され、起動回数、タイマーによる復帰回数、ボタンによる復帰回数を継続して記録できます。復帰するたびにSSD1306 OLEDディスプレイに復帰理由と回数を表示します。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

