ガイド · 読了まで17分

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分)です。クラスの条件が違う場合は、時間配分を比例させて調整してください。

ESP32のIoTの授業で光を測るのに使うLDR
単元で共通して使うセンサー:2週目に読み取ったLDRの値が、4週目にはスマホで開くWebページに表示されます。

単元のしくみ:感じ取る、つながる、共有する、節電する

モノのインターネット(IoT)の授業で教えるのはインターネットそのものではなく、デバイスがネットワーク上のほかのデバイスとどのように会話するかです。そのためには、まず測るものが必要です。Wi-Fiにはつながっても何も測らないボードには、ネットワーク上で伝えることがありません。だから最初の2週間はあえてWi-Fiを使いません。生徒はボタン、LDR、温湿度センサーを使い、ピンの選び方と読み取り間隔を固めます。3週目にボードがネットワークにつながり、4週目にはサーバーになり、5週目にはほかのサーバーにデータを要求するクライアントに変わり、6週目には出来事をメッセージで知らせます。7週目は、短いIoTワークショップの多くが飛ばしてしまう2つのテーマ、電池の持続時間とセキュリティに充てます。各層は前の層の上に積み上がるので、順番は変えないでください。Wi-Fiの週がうまくいかなかったら、次へ進む前に接続の問題を解決します。

前提条件:単元を始める前に、どのグループも少なくとも1回はESP32にコードを書き込んでいる必要があります。クラスがまだその段階にない場合は、先にESP32の初回授業を行ってください。ドライバ、ボードパッケージ、ポートの問題を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はトルコ語で「値」)。学校にインターネット接続がなくても、この週は成り立ちます。

2週目にセンサーのピンを選ぶときは、Wi-Fiの週を見越しておきます。ESP32のADC2チャンネルにあるピン(GPIO0、2、4、12〜15、25〜27)は、Wi-Fiがオンの間はアナログ読み取りができません。2週目にGPIO4で問題なく動いたポテンショメーターも、4週目にはずっと同じ間違った値を返します。アナログセンサーは最初からADC1のピン(GPIO32〜39)につなぎます。アプリのLDRプロジェクトがGPIO34を使っているのもそのためです。

毎週の授業の骨組み:80分

毎週を同じ骨組みで進めると、生徒は新しい進め方に慣れることではなく、新しい考え方にエネルギーを使えます。2コマを続けて取れるなら以下の流れを1つのブロックとして、取れないなら40分ずつの2つに分けて使います。後者の場合は、1コマ目の終わりに回路を分解せず、組んだまま箱にしまいます。ネットワーク記録は、各グループが付ける1ページの記録です。日付、ボードのIPアドレス、MACアドレス、電波の強さ、出合ったエラーとその解決方法を書きます。3週目以降、デバッグの半分はこの記録を見ながら行います。

時間(分)段階何をするか
0–10ウォームアップ前週のまとめの質問について話し合い、グループはネットワーク記録を開き、箱を配る。
10–20考え方その週の考え方を1つだけ黒板に図で示す。4週目なら、スマホ、ESP32、その間のリクエストとレスポンスの矢印。
20–30コードを読むその週のプロジェクトをプロジェクターで映し、「コードを理解」タブの要約とステップごとの解説を一緒に読み、生徒が出力を予想する。
30–55組み立てと書き込みグループが回路を組み、コードを書き込み、シリアルモニタで最初の出力を確認する。3分以上つまずいているグループには、先生が予備のキットを渡す。
55–701つだけ変える各グループが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つの質問をしてください。

  1. 学校に、2.4 GHzで電波を出し、共通のパスワード1つで接続するネットワーク(WPA2-PSK)はありますか?あれば、授業用のデバイスで使えますか?
  2. ゲストネットワークにキャプティブポータルとクライアント分離はありますか?同じネットワーク上の2台のデバイスは互いにアクセスできますか?
  3. デバイスをMACアドレスで事前に登録する必要はありますか?必要なら、9台のボードのリストをいつまでに提出すればよいですか?
  4. 実習室で、学校のネットワークにつながない別のルーターや、先生のスマホのテザリングを使うことは、学校のルールで認められていますか?
  5. 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という別ファイルに移します。コードはそのファイルが見つかれば、そちらを使います。

C++ (Arduino IDE)
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につながらないとき」の記事でステータスコードの意味を確認してください。

シリアルモニタにIPアドレスが表示されているのにスマホでページを開けない場合、原因はほぼ必ずコードではなくネットワークです。スマホがモバイルデータ通信や別のネットワークにつながっているか、クライアント分離がオンになっています。まずスマホのWi-FiがESP32と同じネットワークにつながっているかを確認し、それでもページが開かなければテザリングに切り替えます。

セキュリティと倫理:飛ばしてはいけない週

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)191〜8週目
USBデータ通信用ケーブル(動作確認済み)1111〜8週目
ブレッドボード(830穴)2181〜8週目
押しボタン2181、6週目
5 mmのLEDと220 Ωの抵抗3 + 330 + 301、3、4週目
LDRモジュール(AO出力付き)192、4、5週目
DHT22温湿度センサー192、8週目
16x2 I2C LCDディスプレイ192〜5週目
0.96インチSSD1306 OLEDディスプレイ(I2C)197週目
PIRモーションセンサー(HC-SR501)とブザー1 + 19 + 96週目
ジャンパーワイヤー(オス・オスとオス・メス)20 + 10約180 + 901〜8週目
2.4 GHzのアクセスポイント(スマホのテザリングまたは別のルーター)―テザリング2台分またはルーター1台3〜8週目
BlueGraysを入れたスマホまたはタブレット181〜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. 1週目:INPUT_PULLUPに設定したピンで、ボタンを押している間digitalRead()は何を返しますか?それはなぜですか?
  2. 2週目:Wi-FiがオンのときにGPIO4につないだポテンショメーターを読み取れないのはなぜですか?どのピンを選ぶべきですか?
  3. 3週目:WiFi.status()が未接続を示しているとき、最初に確認する2つのことは何ですか?
  4. 4週目:ブラウザに入力したIPアドレスが、翌週には違っているかもしれないのはなぜですか?
  5. 5週目:今週のESP32はサーバーでしたか、クライアントでしたか?ステータスコード200と404は何を表していますか?
  6. 6週目:ボットのトークンがスクリーンショットに写り込んだらどうなりますか?MQTTでのブローカーの役割は何ですか?
  7. 7週目:同じ電池で、ESP32は常時動作なら数日、ディープスリープなら数か月動くことがあります。この違いを生むのは何ですか?
  8. 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ディスプレイ付き)
#127上級

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)

このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

4.4(21)
34
ESP32非同期Webサーバー(LCDにIPアドレスを表示)
#129上級

ESP32非同期Webサーバー(LCDにIPアドレスを表示)

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

4.8(16)
26
ESP32でボタンによるLED制御(押している間だけ点灯)
#104初級

ESP32でボタンによるLED制御(押している間だけ点灯)

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

4.6(36)
55
ESP32とLDRモジュールで光の強さを読み取る
#113初級

ESP32とLDRモジュールで光の強さを読み取る

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

4.6(36)
55
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

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

4.8(38)
56
ESP32 HTTPClient+天気API(LCD付き)
#133上級
プレミアム

ESP32 HTTPClient+天気API(LCD付き)

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

4.7(13)
20
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

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

0.0(0)
9
ESP32のディープスリープで節電(OLED + RTC RAMカウンター)
#135上級
プレミアム

ESP32のディープスリープで節電(OLED + RTC RAMカウンター)

ESP32のディープスリープモードは、CPUとほとんどの周辺機器を停止し、消費電流を約10 µAまで抑えます。電池で動くIoT機器に欠かせない機能です。このプロジェクトでは、タイマー(15秒)、外部ピン(EXT0、ボタンはGPIO 33)、タッチ(T0/GPIO 4)の3種類の復帰方法を使います。RTC_DATA_ATTRを付けた変数はディープスリープ中も保持され、起動回数、タイマーによる復帰回数、ボタンによる復帰回数を継続して記録できます。復帰するたびにSSD1306 OLEDディスプレイに復帰理由と回数を表示します。

4.3(10)
16